1. 网络管理新思路告别图形界面拥抱命令行效率如果你是一名Linux系统管理员或者正在学习服务器运维那么对网络配置一定不陌生。无论是给新服务器配置IP还是排查网络故障网络连接的管理都是最基础也最频繁的操作。过去我们可能习惯了在桌面环境中点击鼠标或者在/etc/network/interfaces或/etc/sysconfig/network-scripts/目录下小心翼翼地编辑配置文件。这些方法当然有效但在追求效率、自动化和远程管理的今天有没有更现代、更统一、更强大的工具呢答案是肯定的它就是NetworkManager的命令行伙伴——nmcli。nmcliNetworkManager Command-Line Interface绝不仅仅是一个“备用”工具。它是一套完整的网络配置与管理体系在命令行下的体现。对于没有图形界面的服务器、需要通过SSH远程管理的环境或者希望用脚本批量配置大量主机的场景nmcli的价值无可替代。它让你能够以清晰、结构化的方式完成从查看状态、创建连接到修改参数、启停设备的所有操作而且命令直观反馈明确。很多人觉得命令行网络配置很复杂但nmcli的设计恰恰是为了降低这种复杂性。通过这篇文章我将带你从零开始彻底掌握nmcli的核心用法。无论你是刚接触Linux的新手还是想更新自己工具箱的老手都能在这里找到可以直接“抄作业”的实操命令和背后的原理逻辑。我们会从最基础的查看信息开始一步步深入到配置静态IP、管理连接状态并分享一些我多年使用中总结出来的、官方文档里不会写的排查技巧和注意事项。让我们开始吧。2. nmcli核心概念与基础信息探查在动手配置之前我们必须先理解nmcli眼中的网络世界是如何组织的并学会如何查看当前系统的网络状态。这就像医生看病前的“望闻问切”准确的信息是正确操作的前提。2.1 理解nmcli的对象模型连接、设备与活动nmcli将网络世界抽象为几个核心对象理解它们的关系至关重要设备Device 这是物理或虚拟的网络接口硬件比如你的有线网卡enp0s3、无线网卡wlp2s0或者虚拟的VPN隧道tun0。你可以把它理解为电脑上的一个网络端口。连接Connection 这是一个配置档案Profile。它定义了如何配置一个设备包括IP地址、网关、DNS、Wi-Fi密码等所有参数。一个连接必须关联到一个设备上才能生效。关键点在于一个设备可以拥有多个连接配置但同一时间只能有一个连接被激活Active。这让你可以轻松地在“公司静态IP”、“家庭DHCP”、“测试网络”等多个配置间切换。活动Active 当一个连接被应用到一个设备上并成功启动后就形成了一个“活动”。它代表了“哪个连接正在哪个设备上运行”。这种设计的精妙之处在于实现了配置与硬件的解耦。你可以在不插网线的时候就创建好一个有线连接的配置连接等网线插入识别到设备后再激活这个连接。2.2 查看网络状态从概览到详情知道概念后我们来看如何获取信息。nmcli命令的基本语法是nmcli [OPTIONS] OBJECT { COMMAND | help }其中OBJECT就是我们刚才说的device设备、connection连接或general常规状态。不带任何参数直接运行nmcli会输出一个非常全面的状态概览包括NetworkManager本身的状态、所有连接和设备信息。但对于日常使用这个输出信息量过大。更常用的命令是查看设备状态nmcli device status这条命令是我最频繁使用的nmcli命令没有之一。它的输出简洁明了DEVICE TYPE STATE CONNECTION enp0s3 ethernet connected Wired-connection-1 wlp2s0 wifi disconnected -- lo loopback unmanaged --DEVICE: 设备名称。TYPE: 设备类型以太网、Wi-Fi等。STATE: 设备状态。connected已连接、disconnected未连接、unavailable不可用如网卡被禁用、unmanaged未受NetworkManager管理是关键状态。CONNECTION: 当前在该设备上激活的连接名称。如果显示--则表示该设备上没有激活任何连接。要查看所有已保存的连接配置档案无论其是否激活可以使用nmcli connection show输出会列出所有连接的名称、UUID、类型和对应的设备。UUID是每个连接的唯一标识符在脚本中用它来指定连接比用名称更可靠因为名称可能重复。当你需要更详细的信息时可以针对特定设备或连接进行查看。例如查看某个设备如enp0s3的详细信息和当前生效的配置nmcli device show enp0s3这条命令会输出包括IP地址、子网掩码、网关、DNS、MAC地址等在内的所有网络层详细信息是排查网络问题时第一个要运行的命令。同样查看某个连接如Wired-connection-1的详细配置内容nmcli connection show Wired-connection-1这会显示该连接配置档案中存储的所有设置值无论它当前是否被激活。实操心得-p选项让阅读更轻松在查看连接或设备详情时输出内容可能很长且格式紧凑。加上-ppretty选项可以让输出以更清晰、对齐的格式显示大大提升可读性。nmcli -p connection show Wired-connection-1这个技巧在查看包含大量IPv4/IPv6地址、路由等信息的配置时尤其有用。3. 核心实战使用nmcli配置静态IP连接配置静态IP是服务器管理中的常见任务。我们将一步步创建一个全新的以太网连接配置静态IP、网关和DNS并激活它。假设我们要为网卡enp0s3配置以下信息IP地址/子网掩码192.168.2.150/24默认网关192.168.2.1DNS服务器8.8.8.8和8.8.4.4连接名称my-static-eth3.1 创建连接配置档案创建连接的核心命令是nmcli connection add。这里有几个关键参数需要理解type ethernet: 指定连接类型为以太网。对于Wi-Fi则是type wifi。con-name “my-static-eth”: 为你创建的连接配置档案命名。ifname enp0s3: 指定这个连接配置将关联到哪个网络接口设备。ipv4.method manual:这是最关键的一步它声明我们将使用手动配置即静态IP而不是从DHCP服务器自动获取。如果不指定默认通常是autoDHCP。ipv4.addresses 192.168.2.150/24: 设置IPv4地址和前缀长度子网掩码。/24对应子网掩码255.255.255.0。ipv4.gateway 192.168.2.1: 设置默认网关。ipv4.dns “8.8.8.8 8.8.4.4”: 设置DNS服务器多个DNS用空格隔开。注意在add命令中直接设置DNS有时可能因shell解析引号出现问题更稳妥的做法是分两步走。综合以上创建连接的命令如下sudo nmcli connection add type ethernet \ con-name “my-static-eth” \ ifname enp0s3 \ ipv4.method manual \ ipv4.addresses 192.168.2.150/24 \ ipv4.gateway 192.168.2.1执行成功后会输出类似Connection ‘my-static-eth’ (uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) successfully added.的信息。此时连接配置已经保存但尚未激活设备enp0s3可能还处于disconnected状态或使用着之前的连接。3.2 配置DNS服务器接下来我们为这个连接配置DNS。使用nmcli connection modify命令来修改已存在连接的属性sudo nmcli connection modify “my-static-eth” ipv4.dns “8.8.8.8 8.8.4.4”这条命令修改了my-static-eth这个连接配置档案中的DNS设置。modify命令非常强大它可以修改连接的几乎任何属性且修改的是配置文件不会立即影响当前活跃的网络。3.3 激活连接配置完成后需要将连接“应用”到设备上使其生效。这就是激活up操作sudo nmcli connection up “my-static-eth” ifname enp0s3ifname enp0s3参数指定在哪个设备上激活此连接。虽然连接配置里已经关联了enp0s3但显式指定是一个好习惯可以避免歧义。激活后立即使用ip addr show enp0s3或nmcli device show enp0s3来验证IP地址、网关是否已正确配置。使用cat /etc/resolv.conf来验证DNS是否已更新NetworkManager会管理这个文件。注意事项连接命名与冲突连接名称con-name在系统中应该保持唯一。如果你尝试创建一个与现有连接同名的连接操作会失败。在脚本中创建连接时一个稳健的做法是先检查同名连接是否存在如果存在则删除旧配置sudo nmcli connection delete “my-static-eth” 2/dev/null; sudo nmcli connection add ...。另外连接名称最好具有描述性如office-static、home-wifi便于后期管理。3.4 修改现有连接的IP地址更多时候我们不是创建新连接而是修改现有的连接配置比如从DHCP改为静态IP。假设已有一个名为Wired-connection-1的DHCP连接我们要将其改为静态IP。首先强烈建议不要直接修改当前正在使用的活跃连接因为这可能导致网络中断使得后续命令无法执行。稳妥的做法是先创建当前连接的一个副本进行修改。或者先修改配置然后重启连接。方法一修改配置后重启连接# 1. 修改连接配置此时网络未受影响 sudo nmcli connection modify “Wired-connection-1” ipv4.method manual sudo nmcli connection modify “Wired-connection-1” ipv4.addresses “192.168.2.151/24” sudo nmcli connection modify “Wired-connection-1” ipv4.gateway “192.168.2.1” sudo nmcli connection modify “Wired-connection-1” ipv4.dns “8.8.8.8” # 2. 关闭再重新激活连接使修改生效 sudo nmcli connection down “Wired-connection-1” sudo nmcli connection up “Wired-connection-1”方法二克隆并修改新连接# 1. 克隆现有连接生成一个新配置档案 sudo nmcli connection clone “Wired-connection-1” “my-new-static” # 2. 修改克隆出来的新连接 sudo nmcli connection modify “my-new-static” ipv4.method manual sudo nmcli connection modify “my-new-static” ipv4.addresses “192.168.2.151/24” # ... 修改其他参数 # 3. 激活新连接旧连接会自动失效 sudo nmcli connection up “my-new-static” ifname enp0s3我个人更推荐方法二。它更安全保留了原始配置作为回滚选项并且整个过程如果出现问题可以简单地重新激活旧连接不会让系统陷入无网络状态。4. 连接生命周期管理启停、重载与删除创建和配置连接只是开始日常管理涉及连接的启用、禁用、重载重新应用配置和删除。4.1 启用与禁用连接启用激活连接的命令我们已经用过nmcli connection up [连接名或UUID]。禁用停用连接的命令是sudo nmcli connection down “my-static-eth”当连接被down掉之后对应的网络设备如enp0s3会进入disconnected状态不再有IP地址。这在需要临时断开网络或切换连接时非常有用。重要提示up和downvsdevice connect和disconnectnmcli提供了两套动词connection up/down和device connect/disconnect。connection up/down操作的是连接配置档案。up意味着“将这个配置应用到设备上”down意味着“停止使用这个配置”。device connect/disconnect操作的是物理设备。connect意味着“在这个设备上尝试自动连接一个可用的配置”disconnect意味着“断开这个设备”。 对于有明确配置的管理始终使用connection up/down。device connect更适合Wi-Fi场景让系统自动选择已知网络。4.2 重载连接配置如果你手动编辑了NetworkManager存储在/etc/NetworkManager/system-connections/目录下的连接配置文件不推荐或者通过其他方式修改了系统配置需要让NetworkManager重新读取这些配置sudo nmcli connection reload这个命令会重新加载所有连接配置文件但不会改变任何当前活动的连接状态。如果想让某个已激活的连接立即应用其配置文件的最新修改需要先down再up它。4.3 删除连接要永久删除一个连接配置档案sudo nmcli connection delete “my-static-eth”或者使用UUID删除sudo nmcli connection delete uuid xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx删除操作不可逆请谨慎执行。删除一个当前正在活跃的连接会立即导致该连接被关闭网络中断。4.4 自动连接与优先级管理一个有用的特性是设置连接“自动连接”。当设备可用时NetworkManager会自动尝试激活标记了autoconnect yes的连接。# 启用自动连接 sudo nmcli connection modify “my-static-eth” connection.autoconnect yes # 禁用自动连接 sudo nmcli connection modify “my-static-eth” connection.autoconnect no对于Wi-Fi或有线网络通常希望启用自动连接。对于VPN或特殊的临时连接则应禁用。当多个连接都启用了自动连接并适用于同一个设备时可以通过设置优先级来决定顺序sudo nmcli connection modify “connection-A” connection.autoconnect-priority 10 sudo nmcli connection modify “connection-B” connection.autoconnect-priority 5数字越大优先级越高。当enp0s3网线插入时NetworkManager会优先尝试激活connection-A。5. 高级配置与无线网络管理掌握了有线网络的基本操作后我们来看一些更高级的配置场景和无线网络的管理。5.1 配置IPv6地址IPv6的配置逻辑与IPv4类似。例如为连接添加一个静态IPv6地址sudo nmcli connection modify “my-static-eth” ipv6.method manual sudo nmcli connection modify “my-static-eth” ipv6.addresses “2001:db8::a/64” sudo nmcli connection modify “my-static-eth” ipv6.gateway “2001:db8::1” sudo nmcli connection modify “my-static-eth” ipv6.dns “2001:4860:4860::8888”同样使用ipv6.method auto可以启用无状态或有状态的自动配置如SLAAC或DHCPv6。5.2 配置路由静态路由除了默认网关有时需要添加额外的静态路由。例如让到达10.8.0.0/24网段的流量走网关192.168.2.254sudo nmcli connection modify “my-static-eth” ipv4.routes “10.8.0.0/24 192.168.2.254”注意命令中的号它表示“添加”一个路由条目到现有列表中。如果使用ipv4.routes而不带则会覆盖所有已有的路由设置。要删除某条特定路由使用-号sudo nmcli connection modify “my-static-eth” -ipv4.routes “10.8.0.0/24 192.168.2.254”5.3 管理Wi-Fi连接对于无线网络nmcli同样强大。首先扫描可用的Wi-Fi网络nmcli device wifi list这会列出所有扫描到的SSID、信号强度、安全类型等信息。要连接到一个开放的Wi-Fi网络sudo nmcli device wifi connect “SSID名称”要连接到一个使用WPA/WPA2保护的Wi-Fi网络需要提供密码sudo nmcli device wifi connect “SSID名称” password “你的密码”这条命令会创建一个以SSID命名的连接配置并立即激活。你也可以像配置有线连接一样先创建配置档案再进行更详细的设置# 创建Wi-Fi连接配置 sudo nmcli connection add type wifi con-name “my-home-wifi” ifname wlp2s0 ssid “Home-Network” # 配置安全协议和密码 sudo nmcli connection modify “my-home-wifi” wifi-sec.key-mgmt wpa-psk sudo nmcli connection modify “my-home-wifi” wifi-sec.psk “strong_password” # 配置IP获取方式如DHCP sudo nmcli connection modify “my-home-wifi” ipv4.method auto # 激活连接 sudo nmcli connection up “my-home-wifi”5.4 使用交互式编辑器对于复杂的配置或者你不记得确切的参数名nmcli提供了一个非常方便的交互式文本编辑器sudo nmcli connection edit “my-static-eth”进入编辑模式后你可以使用print查看所有设置使用set修改属性会有Tab补全提示使用save保存使用quit退出。这对于探索和修改不常用的配置项特别有帮助。6. 故障排查与实用技巧实录即使命令正确在实际操作中也可能遇到各种问题。这里分享一些我踩过坑后总结的排查思路和技巧。6.1 连接激活失败的常见原因当你执行nmcli connection up后连接失败可以按以下顺序排查检查设备状态首先运行nmcli device status。确认目标设备如enp0s3的状态不是unmanaged或unavailable。如果是unmanaged说明NetworkManager没有管理该设备可能需要在/etc/NetworkManager/NetworkManager.conf中修改配置或者使用nmcli device set enp0s3 managed yes来启用管理。检查连接配置运行nmcli connection show “连接名”仔细核对ipv4.method、ipv4.addresses、ipv4.gateway是否正确。一个常见的错误是IP地址和网关不在同一个子网内。查看详细日志NetworkManager的日志是排查问题的金矿。使用journalctl查看相关日志sudo journalctl -u NetworkManager --since “5 minutes ago” | tail -50或者更聚焦于某个设备sudo journalctl -u NetworkManager -f | grep “enp0s3”日志会明确告诉你激活失败的原因比如“IP配置超时”、“没有可用的载波”网线没插等。手动测试IP配置在激活连接前可以尝试手动用ip命令配置IP测试是否可行sudo ip addr add 192.168.2.150/24 dev enp0s3 sudo ip route add default via 192.168.2.1如果手动配置能通说明网络环境和参数本身没问题问题可能出在NetworkManager的配置或服务上。6.2 DNS不生效的问题配置了DNS但ping www.baidu.com不通而ping 8.8.8.8通这通常是DNS问题。检查/etc/resolv.conf这个文件由NetworkManager管理。检查其内容是否包含了你配置的DNS服务器。如果没有可能是NetworkManager没有正确更新它。可以尝试重启NetworkManager服务sudo systemctl restart NetworkManager。检查连接配置中的DNS确保ipv4.dns和ipv6.dns已正确设置。注意如果连接配置中设置了DNS但系统还通过/etc/resolv.conf或其他方式如systemd-resolved配置了其他DNS可能会产生冲突。在一些发行版如Ubuntu 18.04上DNS可能由systemd-resolved管理你需要检查nmcli的ipv4.dns-priority设置或考虑在NetworkManager配置中设置dnsdefault。使用nmcli检查生效的DNS最准确的方法是查看设备生效的配置nmcli device show enp0s3 | grep DNS。6.3 连接配置文件的位置与备份nmcli创建的连接配置档案默认存储在/etc/NetworkManager/system-connections/目录下每个连接一个文件文件名是连接名后缀为.nmconnection。这些文件是INI格式可以直接阅读但不建议直接手动编辑因为NetworkManager可能不会立即感知到变化且格式错误会导致连接损坏。备份所有网络配置是一个好习惯sudo tar -czf network-backup.tar.gz /etc/NetworkManager/system-connections/如果需要将一台服务器的网络配置迁移到另一台复制这些文件并修改可能特定的设备名interface-name是一种方法。6.4 性能与脚本化技巧批量操作与脚本nmcli的卓越之处在于易于脚本化。例如用一个循环为多台服务器配置相同的静态IP#!/bin/bash CONN_NAME“prod-static” IP_BASE“10.0.0” GATEWAY“10.0.0.1” for i in {50..55}; do ssh node-$i “sudo nmcli connection add type ethernet con-name \$CONN_NAME ifname eth0 ipv4.method manual ipv4.addresses ${IP_BASE}.$i/24 ipv4.gateway \$GATEWAY ipv4.dns ‘8.8.8.8’ sudo nmcli connection up \$CONN_NAME” done输出格式化用于监控在监控脚本中你可能只需要提取特定信息。nmcli的-tterse和-ffields选项可以输出机器可读的格式nmcli -t -f DEVICE,STATE device status输出为enp0s3:connected便于用awk、cut等工具解析。超时设置在慢速或复杂的网络环境中如某些企业网需要802.1X认证默认的超时可能太短。你可以在连接配置中增加超时时间sudo nmcli connection modify “my-802.1x-conn” 802-1x.auth-timeout 306.5 从传统配置方式迁移如果你有一个旧的/etc/network/interfaces配置想迁移到NetworkManager管理步骤通常是确保NetworkManager不会忽略该接口在/etc/NetworkManager/NetworkManager.conf的[keyfile]部分不要用unmanaged-devices排除它。使用nmcli根据旧配置创建一个新的连接。注释掉或删除/etc/network/interfaces中对应接口的配置避免冲突。重启网络服务或服务器验证新配置生效。我个人在实际操作中的体会是nmcli的掌握曲线是前期陡峭后期平坦。一开始需要记忆一些对象和命令格式但一旦熟悉其逻辑的一致性和操作的效率是传统方法无法比拟的。尤其是在通过跳板机管理大量云服务器时一条精心编写的nmcli命令脚本比手动编辑配置文件或使用各家云平台不同的网络管理界面要可靠和高效得多。最后再分享一个小技巧对于任何你不确定的nmcli操作尤其是修改生产环境可以先在一个测试连接比如克隆一个现有连接并改名上试验确认无误后再应用到主连接上这是最稳妥的实践。
Linux网络管理利器:nmcli命令行配置静态IP与无线网络实战
发布时间:2026/5/17 0:18:46
1. 网络管理新思路告别图形界面拥抱命令行效率如果你是一名Linux系统管理员或者正在学习服务器运维那么对网络配置一定不陌生。无论是给新服务器配置IP还是排查网络故障网络连接的管理都是最基础也最频繁的操作。过去我们可能习惯了在桌面环境中点击鼠标或者在/etc/network/interfaces或/etc/sysconfig/network-scripts/目录下小心翼翼地编辑配置文件。这些方法当然有效但在追求效率、自动化和远程管理的今天有没有更现代、更统一、更强大的工具呢答案是肯定的它就是NetworkManager的命令行伙伴——nmcli。nmcliNetworkManager Command-Line Interface绝不仅仅是一个“备用”工具。它是一套完整的网络配置与管理体系在命令行下的体现。对于没有图形界面的服务器、需要通过SSH远程管理的环境或者希望用脚本批量配置大量主机的场景nmcli的价值无可替代。它让你能够以清晰、结构化的方式完成从查看状态、创建连接到修改参数、启停设备的所有操作而且命令直观反馈明确。很多人觉得命令行网络配置很复杂但nmcli的设计恰恰是为了降低这种复杂性。通过这篇文章我将带你从零开始彻底掌握nmcli的核心用法。无论你是刚接触Linux的新手还是想更新自己工具箱的老手都能在这里找到可以直接“抄作业”的实操命令和背后的原理逻辑。我们会从最基础的查看信息开始一步步深入到配置静态IP、管理连接状态并分享一些我多年使用中总结出来的、官方文档里不会写的排查技巧和注意事项。让我们开始吧。2. nmcli核心概念与基础信息探查在动手配置之前我们必须先理解nmcli眼中的网络世界是如何组织的并学会如何查看当前系统的网络状态。这就像医生看病前的“望闻问切”准确的信息是正确操作的前提。2.1 理解nmcli的对象模型连接、设备与活动nmcli将网络世界抽象为几个核心对象理解它们的关系至关重要设备Device 这是物理或虚拟的网络接口硬件比如你的有线网卡enp0s3、无线网卡wlp2s0或者虚拟的VPN隧道tun0。你可以把它理解为电脑上的一个网络端口。连接Connection 这是一个配置档案Profile。它定义了如何配置一个设备包括IP地址、网关、DNS、Wi-Fi密码等所有参数。一个连接必须关联到一个设备上才能生效。关键点在于一个设备可以拥有多个连接配置但同一时间只能有一个连接被激活Active。这让你可以轻松地在“公司静态IP”、“家庭DHCP”、“测试网络”等多个配置间切换。活动Active 当一个连接被应用到一个设备上并成功启动后就形成了一个“活动”。它代表了“哪个连接正在哪个设备上运行”。这种设计的精妙之处在于实现了配置与硬件的解耦。你可以在不插网线的时候就创建好一个有线连接的配置连接等网线插入识别到设备后再激活这个连接。2.2 查看网络状态从概览到详情知道概念后我们来看如何获取信息。nmcli命令的基本语法是nmcli [OPTIONS] OBJECT { COMMAND | help }其中OBJECT就是我们刚才说的device设备、connection连接或general常规状态。不带任何参数直接运行nmcli会输出一个非常全面的状态概览包括NetworkManager本身的状态、所有连接和设备信息。但对于日常使用这个输出信息量过大。更常用的命令是查看设备状态nmcli device status这条命令是我最频繁使用的nmcli命令没有之一。它的输出简洁明了DEVICE TYPE STATE CONNECTION enp0s3 ethernet connected Wired-connection-1 wlp2s0 wifi disconnected -- lo loopback unmanaged --DEVICE: 设备名称。TYPE: 设备类型以太网、Wi-Fi等。STATE: 设备状态。connected已连接、disconnected未连接、unavailable不可用如网卡被禁用、unmanaged未受NetworkManager管理是关键状态。CONNECTION: 当前在该设备上激活的连接名称。如果显示--则表示该设备上没有激活任何连接。要查看所有已保存的连接配置档案无论其是否激活可以使用nmcli connection show输出会列出所有连接的名称、UUID、类型和对应的设备。UUID是每个连接的唯一标识符在脚本中用它来指定连接比用名称更可靠因为名称可能重复。当你需要更详细的信息时可以针对特定设备或连接进行查看。例如查看某个设备如enp0s3的详细信息和当前生效的配置nmcli device show enp0s3这条命令会输出包括IP地址、子网掩码、网关、DNS、MAC地址等在内的所有网络层详细信息是排查网络问题时第一个要运行的命令。同样查看某个连接如Wired-connection-1的详细配置内容nmcli connection show Wired-connection-1这会显示该连接配置档案中存储的所有设置值无论它当前是否被激活。实操心得-p选项让阅读更轻松在查看连接或设备详情时输出内容可能很长且格式紧凑。加上-ppretty选项可以让输出以更清晰、对齐的格式显示大大提升可读性。nmcli -p connection show Wired-connection-1这个技巧在查看包含大量IPv4/IPv6地址、路由等信息的配置时尤其有用。3. 核心实战使用nmcli配置静态IP连接配置静态IP是服务器管理中的常见任务。我们将一步步创建一个全新的以太网连接配置静态IP、网关和DNS并激活它。假设我们要为网卡enp0s3配置以下信息IP地址/子网掩码192.168.2.150/24默认网关192.168.2.1DNS服务器8.8.8.8和8.8.4.4连接名称my-static-eth3.1 创建连接配置档案创建连接的核心命令是nmcli connection add。这里有几个关键参数需要理解type ethernet: 指定连接类型为以太网。对于Wi-Fi则是type wifi。con-name “my-static-eth”: 为你创建的连接配置档案命名。ifname enp0s3: 指定这个连接配置将关联到哪个网络接口设备。ipv4.method manual:这是最关键的一步它声明我们将使用手动配置即静态IP而不是从DHCP服务器自动获取。如果不指定默认通常是autoDHCP。ipv4.addresses 192.168.2.150/24: 设置IPv4地址和前缀长度子网掩码。/24对应子网掩码255.255.255.0。ipv4.gateway 192.168.2.1: 设置默认网关。ipv4.dns “8.8.8.8 8.8.4.4”: 设置DNS服务器多个DNS用空格隔开。注意在add命令中直接设置DNS有时可能因shell解析引号出现问题更稳妥的做法是分两步走。综合以上创建连接的命令如下sudo nmcli connection add type ethernet \ con-name “my-static-eth” \ ifname enp0s3 \ ipv4.method manual \ ipv4.addresses 192.168.2.150/24 \ ipv4.gateway 192.168.2.1执行成功后会输出类似Connection ‘my-static-eth’ (uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) successfully added.的信息。此时连接配置已经保存但尚未激活设备enp0s3可能还处于disconnected状态或使用着之前的连接。3.2 配置DNS服务器接下来我们为这个连接配置DNS。使用nmcli connection modify命令来修改已存在连接的属性sudo nmcli connection modify “my-static-eth” ipv4.dns “8.8.8.8 8.8.4.4”这条命令修改了my-static-eth这个连接配置档案中的DNS设置。modify命令非常强大它可以修改连接的几乎任何属性且修改的是配置文件不会立即影响当前活跃的网络。3.3 激活连接配置完成后需要将连接“应用”到设备上使其生效。这就是激活up操作sudo nmcli connection up “my-static-eth” ifname enp0s3ifname enp0s3参数指定在哪个设备上激活此连接。虽然连接配置里已经关联了enp0s3但显式指定是一个好习惯可以避免歧义。激活后立即使用ip addr show enp0s3或nmcli device show enp0s3来验证IP地址、网关是否已正确配置。使用cat /etc/resolv.conf来验证DNS是否已更新NetworkManager会管理这个文件。注意事项连接命名与冲突连接名称con-name在系统中应该保持唯一。如果你尝试创建一个与现有连接同名的连接操作会失败。在脚本中创建连接时一个稳健的做法是先检查同名连接是否存在如果存在则删除旧配置sudo nmcli connection delete “my-static-eth” 2/dev/null; sudo nmcli connection add ...。另外连接名称最好具有描述性如office-static、home-wifi便于后期管理。3.4 修改现有连接的IP地址更多时候我们不是创建新连接而是修改现有的连接配置比如从DHCP改为静态IP。假设已有一个名为Wired-connection-1的DHCP连接我们要将其改为静态IP。首先强烈建议不要直接修改当前正在使用的活跃连接因为这可能导致网络中断使得后续命令无法执行。稳妥的做法是先创建当前连接的一个副本进行修改。或者先修改配置然后重启连接。方法一修改配置后重启连接# 1. 修改连接配置此时网络未受影响 sudo nmcli connection modify “Wired-connection-1” ipv4.method manual sudo nmcli connection modify “Wired-connection-1” ipv4.addresses “192.168.2.151/24” sudo nmcli connection modify “Wired-connection-1” ipv4.gateway “192.168.2.1” sudo nmcli connection modify “Wired-connection-1” ipv4.dns “8.8.8.8” # 2. 关闭再重新激活连接使修改生效 sudo nmcli connection down “Wired-connection-1” sudo nmcli connection up “Wired-connection-1”方法二克隆并修改新连接# 1. 克隆现有连接生成一个新配置档案 sudo nmcli connection clone “Wired-connection-1” “my-new-static” # 2. 修改克隆出来的新连接 sudo nmcli connection modify “my-new-static” ipv4.method manual sudo nmcli connection modify “my-new-static” ipv4.addresses “192.168.2.151/24” # ... 修改其他参数 # 3. 激活新连接旧连接会自动失效 sudo nmcli connection up “my-new-static” ifname enp0s3我个人更推荐方法二。它更安全保留了原始配置作为回滚选项并且整个过程如果出现问题可以简单地重新激活旧连接不会让系统陷入无网络状态。4. 连接生命周期管理启停、重载与删除创建和配置连接只是开始日常管理涉及连接的启用、禁用、重载重新应用配置和删除。4.1 启用与禁用连接启用激活连接的命令我们已经用过nmcli connection up [连接名或UUID]。禁用停用连接的命令是sudo nmcli connection down “my-static-eth”当连接被down掉之后对应的网络设备如enp0s3会进入disconnected状态不再有IP地址。这在需要临时断开网络或切换连接时非常有用。重要提示up和downvsdevice connect和disconnectnmcli提供了两套动词connection up/down和device connect/disconnect。connection up/down操作的是连接配置档案。up意味着“将这个配置应用到设备上”down意味着“停止使用这个配置”。device connect/disconnect操作的是物理设备。connect意味着“在这个设备上尝试自动连接一个可用的配置”disconnect意味着“断开这个设备”。 对于有明确配置的管理始终使用connection up/down。device connect更适合Wi-Fi场景让系统自动选择已知网络。4.2 重载连接配置如果你手动编辑了NetworkManager存储在/etc/NetworkManager/system-connections/目录下的连接配置文件不推荐或者通过其他方式修改了系统配置需要让NetworkManager重新读取这些配置sudo nmcli connection reload这个命令会重新加载所有连接配置文件但不会改变任何当前活动的连接状态。如果想让某个已激活的连接立即应用其配置文件的最新修改需要先down再up它。4.3 删除连接要永久删除一个连接配置档案sudo nmcli connection delete “my-static-eth”或者使用UUID删除sudo nmcli connection delete uuid xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx删除操作不可逆请谨慎执行。删除一个当前正在活跃的连接会立即导致该连接被关闭网络中断。4.4 自动连接与优先级管理一个有用的特性是设置连接“自动连接”。当设备可用时NetworkManager会自动尝试激活标记了autoconnect yes的连接。# 启用自动连接 sudo nmcli connection modify “my-static-eth” connection.autoconnect yes # 禁用自动连接 sudo nmcli connection modify “my-static-eth” connection.autoconnect no对于Wi-Fi或有线网络通常希望启用自动连接。对于VPN或特殊的临时连接则应禁用。当多个连接都启用了自动连接并适用于同一个设备时可以通过设置优先级来决定顺序sudo nmcli connection modify “connection-A” connection.autoconnect-priority 10 sudo nmcli connection modify “connection-B” connection.autoconnect-priority 5数字越大优先级越高。当enp0s3网线插入时NetworkManager会优先尝试激活connection-A。5. 高级配置与无线网络管理掌握了有线网络的基本操作后我们来看一些更高级的配置场景和无线网络的管理。5.1 配置IPv6地址IPv6的配置逻辑与IPv4类似。例如为连接添加一个静态IPv6地址sudo nmcli connection modify “my-static-eth” ipv6.method manual sudo nmcli connection modify “my-static-eth” ipv6.addresses “2001:db8::a/64” sudo nmcli connection modify “my-static-eth” ipv6.gateway “2001:db8::1” sudo nmcli connection modify “my-static-eth” ipv6.dns “2001:4860:4860::8888”同样使用ipv6.method auto可以启用无状态或有状态的自动配置如SLAAC或DHCPv6。5.2 配置路由静态路由除了默认网关有时需要添加额外的静态路由。例如让到达10.8.0.0/24网段的流量走网关192.168.2.254sudo nmcli connection modify “my-static-eth” ipv4.routes “10.8.0.0/24 192.168.2.254”注意命令中的号它表示“添加”一个路由条目到现有列表中。如果使用ipv4.routes而不带则会覆盖所有已有的路由设置。要删除某条特定路由使用-号sudo nmcli connection modify “my-static-eth” -ipv4.routes “10.8.0.0/24 192.168.2.254”5.3 管理Wi-Fi连接对于无线网络nmcli同样强大。首先扫描可用的Wi-Fi网络nmcli device wifi list这会列出所有扫描到的SSID、信号强度、安全类型等信息。要连接到一个开放的Wi-Fi网络sudo nmcli device wifi connect “SSID名称”要连接到一个使用WPA/WPA2保护的Wi-Fi网络需要提供密码sudo nmcli device wifi connect “SSID名称” password “你的密码”这条命令会创建一个以SSID命名的连接配置并立即激活。你也可以像配置有线连接一样先创建配置档案再进行更详细的设置# 创建Wi-Fi连接配置 sudo nmcli connection add type wifi con-name “my-home-wifi” ifname wlp2s0 ssid “Home-Network” # 配置安全协议和密码 sudo nmcli connection modify “my-home-wifi” wifi-sec.key-mgmt wpa-psk sudo nmcli connection modify “my-home-wifi” wifi-sec.psk “strong_password” # 配置IP获取方式如DHCP sudo nmcli connection modify “my-home-wifi” ipv4.method auto # 激活连接 sudo nmcli connection up “my-home-wifi”5.4 使用交互式编辑器对于复杂的配置或者你不记得确切的参数名nmcli提供了一个非常方便的交互式文本编辑器sudo nmcli connection edit “my-static-eth”进入编辑模式后你可以使用print查看所有设置使用set修改属性会有Tab补全提示使用save保存使用quit退出。这对于探索和修改不常用的配置项特别有帮助。6. 故障排查与实用技巧实录即使命令正确在实际操作中也可能遇到各种问题。这里分享一些我踩过坑后总结的排查思路和技巧。6.1 连接激活失败的常见原因当你执行nmcli connection up后连接失败可以按以下顺序排查检查设备状态首先运行nmcli device status。确认目标设备如enp0s3的状态不是unmanaged或unavailable。如果是unmanaged说明NetworkManager没有管理该设备可能需要在/etc/NetworkManager/NetworkManager.conf中修改配置或者使用nmcli device set enp0s3 managed yes来启用管理。检查连接配置运行nmcli connection show “连接名”仔细核对ipv4.method、ipv4.addresses、ipv4.gateway是否正确。一个常见的错误是IP地址和网关不在同一个子网内。查看详细日志NetworkManager的日志是排查问题的金矿。使用journalctl查看相关日志sudo journalctl -u NetworkManager --since “5 minutes ago” | tail -50或者更聚焦于某个设备sudo journalctl -u NetworkManager -f | grep “enp0s3”日志会明确告诉你激活失败的原因比如“IP配置超时”、“没有可用的载波”网线没插等。手动测试IP配置在激活连接前可以尝试手动用ip命令配置IP测试是否可行sudo ip addr add 192.168.2.150/24 dev enp0s3 sudo ip route add default via 192.168.2.1如果手动配置能通说明网络环境和参数本身没问题问题可能出在NetworkManager的配置或服务上。6.2 DNS不生效的问题配置了DNS但ping www.baidu.com不通而ping 8.8.8.8通这通常是DNS问题。检查/etc/resolv.conf这个文件由NetworkManager管理。检查其内容是否包含了你配置的DNS服务器。如果没有可能是NetworkManager没有正确更新它。可以尝试重启NetworkManager服务sudo systemctl restart NetworkManager。检查连接配置中的DNS确保ipv4.dns和ipv6.dns已正确设置。注意如果连接配置中设置了DNS但系统还通过/etc/resolv.conf或其他方式如systemd-resolved配置了其他DNS可能会产生冲突。在一些发行版如Ubuntu 18.04上DNS可能由systemd-resolved管理你需要检查nmcli的ipv4.dns-priority设置或考虑在NetworkManager配置中设置dnsdefault。使用nmcli检查生效的DNS最准确的方法是查看设备生效的配置nmcli device show enp0s3 | grep DNS。6.3 连接配置文件的位置与备份nmcli创建的连接配置档案默认存储在/etc/NetworkManager/system-connections/目录下每个连接一个文件文件名是连接名后缀为.nmconnection。这些文件是INI格式可以直接阅读但不建议直接手动编辑因为NetworkManager可能不会立即感知到变化且格式错误会导致连接损坏。备份所有网络配置是一个好习惯sudo tar -czf network-backup.tar.gz /etc/NetworkManager/system-connections/如果需要将一台服务器的网络配置迁移到另一台复制这些文件并修改可能特定的设备名interface-name是一种方法。6.4 性能与脚本化技巧批量操作与脚本nmcli的卓越之处在于易于脚本化。例如用一个循环为多台服务器配置相同的静态IP#!/bin/bash CONN_NAME“prod-static” IP_BASE“10.0.0” GATEWAY“10.0.0.1” for i in {50..55}; do ssh node-$i “sudo nmcli connection add type ethernet con-name \$CONN_NAME ifname eth0 ipv4.method manual ipv4.addresses ${IP_BASE}.$i/24 ipv4.gateway \$GATEWAY ipv4.dns ‘8.8.8.8’ sudo nmcli connection up \$CONN_NAME” done输出格式化用于监控在监控脚本中你可能只需要提取特定信息。nmcli的-tterse和-ffields选项可以输出机器可读的格式nmcli -t -f DEVICE,STATE device status输出为enp0s3:connected便于用awk、cut等工具解析。超时设置在慢速或复杂的网络环境中如某些企业网需要802.1X认证默认的超时可能太短。你可以在连接配置中增加超时时间sudo nmcli connection modify “my-802.1x-conn” 802-1x.auth-timeout 306.5 从传统配置方式迁移如果你有一个旧的/etc/network/interfaces配置想迁移到NetworkManager管理步骤通常是确保NetworkManager不会忽略该接口在/etc/NetworkManager/NetworkManager.conf的[keyfile]部分不要用unmanaged-devices排除它。使用nmcli根据旧配置创建一个新的连接。注释掉或删除/etc/network/interfaces中对应接口的配置避免冲突。重启网络服务或服务器验证新配置生效。我个人在实际操作中的体会是nmcli的掌握曲线是前期陡峭后期平坦。一开始需要记忆一些对象和命令格式但一旦熟悉其逻辑的一致性和操作的效率是传统方法无法比拟的。尤其是在通过跳板机管理大量云服务器时一条精心编写的nmcli命令脚本比手动编辑配置文件或使用各家云平台不同的网络管理界面要可靠和高效得多。最后再分享一个小技巧对于任何你不确定的nmcli操作尤其是修改生产环境可以先在一个测试连接比如克隆一个现有连接并改名上试验确认无误后再应用到主连接上这是最稳妥的实践。