Linux 网络配置重启后失效的原因

11次阅读

ip addr add 配置的 ip 重启后消失是因为该命令仅修改内核运行时状态,不写入任何持久化配置文件;debian/ubuntu 应写入 /etc/network/interfaces,rhel/centos 8+ 应用 nmcli 或 netplan,且 netplan 的 yaml 缩进和格式必须严格正确。

Linux 网络配置重启后失效的原因

为什么 ip addr add 配置的 IP 重启后就没了

因为 ip addr add 是纯内存操作,改的是内核网络栈的运行时状态,不写入任何持久化配置文件。系统一重启,内核重载,所有临时配置清空。

常见错误现象:ip addr show 能看到 IP,reboot 后消失;或者 systemctl restart networking(Debian/Ubuntu)也失效——说明你没走对持久化路径。

  • 使用场景:临时调试、CI 环境快速配网、容器宿主机手动测试
  • 它和 ifconfig 一样,只作用于当前会话,别指望它扛过 reboot
  • 没有“参数开关”能让它持久,硬加 --permanent 或类似选项都是错的(那不是这个命令的功能)

Debian/Ubuntu 持久化该写进 /etc/network/interfaces

这是传统 ifupdown 工具链的配置入口,systemctl restart networking 读的就是它。新装的 Ubuntu 22.04+ 默认不用这套,但只要没卸载 ifupdown,它就依然生效且优先级高于 Netplan(除非你明确禁用)。

示例(给 eth0 配静态 IP):

auto eth0 iface eth0 inet static     address 192.168.1.100     netmask 255.255.255.0     gateway 192.168.1.1
  • 必须用 auto 行声明接口启动,否则 ifup eth0 都不会触发
  • iface xxx inet dhcp 写法才走 DHCP;写成 inet static 才走下面的 address
  • 改完要执行 sudo ifdown eth0 && sudo ifup eth0 测试,别直接 reboot
  • 如果系统同时启用了 Netplan(如 Ubuntu 18.04+ 默认),两个配置冲突会导致 networking 服务启动失败,journalctl -u networking 里能看到“interface already configured”类错误

CentOS/RHEL 8+ 用 /etc/sysconfig/network-scripts/ifcfg-xxx 还是 Netplan?

RHEL 8+ 和 CentOS Stream 默认弃用 ifcfg-*,转而通过 NetworkManager + keyfileNetplan(若装了)管理。但很多用户仍习惯改 ifcfg-eth0,结果 nmcli connection reload 不生效、systemctl restart network 报错“Failed to start network.service”。

  • 真实情况:network.service 在 RHEL 8+ 是被 mask 掉的,systemctl unmask network 并不能安全启用它
  • 正确做法是用 nmcli:比如 nmcli connection modify "System eth0" ipv4.addresses 192.168.1.100/24,再 nmcli connection down "System eth0" && nmcli connection up "System eth0"
  • 如果非要写文件,得用 /etc/NetworkManager/system-connections/ 下的 keyfile(格式类似 ini),而不是 ifcfg;手写容易少 [connection] id=xxx 导致加载失败
  • nmcli connection show 是唯一可信的“当前生效配置”来源,ip addr 只反映结果,不反映来源

Netplan 配置写错一个缩进,整个网络就起不来

Netplan 是 YAML 格式,缩进即语法。少一个空格、混用 tab、冒号后没空格——都会导致 netplan apply 失败,且错误提示极其简陋:Invalid YAML at //etc/netplan/01-network-manager-all.yaml line 12 column 3: did not find expected key

  • 必须用空格缩进,严禁 tab;推荐用 2 空格,和官方示例一致
  • 所有键名后必须跟 : + 一个空格,比如 addresses: 不是 addresses:(后面没空格)或 addresses: (多一个空格也不行)
  • 修改后先运行 sudo netplan generate,它会把 YAML 编译成 NetworkManager 或 systemd-networkd 的中间配置,出错就停在这步,比 apply 安全
  • 如果用了 renderer: NetworkManager,但系统没装 NetworkManager 包,netplan apply 会静默失败,ip link 看不到接口 UP,得查 journalctl -u systemd-networkdjournalctl -u NetworkManager

最麻烦的点在于:不同发行版默认 renderer 不同,同一份 YAML 在 Ubuntu 上跑 NetworkManager,在 Debian 上可能被 systemd-networkd 解析——行为差异藏在底层,不看 cat /etc/netplan/*.yaml | grep renderer 根本意识不到。

text=ZqhQzanResources