1. 从命令行到配置文件为什么你需要掌握 nmcli如果你还在手动编辑/etc/sysconfig/network-scripts/目录下那些ifcfg-eth0文件来配置网络或者每次网络出问题都一头扎进nmtui的图形界面里那么是时候了解一下nmcli了。这个工具远不止是 NetworkManager 的一个命令行前端它是一把能让你直接、精准、可编程地管理网络配置文件的瑞士军刀。尤其是在服务器运维、自动化脚本、或者需要批量部署和远程管理的场景下通过图形界面点点戳戳的效率远不如一行命令来得直接可靠。nmcli的核心价值在于它将网络配置从“手动编辑文本文件”和“依赖图形界面”这两个传统模式中解放出来提供了一个统一、稳定、可脚本化的接口。更重要的是它直接与 NetworkManager 的配置数据库交互你通过nmcli所做的任何修改都会实时、正确地反映到系统的网络配置文件中避免了手动编辑可能导致的语法错误或配置冲突。对于需要频繁切换网络环境如笔记本在不同 Wi-Fi 间移动、管理复杂网络拓扑如多网卡绑定、VLAN或者追求运维自动化的工程师来说熟练使用nmcli管理网卡配置文件是一项能显著提升效率和可靠性的基本功。2. 理解 nmcli 与配置文件的关系不是替代而是桥梁很多人对nmcli有个误解认为用了nmcli就再也不需要关心传统的网卡配置文件了。这个理解是片面的。实际上nmcli是操作 NetworkManager 配置数据库的命令行工具而这个数据库的持久化存储在很多 Linux 发行版如 RHEL/CentOS 7/8, Fedora中依然是以/etc/sysconfig/network-scripts/ifcfg-连接名文件的形式存在的。在更新的发行版如 RHEL 9, Fedora 最新版中NetworkManager 开始转向使用keyfile格式的配置文件通常位于/etc/NetworkManager/system-connections/但nmcli对这两种后端都是兼容的。它们之间的关系可以这样理解配置文件是“源代码”它定义了网络连接的所有静态属性如 IP 地址、网关、DNS、网卡设备名等。系统启动或 NetworkManager 重启时会读取这些文件来建立连接。nmcli是“编译器”和“调试器”你可以用nmcli命令“编译”即创建或修改这份“源代码”配置文件。同时你也可以用nmcli实时地“调试”即激活、关闭、查看状态当前运行的网络连接这些运行时操作可能不会立即持久化到配置文件除非你显式地保存。关键点在于当你使用nmcli connection add或nmcli connection modify命令时NetworkManager 会在内存中更新其配置数据库并且在大多数情况下会自动将更改写回对应的配置文件。这意味着通过nmcli修改配置是修改配置文件的“正确姿势”它能确保配置的语法正确性和与 NetworkManager 内部状态的一致性。直接手动编辑配置文件虽然有时可行但如果你之后又用nmcli做了修改或者 NetworkManager 在读取时发现格式问题就可能导致配置回滚或连接失败。3. 核心操作用 nmcli 创建与定义网卡配置文件让我们从最基础的开始创建一个全新的、静态 IP 的以太网连接配置文件。假设我们有一张网卡设备名是ens192我们想为它创建一个名为office-lan的连接配置指定 IP 为192.168.1.100/24网关为192.168.1.1DNS 为8.8.8.8和8.8.4.4。3.1 创建静态IP连接创建连接配置文件的命令骨架是nmcli connection add。下面是一个完整的示例sudo nmcli connection add type ethernet \ con-name office-lan \ ifname ens192 \ ipv4.addresses 192.168.1.100/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 8.8.8.8 8.8.4.4 \ ipv4.method manual \ autoconnect yes逐条拆解这个命令type ethernet: 指定连接类型为以太网。其他常见类型还有wifi、bridge、bond等。con-name office-lan: 为你创建的连接配置文件起一个名字。这个名字非常重要是后续管理up, down, modify, delete时使用的标识符而不是设备名ens192。一个物理网卡上可以绑定多个不同名称的连接配置但同一时间只能激活一个。ifname ens192: 指定这个连接配置绑定到哪个网络接口设备。ipv4.addresses 192.168.1.100/24: 设置 IPv4 地址和子网前缀。/24是 CIDR 表示法等价于子网掩码255.255.255.0。ipv4.gateway 192.168.1.1: 设置默认网关。ipv4.dns 8.8.8.8 8.8.4.4: 设置 DNS 服务器。多个 DNS 服务器用空格隔开整个参数需要用引号包裹。ipv4.method manual: 这是关键参数它指定使用静态 IP手动配置。如果设为auto则会使用 DHCP 自动获取。忘记设置这个参数是新手最常见的错误之一会导致配置行为不符合预期。autoconnect yes: 设置系统启动时自动尝试连接此网络。执行完这条命令后你会看到输出Connection office-lan (uuid) successfully added.。同时在/etc/sysconfig/network-scripts/目录下会立即生成一个名为ifcfg-office-lan的文件。你可以用cat命令查看其内容会发现里面的BOOTPROTOnone,IPADDR192.168.1.100,NETMASK255.255.255.0等字段与你通过nmcli输入的参数是完全对应的。3.2 创建动态IPDHCP连接创建 DHCP 连接的配置更简单sudo nmcli connection add type ethernet \ con-name dhcp-profile \ ifname ens192 \ ipv4.method auto \ autoconnect yes这里唯一的不同就是将ipv4.method设置为auto并且不需要指定addresses,gateway,dns。NetworkManager 会从 DHCP 服务器获取这些信息。生成的配置文件中BOOTPROTO字段会是dhcp。注意一个物理接口如ens192在同一时间只能有一个“活跃”的连接。如果你在ens192上已经有一个活跃的连接比如系统自带的ens192再add一个新的连接新的连接配置文件会被创建但不会自动激活。你需要手动up新的连接旧的连接会自动down。4. 深度管理查看、修改与操纵现有配置文件创建配置文件只是第一步日常运维中更频繁的是对已有配置进行查询和调整。4.1 查看连接配置详情nmcli connection show命令用于查看所有保存的连接配置列表。nmcli connection show这会列出所有连接配置的NAME连接名,UUID全局唯一标识符,TYPE类型,DEVICE当前绑定的设备。如果DEVICE列显示设备名如ens192表示该连接当前是活跃的。要查看某个特定连接例如office-lan的所有配置细节使用nmcli connection show office-lan这个命令的输出非常详细包含了连接的所有属性从基本的 IP、DNS到高级的 MTU、路由规则、二层属性等。当你需要排查配置问题时这是第一个要用的命令。4.2 修改连接配置参数修改配置使用nmcli connection modify命令。这是动态调整配置文件的核心。场景一为office-lan连接增加一个辅助 IP 地址Alias IP。sudo nmcli connection modify office-lan \ ipv4.addresses 192.168.1.101/24注意ipv4.addresses中的加号。这表示“追加”一个地址到现有地址列表。如果直接用ipv4.addresses没有加号则会覆盖之前设置的所有地址很可能导致你丢失主 IP这是一个常见的坑。场景二更改 DNS 服务器。sudo nmcli connection modify office-lan \ ipv4.dns 114.114.114.114 223.5.5.5这里没有用因为 DNS 服务器通常直接替换而不是追加。场景三同时修改多个参数并设置连接不在系统启动时自动连接。sudo nmcli connection modify office-lan \ ipv4.gateway 192.168.1.254 \ autoconnect nomodify命令可以一次接多个参数进行修改非常高效。重要提示nmcli connection modify命令默认只修改内存中的配置和磁盘上的配置文件但不会影响当前已经活跃的连接。也就是说你修改了office-lan的 IP 地址但此刻office-lan连接正活跃着它的 IP 并不会立即改变。4.3 让配置修改生效重新加载reload与重新连接up/down修改了配置文件如何让更改生效呢这里有几种策略重启 NetworkManager 服务最彻底但影响大sudo systemctl restart NetworkManager这会重启所有网络连接在生产环境中需谨慎。让 NetworkManager 重新加载配置文件推荐sudo nmcli connection reload这个命令会让 NetworkManager 重新读取所有磁盘上的连接配置文件。对于尚未激活的连接其配置会被更新。对于已经激活的连接这个命令不会改变其当前运行状态。对已激活的连接先断开再连接最常用 这是让配置修改在活跃连接上生效的标准操作。sudo nmcli connection down office-lan sudo nmcli connection up office-lan或者使用更简洁的reapply子命令在某些较新版本中可用sudo nmcli connection up office-lan --reapplyreapply会尝试在不完全断开连接的情况下应用新的配置但并非所有类型的修改都支持。实操心得对于 IP 地址、网关这类核心参数的修改最稳妥的方式就是down再up。修改 DNS 后可以尝试使用sudo systemctl restart systemd-resolved如果使用 systemd-resolved或直接修改/etc/resolv.conf如果是传统模式来立即生效但更好的做法也是重启连接让 NetworkManager 统一管理。4.4 连接配置的克隆与删除克隆当你需要创建一个与现有配置相似的新配置时克隆非常有用。sudo nmcli connection clone office-lan office-lan-backup这会创建一个名为office-lan-backup的新连接其所有设置与office-lan相同但拥有新的 UUID。之后你可以再使用modify命令对其进行调整。删除sudo nmcli connection delete office-lan-backup这会从 NetworkManager 的配置数据库和磁盘上删除对应的配置文件。如果该连接当前是活跃的删除操作会先将其断开。5. 实战技巧与高级配置场景掌握了基本操作后我们来看一些更贴近实际运维的场景和技巧。5.1 配置一个“仅本地链接”的应急配置文件有时候你可能需要创建一个配置当 DHCP 失败或主配置出错时能自动获取一个链路本地地址169.254.0.0/16保证机器至少能在本地链路内被访问。这可以通过配置“次要连接”secondary connection实现但更直接的方式是创建一个独立的、使用link-local方法的连接。sudo nmcli connection add type ethernet \ con-name fallback-local \ ifname ens192 \ ipv4.method link-local \ autoconnect noipv4.method link-local告诉 NetworkManager 在此连接激活时不配置任何静态 IP也不请求 DHCP而是使用 IPv4 链路本地自动配置APIPA。这个连接不会自动启动autoconnect no你可以在主连接失败后手动nmcli connection up fallback-local来启用它。5.2 为连接配置静态路由在某些网络环境中除了默认网关还需要添加特定的静态路由。nmcli也能很好地处理。假设在office-lan连接上我们需要添加一条路由访问10.10.0.0/16网段的流量走网关192.168.1.200。sudo nmcli connection modify office-lan \ ipv4.routes 10.10.0.0/16 192.168.1.200和地址一样这里也用了ipv4.routes来追加路由。要查看已配置的路由可以使用nmcli connection show office-lan | grep routes。5.3 绑定连接与物理设备ifname的灵活性与坑在创建连接时指定的ifname接口名并不是永久、强制性的绑定。连接配置的ifname更像是一个“首选设备”。NetworkManager 在激活一个连接时会寻找一个与连接类型匹配、且当前未被其他连接占用的设备。如果指定的ifname不存在或被占用它会尝试寻找其他可用设备。这带来了灵活性比如你有一个连接配置wired-home指定ifname为eth0。当你把网线从eth0拔掉插到eth1上时NetworkManager 有可能自动将wired-home连接在eth1上激活如果配置了autoconnect且eth1类型匹配。但也带来了潜在的混乱特别是当你有多个相同类型的物理接口时。为了进行严格的、一对一的绑定你需要使用设备的 MAC 地址而不是接口名。# 首先查看设备的MAC地址 nmcli device show ens192 | grep GENERAL.HWADDR # 输出类似GENERAL.HWADDR: 00:0C:29:XX:XX:XX # 创建连接时使用mac地址进行绑定 sudo nmcli connection add type ethernet \ con-name strict-bind \ ifname ens192 \ mac 00:0C:29:XX:XX:XX \ # 替换为实际的MAC地址 ipv4.method auto通过mac参数指定后这个连接将只会在具有此特定 MAC 地址的网络设备上激活无论该设备在系统中被识别为ens192、eth0还是其他名字。这在硬件更换或接口名动态变化如Predictable Network Interface Names特性的环境中非常有用。5.4 配置文件的手动编辑与 nmcli 的协作虽然推荐使用nmcli但有时直接查看或微调配置文件也是必要的。关键在于要理解两者的协作方式。安全查看使用nmcli connection show name输出的是“规范化”后的视图而直接cat配置文件看到的是原始存储格式。两者在表述上可能有细微差别例如配置文件里是BOOTPROTOnonenmcli显示为ipv4.method: manual。手动编辑后的操作如果你直接使用vi编辑了/etc/sysconfig/network-scripts/ifcfg-office-lan文件必须执行以下命令之一让 NetworkManager 感知到变化sudo nmcli connection reload # 重新加载所有配置 # 或者针对特定连接 sudo nmcli connection load /etc/sysconfig/network-scripts/ifcfg-office-lan之后再使用down和up来激活新的配置。重要警告手动编辑配置文件存在风险。务必确保语法完全正确例如布尔值是yes/no不要有多余的空格或引号错误。一个更好的实践是先用nmcli connection modify做主要修改如果遇到nmcli不直接支持的非常小众的参数再手动编辑文件补充并立即执行reload。永远记得在修改前备份原文件。6. 故障排查当 nmcli 命令不按预期工作时即使命令语法正确有时也会遇到配置不生效的情况。下面是一个系统性的排查思路。第1步检查连接状态nmcli connection show --active nmcli device status确认你操作的连接NAME是否处于活跃ACTIVE状态它绑定在哪个设备DEVICE上设备本身的状态是“已连接”connected还是“已断开”disconnected第2步检查配置详情nmcli connection show 连接名仔细核对输出。你是否错误地使用了ipv4.addresses覆盖而不是ipv4.addresses追加ipv4.method设置正确吗manual为静态auto为 DHCP。DNS 和网关的格式对吗第3步查看 NetworkManager 日志日志是定位问题的金钥匙。sudo journalctl -u NetworkManager --since 5 minutes ago -f在另一个终端执行你的nmcli操作如up观察实时日志输出。常见的错误信息包括ipv4.gateway与ipv4.addresses不在同一子网。指定的ifname设备不存在。配置文件语法错误导致读取失败。第4步验证底层配置文件sudo cat /etc/sysconfig/network-scripts/ifcfg-连接名 # 或对于 keyfile 格式 sudo cat /etc/NetworkManager/system-connections/连接名.nmconnection检查文件权限通常应为root:root 600内容是否与nmcli connection show的输出逻辑一致。第5步尝试完全清理并重建如果问题依旧诡异可以尝试删除连接配置从零开始重建。这是一个终极手段。sudo nmcli connection delete 连接名 # 重新add sudo nmcli connection add ...在删除前可以用nmcli connection clone备份一下配置。一个常见坑连接被“卡住”有时你会发现连接处于“正在激活”activating状态一直无法完成。这可能是由于之前的配置进程没有完全退出或者与设备驱动有冲突。可以尝试sudo nmcli connection down 连接名 --wait 0 sudo nmcli device disconnect 设备名 # 如 ens192 # 等待几秒 sudo nmcli connection up 连接名device disconnect命令会强制从网络设备层断开比connection down更底层、更彻底。掌握nmcli管理网卡配置文件本质上是掌握了 NetworkManager 这套主流网络管理服务的命令行精髓。它让网络配置变得可追溯、可脚本化、可批量部署。从简单的静态 IP 设置到复杂的多网卡绑定和 VLAN 管理nmcli都能提供一致的操作界面。刚开始你可能会觉得命令参数繁多但一旦熟悉了show,add,modify,up,down这几个核心动作并结合--help和man页面查阅你会发现它远比在图形界面中点击或手动编辑文件要高效和可靠得多。尤其是在通过 SSH 管理无图形界面的服务器时nmcli是你唯一高效且安全的选择。