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.实际运维的坑点
注意 nmtui(nmcli con modify的编辑同理)只写磁盘上的连接配置,运行中的接口仍按旧配置通信,改动要等重新应用才生效;用 ip addr 手工硬改接口,之后任何一次重新激活都会被 NM 改回去,新旧地址来回切换甚至 IP 冲突,会造成网络的“时断时续”。
此时需要对配置进行重新激活。nmtui 的 “Activate a connection” 界面看似能“重新激活”,实际是个开关,对已激活的连接(条目前带 * 号)再按一次回车,执行的是停用。
而 NetworkManager 1.4 起就提供的 Reapply(热应用改动、不断链路)能力,nmtui 根本没有暴露入口。远程运维时这就是一个经典的坑:你正通过这块网卡的 SSH 会话操作,停用的瞬间连接就断了,“再激活”这半步永远发不出去。
此时就得请nmcli这个命令行出场了
5. 使用 nmcli,先找连接名
1 | nmcli con show |
需要注意的是,有时候网卡可能叫 ens18,连接名却是 ens18。
nmcli 修改的是连接配置,不要直接把网卡名当成连接名;名称重复时,用 UUID 定位。
修改已有连接:
1 | sudo nmcli connection modify ens18 \ |
| 参数 | 作用 |
|---|---|
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 将 gateway4、gateway6 标记为弃用,推荐用路由表示默认网关:
1 | routes: |
二是排查工具更加完善,例如 Ubuntu 24.04 引入的 netplan status --diff,可以对比 YAML 配置与系统实际运行状态,帮助发现 IP、路由、DNS 等配置不一致的问题。
Netplan 的作用是把 YAML 转换为后端配置。
2. 配置文件在哪里
Netplan 的管理员配置放在:/etc/netplan/*.yaml
先看看本机有哪些文件:
1 | ls -l /etc/netplan/ |
常见名称有 00-installer-config.yaml、50-cloud-init.yaml,但文件名不是固定的。
先查看目标网卡:
1 | networkctl status ens18 |
Ubuntu操作系统刚安装完毕后,ens18这块网卡没有配置过,上述命令典型的回复如下:
1 | ● 2: ens18 |
配置 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 |
同一块网卡的其他名称。enp0s18 和 ens18 指向同一个设备 |
Driver、Model |
驱动为 virtio_net,设备为 Virtio 虚拟网卡 |
HW Address |
网卡的 MAC 地址,这里是 bc:24:11:92:57:10 |
MTU |
接口允许的最大传输单元,这里为 1500 字节 |
Link File 和 Network 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 | sudo cp /usr/share/doc/netplan/examples/static.yaml /etc/netplan/99-myconfig.yaml |
示例中的网卡名称和地址需要替换,有多余的接口或配置项也应一并清理。以网卡 ens18 为例,修改后的完整内容如下:
1 | network: |
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 | sudo netplan set --origin-hint=99-myconfig 'network.version=2' |
这些命令分别设置配置格式版本、管理后端、DHCPv4、静态地址、默认路由和 DNS。每条命令都使用相同的 --origin-hint,因此会逐步更新同一份文件。引号用于避免命令中的空格、方括号等被 Shell 错误处理,使用时保留即可。
工具生成的排版可能与手写示例不同,只要字段和值一致,含义就相同。使用 netplan set 仍需要提供正确的字段和参数,但不必自己组织完整的 YAML 文件。
4. 保存之后,用 Netplan 应用
netplan try 会先应用新配置,再给你 120 秒检查网络。确认正常后,在原终端按回车接受;
如果没有在规定时间内确认,它会尝试恢复之前的网络配置。因此,try 也会实际改变 IP、路由和 DNS,执行时仍可能导致 SSH 断开。官方文档提醒回滚存在已知问题,超时后应检查是否确实恢复,并在重启前核对磁盘上的 YAML。

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

netplan try 和 netplan 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 | sudo chown root:root /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 | auto enp2s0 |
拿到 Debian 13 上也能直接用
DNS起作用的前提是装了
resolvconf才会读dns-nameservers字段,注意这句话,后面会说到因果关系
3. 静态 IP 配置步骤
三个版本通用的静态 IP 配置步骤
- 首先查看网卡名称
1 | ip -br ad |
- 编辑配置文件
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 | iface ens18 inet static |
还是注意: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 | systemctl is-active systemd-resolved |
那更加说明当前没有 systemd-resolved 在管理 /etc/resolv.conf。
所以对于Debian而言,我建议你现在先不要折腾 systemd-resolved,直接创建 /etc/resolv.conf 即可。对于固定 IP 的服务器,这是非常清晰的一种配置方式。