0%

Linux 各发行版永久配置 IP指南

Linux 各发行版永久配置 IP指南

Linux 配置网络时,经常遇到两类问题:IP 改完当时能用,重启后又变回去了;照着教程重启网络,SSH 随即断开。

遇到这些问题,先确认这台机器由哪个服务管理网络、启动时读取哪份配置。修改了错误的文件,或者只用命令调整当前状态,重启后就可能恢复原样。

一、RHEL:从 network 服务到 NetworkManager

1. 管理方式的演进

RHEL 的网络管理从传统 network 服务逐步过渡到 NetworkManager。

RHEL 6 服务器常见的是 network 服务 + ifcfg 文件。

RHEL 7 起默认由 NetworkManager 接管,同时仍保留传统 network-scripts。

RHEL 8 弃用 network-scripts。

RHEL 9 移除 network-scripts,新连接默认以 keyfile 格式保存。

RHEL 10 移除 ifcfg 格式支持。

顺带一提格式问题:ifcfg 是 RHEL 6—8 常见的配置存储格式,keyfile 从 RHEL 9 起成为新连接的默认格式。RHEL 9 仍能读取旧的 ifcfg 配置,升级后也可能继续沿用这些文件。

这里涉及三组概念:

  • NetworkManager 与传统 network 服务:负责把配置应用到网卡。
  • ifcfg 与 keyfile:配置保存到磁盘时使用的文件格式。
  • nmcli 与 nmtui:操作 NetworkManager 的工具,一个用命令,一个用菜单。

所以日常关系是:你用 nmcli → NetworkManager 接收指令 → 按连接使用的存储格式保存配置。

2. 配置文件在哪里

