服务器用 DHCP 拿地址在测试阶段很方便,但放到生产环境就有隐患:租约到期换地址、重启后 IP 变了、DNS 上游抖动导致解析异常——任何一条都可能让服务失联。所以生产服务器一般都会配置静态 IP。问题是,Linux 的网络配置在不同发行版之间差异很大:老系统用 /etc/network/interfaces,Ubuntu 从 17.10 起改用 Netplan,RHEL 系则默认 Netplan 不适用,而是用 NetworkManager 和 /etc/sysconfig/network-scripts/。
这篇文章会把三种主流方式讲清楚:Ubuntu 的 Netplan、以及 RHEL 系和通用场景下的 NetworkManager(含 nmcli 和配置文件两种写法),并说明什么时候该用哪个。更重要的是,改 IP 是极易把自己关在门外的操作,所以我会专门讲远程改 IP 的安全姿势和回滚方法。
读完之后你应该能:根据发行版选对配置方式,写出可用的静态 IP 配置,正确设置网关、DNS、路由,并在改完后验证连通性;万一改错了,也知道怎么救回来。
一、先确认发行版和当前网络配置方式
不管用哪种方式,第一步都是摸清现状,别上来就改。
# 1. 看发行版和版本
cat /etc/os-release
# 2. 看网卡名称和当前地址(现代发行版推荐 ip,不要用已废弃的 ifconfig)
ip -br a
ip addr show
ip route show
# 3. 看默认网关
ip route | grep default
# 4. 看 DNS
cat /etc/resolv.conf
resolvectl status 2>/dev/null
# 5. 判断当前用的是哪种网络管理方式
systemctl status NetworkManager --no-pager # RHEL 系默认启用
systemctl status systemd-networkd --no-pager # Ubuntu Server 用 Netplan 时底层常是 networkd
ls /etc/netplan/ # Ubuntu Netplan 配置文件目录
ls /etc/sysconfig/network-scripts/ # 老 RHEL/CentOS 网卡脚本目录
nmcli device status # 看 NetworkManager 是否在管理网卡
判读方式:
| 现象 | 说明 | 该用哪种配置 |
|---|---|---|
有 /etc/netplan/*.yaml |
Ubuntu 18.04 及以上 | Netplan |
| RHEL/Rocky/Alma 9 | 默认 NetworkManager | nmcli 或 keyfile |
有 /etc/sysconfig/network-scripts/ifcfg-* |
老 RHEL/CentOS 7 风格 | ifcfg 脚本 |
| 无 Netplan、有 networkd | 纯 systemd-networkd | .network 文件 |
本文重点讲前两种,因为它们覆盖了绝大多数现代服务器。
二、Ubuntu:用 Netplan 配置静态 IP
Netplan 用 YAML 描述网络,配置放在 /etc/netplan/ 下,文件名通常是 00-installer-config.yaml 或 50-cloud-init.yaml。它的渲染目标(renderer)可以是 networkd 或 NetworkManager,Ubuntu Server 默认是 networkd。
最重要的一点:YAML 对缩进极其敏感,必须用空格缩进(不能用 Tab),层级对齐错了 Netplan 会报错甚至静默失败。
先看当前配置:
ls -l /etc/netplan/
cat /etc/netplan/*.yaml
# 典型输出:
# network:
# version: 2
# renderer: networkd
# ethernets:
# ens33:
# dhcp4: true
改成静态 IP:
# 先备份原配置(务必!)
sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
# 编辑配置
sudo vi /etc/netplan/00-installer-config.yaml
写入内容(把 ens33、地址、网关、DNS 换成你实际的值):
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: false
addresses:
- 192.0.2.10/24 # 静态 IP 和掩码,/24 即 255.255.255.0
routes:
- to: default
via: 192.0.2.1 # 默认网关
nameservers:
addresses:
- 223.5.5.5 # DNS 服务器
- 119.29.29.29
应用配置:
# 校验语法(不生效,只检查)
sudo netplan generate
sudo netplan try # 交互式尝试,120 秒内不确认会自动回滚(远程改 IP 强烈推荐!)
# 确认无误后正式应用
sudo netplan apply
# 验证
ip -br a
ip route | grep default
ping -c 3 192.0.2.1 # 通网关
ping -c 3 223.5.5.5 # 通外网 IP
ping -c 3 www.example.com # 验证 DNS
不同 Ubuntu 版本要注意 netplan 的版本差异:较新的 Ubuntu(22.04+)支持 routes: 里的 to: default;老版本可能写成 gateway4:(已被废弃)。如果你的版本不认新语法,就按它支持的写法来,但新系统优先用新语法。
还有个坑:云主机上如果用 cloud-init 管理网络,直接改 Netplan 可能被 cloud-init 覆盖或在重启后还原。这种情况下要么通过云厂商控制台/元数据改,要么在 cloud-init 的 network 配置里改,或把 /etc/cloud/cloud.cfg.d/ 里的网络管理禁用掉。改之前先确认 cat /etc/cloud/cloud.cfg 里的网络配置来源。
三、RHEL / Rocky / AlmaLinux:用 NetworkManager 配置静态 IP
RHEL 8/9 默认用 NetworkManager,老式的 network-scripts 在新版本里已不是默认。配置有两种写法:nmcli 命令行,和 keyfile / ifcfg 配置文件。推荐新系统用 nmcli 或 keyfile。
方式一:nmcli 命令行(推荐,不易写错)
# 查看连接和设备
nmcli device status
nmcli connection show
# 假设连接名是 ens160,改成静态
sudo nmcli connection modify ens160 \
ipv4.method manual \
ipv4.addresses 192.0.2.10/24 \
ipv4.gateway 192.0.2.1 \
ipv4.dns "223.5.5.5 119.29.29.29" \
ipv4.dns-search example.com \
connection.autoconnect yes
# 生效(会短暂断网,远程操作要小心)
sudo nmcli connection up ens160
# 验证
nmcli connection show ens160 | grep -E 'ipv4.method|ipv4.addresses|ipv4.gateway'
ip -br a
ip route | grep default
方式二:keyfile / ifcfg 配置文件
新系统用 keyfile 格式,放在 /etc/NetworkManager/system-connections/:
sudo vi /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160
autoconnect=true
[ipv4]
method=manual
address1=192.0.2.10/24,192.0.2.1
dns=223.5.5.5;119.29.29.29;
may-fail=false
[ipv6]
method=disabled
# keyfile 权限要求严格,必须 600
sudo chmod 600 /etc/NetworkManager/system-connections/ens160.nmconnection
# 重新加载并启用
sudo nmcli connection reload
sudo nmcli connection up ens160
老系统(CentOS 7 风格)的 ifcfg 写法:
sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none # 静态用 none 或 static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.0.2.10
PREFIX=24 # 或 NETMASK=255.255.255.0
GATEWAY=192.0.2.1
DNS1=223.5.5.5
DNS2=119.29.29.29
# 重启网络(CentOS 7)
sudo systemctl restart network
# 或针对单网卡
sudo nmcli connection down ens33 && sudo nmcli connection up ens33
方式三:纯 systemd-networkd(无 NetworkManager 时)
# 先禁用 NetworkManager 对网卡的管理,确保 networkd 接管
sudo systemctl enable --now systemd-networkd
sudo vi /etc/systemd/network/10-static.network
[Match]
Name=ens160
[Network]
Address=192.0.2.10/24
Gateway=192.0.2.1
DNS=223.5.5.5
DNS=119.29.29.29
sudo systemctl restart systemd-networkd
四、远程改 IP 的安全姿势
改 IP 是能把你自己关在门外的操作。 SSH 是靠 IP 连接的,一旦你改的地址和实际不符,或者网关写错,现有连接会立刻断开,而新地址又连不上,就只能去云控制台或机房现场。所以远程操作必须遵守下面的原则:
| 风险点 | 防护措施 |
|---|---|
| IP/掩码写错 | 先核对云控制台或现场信息,确认网段、掩码、网关 |
| 网关写错 | 先 ping 网关确认可达,再改配置 |
| 连接瞬间断开 | 用 netplan try(Ubuntu)自动回滚其他发行版无等价功能 |
| 无回滚手段 | 保留一条独立带外通道(云 VNC/串口控制台) |
| 配置无法还原 | 改前 cp 备份原文件 |
| DHCP 冲突 | 静态地址要和 DHCP 池错开,避免被人抢 |
几个实用技巧:
- 先加次 IP 验证,再删原 IP:可以先把静态地址作为附加地址加上(Netplan 的
addresses里保留旧地址),确认新地址能ping通、能 SSH 上去,再移除旧地址。这样过程中两条路都在。 - 用延时命令兜底:在改配置的同一条命令里挂一个"过 N 分钟若未取消就回滚"的定时任务。
- 准备带外口:云主机一定确认 VNC/串口控制台能用;物理机确认 IPMI/iDRAC/iLO 可用。
# 兜底示例:10 分钟后自动恢复备份配置并重启网络
sudo bash -c 'echo "cp /etc/netplan/00-installer-config.yaml.bak /etc/netplan/00-installer-config.yaml && netplan apply" | at now + 10 minutes'
# 确认新配置没问题后,取消这个兜底任务
sudo atq
sudo atrm <任务号>
五、验证与常见问题排查
改完后不要只看 ip a,要从下往上验证连通性。
# 1. 接口 UP 且有正确地址
ip -br a
# 2. 默认路由正确
ip route | grep default
# 3. 通网关(第一跳)
ping -c 3 <网关>
# 4. 通外网 IP(绕过 DNS,验证路由和出口)
ping -c 3 223.5.5.5
# 5. 验证 DNS 解析
dig @223.5.5.5 www.example.com
ping -c 3 www.example.com
# 6. 验证目标端口可达
nc -zv <某已知主机> 443
| 症状 | 可能原因 | 处理 |
|---|---|---|
| 无 IP / 接口 DOWN | 配置未应用、网卡名写错 | 检查配置里的接口名(ip -br a)、重新 apply |
| 能通网关不能上外网 | 网关错、DNS 未配 | 检查 ip route、resolv.conf |
| 能通 IP 不能解析域名 | DNS 配置问题 | 配置 nameservers/ipv4.dns,或检查 resolvectl |
| 重启后配置丢失 | cloud-init 覆盖或网卡漂移 | 检查 cloud-init、用 MAC 匹配网卡 |
| 网卡名变了 | 硬件/虚拟化改动导致 ens33→ens34 |
用 networkctl/nmcli 确认,按 MAC 匹配 |
六、多网卡与策略路由的注意事项
服务器有多块网卡时,静态 IP 的配置会复杂一些,需要额外关注路由和源地址选择。假设一台机器有内网卡 ens33(192.168.1.10/24)和外网卡 ens34(203.0.113.10/24),两块卡都能配静态地址,但默认网关通常只能有一个(一般是外网卡),内网流量通过直连路由走内网卡。如果两块卡都配了网关,会产生"多默认网关"的问题,可能造成回包走错网卡、连接时通时不通。
判断和排查这类问题的核心是路由表:ip route show 看默认路由,ip rule show 看策略规则,而 ip route get <目标IP> 能直接告诉你"访问某个地址时内核实际选了哪个出口和哪个源地址"。经验上,多出口服务器出现"能 ping 通但 SSH 连不上""内网服务访问超时"这类怪现象,多半是源地址选择或路由掩码配置的问题,用 ip route get 一测常常立刻看出端倪。
另外几个配置文件的职责要分清:/etc/resolv.conf 管 DNS 解析,但它可能被 Netplan、NetworkManager 或 systemd-resolved 覆盖,不建议直接手改;/etc/hosts 管本机静态解析,优先级高于 DNS,常用于固定主机名;/etc/nsswitch.conf 决定解析顺序(先查 hosts 还是先查 DNS)。改网络时如果只改了 DNS 却不生效,多半是 systemd-resolved 或 NetworkManager 把配置又覆盖回去了,要用 resolvectl status 查看实际生效的解析配置,而不是只盯着 /etc/resolv.conf 这一个文件。
七、IPv6 静态地址与禁用 IPv6
现在的服务器越来越多地用到 IPv6,配置方式和 IPv4 类似但语法不同。在 Netplan 里,IPv6 地址同样写在 addresses 里,只是带上 /64 前缀,网关在 routes 里用 via 指定,dhcp6: false 表示不使用 DHCPv6。NetworkManager 侧则用 ipv6.method manual、ipv6.addresses、ipv6.gateway、ipv6.dns 来配置。要注意 IPv6 的默认路由既可以由路由通告(RA)自动下发,也可以手工配置,两者同时存在时容易冲突,需要先想清楚由谁负责。
如果环境是纯 IPv4,建议把 IPv6 显式设为 disabled(Netplan 的 dhcp6: false 加不配 addresses,NetworkManager 的 ipv6.method disabled),避免某些服务因为尝试走 IPv6 而出现莫名其妙的超时。经验上,"名称解析很慢但她机 ping 正常""应用连接偶尔卡住"这类现象,很多时候是 IPv6 地址配了但链路实际不通、应用却按优先级先尝试 IPv6 导致的。排查时用 ip -6 addr、ip -6 route、ping6 逐项确认,比一味盯着 IPv4 更快找到根因。
常见问题
Q1:Ubuntu 用 Netplan 后为什么 /etc/network/interfaces 改了没用?
因为 Ubuntu 18.04+ 默认不再用 /etc/network/interfaces,而是 Netplan 生成 networkd/NetworkManager 配置。改 Netplan 才对。
Q2:netplan apply 后报错或没生效怎么办?
先用 sudo netplan generate 看具体报错,多数是 YAML 缩进或字段名问题。确认无误再 apply。远程操作建议用 netplan try。
Q3:改了 IP 后 SSH 断了怎么救?
用云控制台的 VNC/串口登录,或用带外管理(IPMI)。进去后恢复备份配置或改回正确地址,再重新应用。
Q4:静态 IP 和 DHCP 哪个更适合服务器?
服务器、数据库、需要固定地址被访问的机器用静态 IP;临时测试机、办公终端用 DHCP 更方便。云主机有时用 DHCP 也能拿到固定地址(由厂商保证),此时按厂商建议来。
Q5:怎么改回来?
改前备份了配置文件的话,直接恢复备份再 apply 即可。RHEL 系用 nmcli connection modify ... ipv4.method auto 可切回 DHCP。
总结
- Ubuntu 18.04+ 用 Netplan(
/etc/netplan/*.yaml),RHEL/Rocky/Alma 8/9 用 NetworkManager(nmcli或 keyfile),老系统用 ifcfg 脚本,先确认再动手。 - Netplan 对 YAML 缩进极其敏感,改前先
netplan generate校验,远程改动优先用支持自动回滚的netplan try。 - RHEL 系推荐
nmcli connection modify配置静态地址、网关和 DNS,重载用nmcli connection up,避免手写配置文件出错。 - 远程改 IP 必须保留带外通道(云 VNC/IPMI)、改前备份配置、并可用 at 任务做超时自动回滚。
- 验证要分层:接口地址 → 默认路由 → 网关 → 外网 IP → DNS 解析 → 端口可达,逐级确认。
企业QQ咨询




