静态 IP 的配置方式会因发行版和网络管理工具不同而差别很大。这里只讨论 Ubuntu/Debian 与 RHEL/CentOS 两条常见路径,重点落在 netmask、网关和“永久生效”这三个容易被忽略的环节上。动手前先做判断,再按系统分头处理,最后统一验证。
先别急着改配置,确认地址从哪来
先用 ip addr 或 ipconfig(视发行版而定)查看当前网卡名称和已有地址,判断是否已启用 DHCP。若输出中 Interface 或 inet 条目带有 dynamic 字样,说明地址由 DHCP 分配,后续手动配置需要通过修改对应配置文件并禁用该接口的 DHCP 客户端,否则重启后地址可能被覆盖。
这一步不能省。很多“配置完不生效”的问题,其实是 NetworkManager、systemd-networkd 和传统 networking 服务在抢同一块网卡。执行 systemctl status NetworkManager、systemctl status systemd-networkd、systemctl status networking,先确认当前哪个服务在管接口。以 Ubuntu 22.04 为例,默认通常是 networkd 配合 netplan;以 CentOS 7 为例,则多是 NetworkManager。判断错了,后续改动可能被其他服务覆盖。
Ubuntu/Debian:netplan 先 try,再 apply
在 Ubuntu/Debian 系中,编辑 /etc/netplan/*.yaml。先备份原文件,再在网卡段落里将 dhcp4 显式设为 no,并缩进正确的 addresses、routes、nameservers 字段。写完后执行 sudo netplan try 常驻测试,确认网络可通后再 apply,避免因为格式错误导致远程连接断开。
下面是一份常见示例,注意 addresses 使用 CIDR 写法,netmask 不再单独写 255.255.255.0,而是写成 /24:
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses:
- 192.0.2.10/24
routes:
- to: default
via: 192.0.2.1
nameservers:
addresses:
- 1.1.1.1
netplan try 会等待你确认,通常有 120 秒倒计时。如果 SSH 连接在等待期间断开,倒计时结束后配置会自动回滚;如果手动按 Ctrl+C 中断,不同版本的回滚行为不完全一致,建议观察终端是否出现 rollback 提示,再决定是否重新执行。确认网络正常后,按回车即可应用。
确认 apply 后,再检查 /etc/netplan/*.yaml 的权限,通常建议 600。权限过宽不会导致配置失效,但安全扫描会报问题。
RHEL/CentOS:ifcfg 文件靠 ONBOOT 保证重启后生效
对于 RHEL/CentOS 等使用 ifcfg 文件的系统,在 /etc/sysconfig/network-scripts/ifcfg-eth0 中写入 BOOTPROTO=none、IPADDR、NETMASK、GATEWAY、DNS1。关键一步是确保 ONBOOT=yes,否则重启后接口不会启动。写完后执行 nmcli con reload(若由 NetworkManager 管理),再执行 nmcli con up eth0,并检查是否出现配置冲突。
一个完整的 ifcfg 示例,以 eth0 为例:
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.0.2.10
NETMASK=255.255.255.0
GATEWAY=192.0.2.1
DNS1=1.1.1.1
这里 BOOTPROTO=none 表示禁用 DHCP,NETMASK 仍写点分十进制。如果系统同时安装并启用了 NetworkManager,改完文件后最好用 nmcli con reload 把配置重新读入,再用 nmcli con up eth0 重启连接。如果看到 "Error: Connection activation failed",先看 systemctl status NetworkManager 是否正常运行,再确认 ifcfg-eth0 里 NAME 和 DEVICE 是否一致。
改完后看这几个信号
配置永久生效不等于立即生效。修改文件后应执行 systemctl restart networking(或 netplan apply),接着用 ip addr show 检查地址是否匹配,用 ip route show 查看默认网关,再用 ping 网关和外部 IP 确认连通。若发现地址未变,多半是 NetworkManager 与 systemd-networkd 同时管理同一块网卡,需要先确认哪个服务实际在管。
上面的检查顺序是固定的:先看地址,再看网关,最后测连通。如果 ip addr show 里地址已经是静态配置的值,但 ip route show 没有 default 路由,问题多半出在 routes 或 GATEWAY 字段。如果默认网关正确,但 ping 外部 IP 不通,再用 ip route get 8.8.8.8 看数据包从哪个接口出去。
netmask 与网关的对应关系,是最后的边界
配置静态 IP 时不要遗漏 netmask 和 gateway 的对应关系。netmask 决定子网范围,若写成与网关不一致的掩码,虽然能保存成功,但对外通信会异常。设置前先用 ipcalc 或手动换算确认子网地址、广播地址,确保网关落在同一子网内。配置完成后重启网络服务属于高风险操作,务必在物理控制台或可回滚的 SSH 会话中执行,并提前准备好恢复用的动态配置。
注意,这里说的“网关落在同一子网内”不是配置软件可以绕过的。内核在添加路由时会校验网关是否在接口子网内,不匹配时通常直接报错,即使某些工具允许保存,数据包也无法正确送到下一跳。可以用 ipcalc 192.0.2.10/24 预演,输出会列出 network、broadcast 和 usable hosts,网关必须在 usable hosts 列表中。
如果系统还有 cloud-init 或 DHCP 客户端残留,建议在改完配置后检查 /run 或 /var/lib/NetworkManager 下的 lease 文件,确认没有旧租约干扰。最后,把改动过的文件和执行的命令记录到变更日志里,方便下次回滚。