格式 常见位置
ifcfg /etc/sysconfig/network-scripts/ifcfg-连接名
keyfile /etc/NetworkManager/system-connections/*.nmconnection

日常用 nmcli 时不用关心底层是哪种——nmcli connection modify 默认会把修改保存到对应文件,不需要再手工编辑一遍。

当你用 Ansible 等工具直接生成配置文件,或把老配置迁移到 RHEL 10 时,才需要专门确认目标格式。下面的操作面向由 NetworkManager 管理的系统。

3. 不想记参数,使用 nmtui

1
sudo nmtui

进入“编辑连接”,选择目标网卡对应的连接。

将 IPv4 改为 Manual,填写地址及前缀、网关、DNS,并勾选自动连接。

保存之后,配置已经写入磁盘,但当前网卡可能还在使用旧参数。要立即生效,还需要应用改动。

在本地控制台,可以进入“激活连接”,停用后再启用对应连接。

“激活连接”界面容易让人误解。连接前面带 *,说明它已经启用,此时选中它再按回车,执行的是停用。

如果你正通过这块网卡连接 SSH,停用后会失去连接,无法继续在原会话中启用网卡。因此,远程修改前应准备好虚拟机控制台或带外管理入口。

RHEL 8 及以后缺少 nmtui 时,可以安装:

1
sudo dnf install NetworkManager-tui

4.实际运维的坑点

注意 nmtuinmcli con modify的编辑同理)只写磁盘上的连接配置,运行中的接口仍按旧配置通信,改动要等重新应用才生效;用 ip addr 手工硬改接口,之后任何一次重新激活都会被 NM 改回去,新旧地址来回切换甚至 IP 冲突,会造成网络的“时断时续”。

此时需要对配置进行重新激活。nmtui 的 “Activate a connection” 界面看似能“重新激活”,实际是个开关,对已激活的连接(条目前带 * 号)再按一次回车,执行的是停用

而 NetworkManager 1.4 起就提供的 Reapply(热应用改动、不断链路)能力,nmtui 根本没有暴露入口。远程运维时这就是一个经典的坑:你正通过这块网卡的 SSH 会话操作,停用的瞬间连接就断了,“再激活”这半步永远发不出去。

此时就得请nmcli这个命令行出场了

5. 使用 nmcli,先找连接名

1
2
3
4
nmcli con show
# 返回
NAME UUID TYPE DEVICE
ens18 7f9f3848-89db-4a97-9e0b-38bab20948d9 ethernet ens18

需要注意的是,有时候网卡可能叫 ens18,连接名却是 ens18

nmcli 修改的是连接配置,不要直接把网卡名当成连接名;名称重复时,用 UUID 定位。

修改已有连接:

1
2
3
4
5
6
sudo nmcli connection modify ens18 \
ipv4.method manual \
ipv4.addresses "192.168.10.50/24" \
ipv4.gateway "192.168.10.1" \
ipv4.dns "192.168.10.10 192.168.10.11" \
connection.autoconnect yes
参数 作用
ipv4.method manual 手动设置 IPv4
ipv4.addresses IP 地址与前缀
ipv4.gateway 默认网关
ipv4.dns DNS 服务器
connection.autoconnect yes 允许连接自动启用

注意:
配置静态 IPv4 时,应将 ipv4.method 设为 manual,并将 connection.autoconnect 设为 yes,前者指定使用手动地址,后者允许连接在开机或满足连接条件时自动激活,避免配置已保存却未自动启用。

执行到这里,配置已经保存。可以先查看结果:

1
nmcli connection show ens18

典型的回复如下:

再应用到网卡:

1
sudo nmcli connection up ens18

它会重新激活连接,可能中断网络,适合在控制台操作。不必先执行 connection down

对于当前已激活连接中支持在线更新的改动,也可以尝试:

1
sudo nmcli device reapply ens18

注意这里跟的是网卡名。它尝试把保存后的改动应用到当前设备,支持的改动范围取决于 NetworkManager 版本和具体设置;无法应用时会报错。即使成功,更换了 SSH 正在使用的 IP,也不能保证原会话继续保持。

日常修改尽量沿用已有连接。反复新增自动连接,会给同一块网卡留下多份配置,增加后续维护的难度。

二、Ubuntu Server:使用 Netplan 配置网络

1. 从 ifupdown 到 Netplan

Ubuntu Server 16.04 的传统安装环境常用 ifupdown,网络配置写在 /etc/network/interfaces

Ubuntu 从 17.10 开始引入 Netplan,18.04 LTS 的服务器安装也转向了这套方式。

Ubuntu Server 20.04、22.04、24.04 的常规新装环境,通常都是 Netplan 配置 + systemd-networkd 执行

上述三个版本的的基本网络配置方法一致,日常操作主要有两点变化:

一是默认网关的推荐写法,旧教程常用的 gateway4 已被新版 Netplan 标记为弃用

Ubuntu Server 22.04开始新配置建议通过 routes 定义默认路由;

新版 Netplan 将 gateway4gateway6 标记为弃用,推荐用路由表示默认网关:

1
2
3
routes:
- to: 0.0.0.0/0
via: 192.168.10.1

二是排查工具更加完善,例如 Ubuntu 24.04 引入的 netplan status --diff,可以对比 YAML 配置与系统实际运行状态,帮助发现 IP、路由、DNS 等配置不一致的问题。

Netplan 的作用是把 YAML 转换为后端配置。

2. 配置文件在哪里

Netplan 的管理员配置放在:/etc/netplan/*.yaml

先看看本机有哪些文件:

1
ls -l /etc/netplan/

常见名称有 00-installer-config.yaml50-cloud-init.yaml,但文件名不是固定的。

先查看目标网卡:

1
networkctl status ens18

Ubuntu操作系统刚安装完毕后,ens18这块网卡没有配置过,上述命令典型的回复如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
● 2: ens18
Link File: /usr/lib/systemd/network/99-default.link
Network File: n/a
Type: ether
State: off (unmanaged)
Online state: unknown
Alternative Names: enp0s18
Path: pci-0000:00:12.0
Driver: virtio_net
Vendor: Red Hat, Inc.
Model: Virtio network device
HW Address: bc:24:11:92:57:10
MTU: 1500 (min: 68, max: 1500)
QDisc: noop
IPv6 Address Generation Mode: eui64
Queue Length (Tx/Rx): 1/1
Auto negotiation: no
Speed: n/a
Activation Policy: up
Required For Online: yes

配置 IP 时,重点看下面几个字段:

字段 含义及截图中的情况
Link File 网卡使用的 .link 文件,由 udev 处理网卡命名、MAC 地址策略等链路属性。这里使用系统提供的 99-default.link,配置 IP 和 DNS 不需要修改它
Network File systemd-networkd 为这块网卡加载的 .network 文件。这里显示 n/a,说明当前没有显示已加载的网络配置文件
State off 表示接口未启用;括号里的 unmanaged 表示当前没有由 systemd-networkd 管理
Online state networkd 判断的在线状态。这里是 unknown,不能据此判断整台机器是否能上网
Alternative Names 同一块网卡的其他名称。enp0s18ens18 指向同一个设备
DriverModel 驱动为 virtio_net,设备为 Virtio 虚拟网卡
HW Address 网卡的 MAC 地址,这里是 bc:24:11:92:57:10
MTU 接口允许的最大传输单元,这里为 1500 字节

Link FileNetwork File 分别对应不同的配置工作。系统即使通过 .link 文件完成了网卡命名,也不代表 systemd-networkd 已经接管网卡的 IP 配置。

3. 没有现成配置,如何用 Netplan 配置静态 IP

这台机器的 Network File 显示为 n/a,网卡状态为 off (unmanaged)。进一步查看 Netplan 配置:

1
sudo netplan get

返回结果为空,说明目前没有可用的 Netplan 配置。对于这台准备使用 Netplan + systemd-networkd 管理网络的服务器,接下来需要在 /etc/netplan/ 下创建 YAML 文件,写入网卡名称、IP、网关和 DNS。

实际操作时,YAML 的字段和层级不容易记全,没有必要每次都从头手写。可以复制系统自带的示例,也可以用 netplan set 生成配置,下面两种方式任选一种。

方法一:复制示例文件,再修改参数

Netplan 的部分安装包会提供示例文件,先检查本机是否存在:

1
ls /usr/share/doc/netplan/examples/static.yaml

如果存在,将它复制到配置目录,并使用自己的文件名:

1
2
sudo cp /usr/share/doc/netplan/examples/static.yaml /etc/netplan/99-myconfig.yaml
sudo nano /etc/netplan/99-myconfig.yaml

示例中的网卡名称和地址需要替换,有多余的接口或配置项也应一并清理。以网卡 ens18 为例,修改后的完整内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
network:
version: 2
renderer: networkd
ethernets:
ens18:
dhcp4: false
addresses:
- 192.168.10.50/24
routes:
- to: 0.0.0.0/0
via: 192.168.10.1
nameservers:
addresses:
- 192.168.10.10
- 192.168.10.11

version: 2 是 Netplan 配置格式的版本,renderer: networkd 指定由 systemd-networkd 管理网卡。ens18 替换为实际网卡名,dhcp4: false 关闭 DHCPv4,随后填写静态地址、默认路由和 DNS。

这里的 192.168.10.50/24 包含 IP 和网络前缀;0.0.0.0/0 表示 IPv4 默认路由,下一行的 via 指定网关。以上地址均应按实际网络修改。

编辑 YAML 时使用空格缩进,不要混入 Tab。

方法二:使用 netplan set 生成配置

netplan set 可以把指定的配置写入 YAML,省去手工处理文件层级和缩进的过程。--origin-hint=99-myconfig 指定写入 /etc/netplan/99-myconfig.yaml,参数中不需要加 .yaml 后缀。netplan set 官方说明

仍以相同的网卡和地址为例,依次执行:

1
2
3
4
5
6
7
8
9
10
11
sudo netplan set --origin-hint=99-myconfig 'network.version=2'

sudo netplan set --origin-hint=99-myconfig 'network.renderer=networkd'

sudo netplan set --origin-hint=99-myconfig 'network.ethernets.ens18.dhcp4=false'

sudo netplan set --origin-hint=99-myconfig 'network.ethernets.ens18.addresses=[192.168.10.50/24]'

sudo netplan set --origin-hint=99-myconfig 'network.ethernets.ens18.routes=[{to: 0.0.0.0/0, via: 192.168.10.1}]'

sudo netplan set --origin-hint=99-myconfig 'network.ethernets.ens18.nameservers.addresses=[192.168.10.10, 192.168.10.11]'

这些命令分别设置配置格式版本、管理后端、DHCPv4、静态地址、默认路由和 DNS。每条命令都使用相同的 --origin-hint,因此会逐步更新同一份文件。引号用于避免命令中的空格、方括号等被 Shell 错误处理,使用时保留即可。

工具生成的排版可能与手写示例不同,只要字段和值一致,含义就相同。使用 netplan set 仍需要提供正确的字段和参数,但不必自己组织完整的 YAML 文件。

4. 保存之后,用 Netplan 应用

netplan try 会先应用新配置,再给你 120 秒检查网络。确认正常后,在原终端按回车接受;

如果没有在规定时间内确认,它会尝试恢复之前的网络配置。因此,try 也会实际改变 IP、路由和 DNS,执行时仍可能导致 SSH 断开。官方文档提醒回滚存在已知问题,超时后应检查是否确实恢复,并在重启前核对磁盘上的 YAML。

netplan apply 则直接应用配置,不等待确认,也没有 try 那样的超时回滚机制,适合在控制台操作、确认配置无误后使用。

netplan trynetplan apply 都会立即应用网络配置,区别在于是否等待确认。

两条命令负责让配置在当前系统生效,重启后能否继续使用,则取决于 /etc/netplan/ 下保存的 YAML 配置。

保存文件后,设置所有者和权限。以下文件名应替换为实际修改的文件:

另外显示WARNING **: 08:54:41.852: Permissions for /etc/netplan/ens18.yaml are too open

这条警告表示:**/etc/netplan/ens18.yaml 的文件权限过宽,其他用户也可能访问它。** Netplan 建议配置文件只允许 root 读写,因为其中可能包含密码、密钥等敏感信息。

