Linux服务器如何配置静态IP地址?Netplan与NetworkManager教程

服务器用 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 解析 → 端口可达,逐级确认。