执行下面两条命令即可修正:

1
2
sudo chown root:root /etc/netplan/ens18.yaml
sudo chmod 600 /etc/netplan/ens18.yaml

600 表示只有文件所有者 root 可以读写,其他用户没有权限,不影响 Netplan 正常读取。

三、Debian Server:主要看安装方式

1. Debian 11、12、13 的常见管理方式

Debian 11、12、13 三代在永久 IP 配置的主路径上几乎没有变化——都是编辑 /etc/network/interfaces,由 ifupdown(networking.service)应用。变化集中在 DNS 处理方式DHCP 客户端后端 这两个细节上,而不是”换了一种配置范式”。这一点和 RHEL 那种”从 network-scripts 到 NM 到 keyfile”的跨越式演进完全不同。

2. 配置文件在哪里,怎么判断

三个版本的 interfaces 文件写法几乎可以互相复制。一个 Debian 11 上能用的静态 IP 段:

1
2
3
4
5
auto enp2s0
iface enp2s0 inet static
address 192.168.1.10/24
gateway 192.168.1.1
dns-nameservers 223.5.5.5 8.8.8.8

拿到 Debian 13 上也能直接用

DNS起作用的前提是装了 resolvconf 才会读 dns-nameservers 字段,注意这句话,后面会说到因果关系

3. 静态 IP 配置步骤

三个版本通用的静态 IP 配置步骤

  1. 首先查看网卡名称
1
2
3
4
ip -br ad
# 返回
lo UNKNOWN 127.0.0.1/8 ::1/128
ens18 UP 172.18.3.24/24 fe80::be24:11ff:fee4:1921/64
  1. 编辑配置文件

Debian 各版本 在 IP 永久配置上保持了罕见的稳定/etc/network/interfaces 的写法、生效命令、排查思路都能跨版本复用

唯一的实际变化是 Debian 13 把 DHCP 后端换成了 dhcpcd-base(对静态 IP 用户无感),以及社区对”是否换掉 ifupdown”的讨论至今没有落地——所以照着 Debian 11 的教程去配 Debian 13 依然是对的。

这里还是存在配置文件字段和层级不容易记全的问题

有个便捷方式就是直接查看系统自带示例

我们采用man帮助记忆:

1
man 5 interfaces

开头的 EXAMPLE 就有静态地址配置。按 q 退出。

使用nano编辑器编辑/etc/network/interfaces或者新建/etc/netwok/interfaces.d/ens18

1
2
3
4
iface ens18 inet static
address 172.18.3.24/24
gateway 172.18.3.254
dns-nameservers 223.5.5.5

还是注意:DNS起作用的前提是装了 resolvconf 才会读 dns-nameservers 字段

4.静态IP生效

传统 ifupdown 的接口操作方式是先停用、再启用。例如下面的命令应在本地终端或虚拟机控制台执行,将 ens18 换成实际网卡名:

1
sudo ifdown ens18 && sudo ifup ens18

如果系统已经使用 ifupdown2(默认并没有安装,但是PVE等定制平台官方推荐采用ifreload命令),可通过 sudo ifreload -a 重新加载配置中标记为 auto 的接口,通常无需先关闭接口;

实际上在安装Debian操作系统的时刻,都会提供让你手动配置IP地址的UI界面,当他检测到当前环境下无法通过DHCP获取到IP地址时候,会贴心提醒用户受否手动配置网络

5.DNS的坑

这里有个很容易踩的坑:/etc/network/interfaces 负责 IP、掩码、网关,并不意味着它一定会自动生成 /etc/resolv.conf

如果之前是 DHCP,DHCP 客户端往往会顺便获得 DNS;改成纯静态 IP 后,如果没有额外配置 DNS 管理机制,就可能出现你现在这种情况:

我们可以验证

1
2
3
systemctl is-active systemd-resolved
# 大多数情况下返回
inactive

那更加说明当前没有 systemd-resolved 在管理 /etc/resolv.conf

所以对于Debian而言,我建议你现在先不要折腾 systemd-resolved,直接创建 /etc/resolv.conf 即可。对于固定 IP 的服务器,这是非常清晰的一种配置方式。