nmcli(NetworkManager Command-Line Interface)是 Linux 系统中 NetworkManager 服务的核心命令行工具,用于控制网络管理服务和报告网络状态。它功能全面,支持创建、显示、编辑、删除、激活和停用网络连接,以及控制和显示网络设备状态,是图形界面 nm-applet 的完美替代,尤其适合服务器环境和自动化脚本。
一、核心概念:设备(Device)与连接(Connection)
nmcli 中有两个最基础且必须理解的概念,这是掌握 nmcli 的关键:
| 概念 | 定义 | 特点 |
|---|---|---|
| 设备(Device) | 物理或虚拟的网络接口(如 eth0、wlan0、virbr0、bond0) | 网络连接的"硬件载体",具有物理属性,如 MAC 地址 |
| 连接(Connection) | 网络配置的"逻辑集合"(包含 IP、网关、DNS、路由等参数) | 一个设备可对应多个连接,但同一时间只能激活一个;连接可在设备间迁移 |
NetworkManager 以连接配置文件 的形式存储网络设置,默认位于 /etc/NetworkManager/system-connections/ 目录下,每个文件对应一个连接配置。
二、nmcli 基础命令与环境准备
2.1 检查 NetworkManager 状态
使用 nmcli 前,必须确保 NetworkManager 服务正常运行:
bash
# 检查服务状态
systemctl status NetworkManager
# 启动服务(如未运行)
sudo systemctl start NetworkManager
# 设置开机自启
sudo systemctl enable NetworkManager
2.2 nmcli 帮助系统
nmcli 提供了完善的内置帮助,可快速查询命令用法:
bash
# 查看 nmcli 整体帮助(列出所有核心子命令)
nmcli --help 或 nmcli help
# 查看特定子命令帮助(如 connection)
nmcli connection --help 或 nmcli con help
# 查看子命令下具体操作的帮助(如 connection add)
nmcli connection add --help
2.3 核心子命令概览
nmcli 有 8 个核心子命令,覆盖所有网络管理功能:
| 子命令 | 作用 | 常用操作 |
|---|---|---|
| general | 显示 NetworkManager 整体状态和配置 | status, hostname, permissions |
| networking | 控制整体网络状态 | on, off, connectivity |
| radio | 控制无线设备开关 | wifi on/off, wwan on/off |
| connection | 管理网络连接配置 | show, add, modify, up, down, delete |
| device | 管理网络设备 | status, show, connect, disconnect, wifi |
| agent | 管理 secret agent 或 polkit agent | - |
| monitor | 实时监控网络状态变化 | - |
| help | 显示帮助信息 | - |
三、nmcli 核心操作
3.1 信息查询命令(排错/确认环境首选)
bash
# 1. 查看 NetworkManager 整体状态
nmcli general status
# 2. 查看网络连接状态(显示所有连接,包括非活跃的)
nmcli connection show 或 nmcli con show
# 3. 仅显示活跃连接
nmcli connection show --active 或 nmcli con show --active
# 4. 查看指定连接的详细配置
nmcli connection show "Wired connection 1" 或 nmcli con show eth0
# 5. 查看网络设备状态
nmcli device status 或 nmcli dev status
# 6. 查看指定设备的详细信息
nmcli device show eth0 或 nmcli dev show wlan0
# 7. 检查网络连通性
nmcli networking connectivity # 输出: none/portal/limited/full
# 8. 查看无线设备状态
nmcli radio wifi # 输出: enabled/disabled
| 条件 | 状态 |
|---|---|
| 无接口/IP | none |
| HTTP被重定向 | portal |
| 有网但外网失败 | limited |
| 一切正常 | full |
3.2 网络连接管理(最常用功能)
3.2.1 创建新连接
以太网连接(静态 IP):
bash
sudo nmcli connection add \
con-name "static-eth0" \ # 连接名称
type ethernet \ # 连接类型
ifname eth0 \ # 绑定设备
autoconnect yes \ # 开机自启
ipv4.method manual \ # 静态IP模式
ipv4.addresses 192.168.1.100/24 \ # IP地址/子网掩码
ipv4.gateway 192.168.1.1 \ # 网关
ipv4.dns "8.8.8.8,8.8.4.4" \ # DNS服务器
ipv4.dns-search "example.com" # DNS搜索域
以太网连接(DHCP):
bash
sudo nmcli connection add \
con-name "dhcp-eth0" \
type ethernet \
ifname eth0 \
autoconnect yes \
ipv4.method auto # DHCP模式
Wi-Fi 连接:
bash
# 1. 扫描可用 Wi-Fi 热点
nmcli device wifi list 或 nmcli dev wifi list
# 2. 创建并连接到 Wi-Fi(WPA2 加密)
sudo nmcli connection add \
con-name "my-wifi" \
type wifi \
ifname wlan0 \
autoconnect yes \
ssid "MyHomeWiFi" \
wifi-sec.key-mgmt wpa-psk \ # 加密类型
wifi-sec.psk "mypassword123" # Wi-Fi密码
# 3. 简化连接方式(自动创建连接配置)
sudo nmcli device wifi connect "MyHomeWiFi" password "mypassword123" ifname wlan0
3.2.2 激活/停用连接
bash
# 激活连接(使配置生效)
sudo nmcli connection up "static-eth0" 或 sudo nmcli con up eth0
# 停用连接
sudo nmcli connection down "static-eth0" 或 sudo nmcli con down eth0
3.2.3 修改现有连接配置
nmcli 使用 modify 子命令修改连接属性,基本语法:
bash
sudo nmcli connection modify <连接名> <setting>.<property> <value>
常用修改示例:
bash
# 1. 修改 IP 地址为静态
sudo nmcli con mod "dhcp-eth0" ipv4.method manual ipv4.addresses 192.168.1.101/24
# 2. 添加第二个 IP 地址
sudo nmcli con mod "static-eth0" +ipv4.addresses 192.168.1.102/24
# 3. 修改网关
sudo nmcli con mod "static-eth0" ipv4.gateway 192.168.1.254
# 4. 修改 DNS 服务器
sudo nmcli con mod "static-eth0" ipv4.dns "114.114.114.114,8.8.8.8"
# 5. 启用/禁用开机自启
sudo nmcli con mod "static-eth0" connection.autoconnect yes/no
# 6. 修改连接绑定的设备
sudo nmcli con mod "static-eth0" connection.interface-name eth1
3.2.4 删除连接
bash
sudo nmcli connection delete "my-wifi" 或 sudo nmcli con del "my-wifi"
3.3 设备管理命令
bash
# 1. 断开设备连接(保留连接配置)
sudo nmcli device disconnect eth0 或 sudo nmcli dev dis eth0
# 2. 重新连接设备(使用现有连接配置)
sudo nmcli device connect eth0 或 sudo nmcli dev connect eth0
# 3. 标记设备为托管/非托管(非托管设备 NetworkManager 不管理)
sudo nmcli device set eth0 managed yes/no
# 4. 重新加载设备配置
sudo nmcli device reapply eth0
四、nmcli 高级网络配置
4.1 配置网络绑定(Bonding)
网络绑定将多个物理网卡绑定为一个逻辑接口,提高带宽或实现冗余:
bash
# 1. 创建绑定接口(mode 可选:balance-rr(0), active-backup(1), balance-xor(2), broadcast(3), 802.3ad(4), balance-tlb(5), balance-alb(6))
sudo nmcli con add type bond con-name bond0 ifname bond0 bond.mode active-backup bond.miimon 100
# 2. 添加从设备(将 eth0 和 eth1 加入 bond0)
sudo nmcli con add type ethernet con-name bond0-slave-eth0 ifname eth0 master bond0
sudo nmcli con add type ethernet con-name bond0-slave-eth1 ifname eth1 master bond0
# 3. 激活绑定和从设备
sudo nmcli con up bond0
sudo nmcli con up bond0-slave-eth0
sudo nmcli con up bond0-slave-eth1
4.2 配置网桥(Bridge)
网桥用于连接多个网络段,常用于虚拟化环境(如 KVM):
bash
# 1. 创建网桥接口
sudo nmcli con add type bridge con-name br0 ifname br0 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8
# 2. 将物理网卡加入网桥(清除原有配置)
sudo nmcli con add type ethernet con-name br0-slave-eth0 ifname eth0 master br0
# 3. 激活网桥和从设备
sudo nmcli con up br0
sudo nmcli con up br0-slave-eth0
4.3 配置 VLAN 接口
VLAN 用于在单一物理网络中划分多个逻辑网络:
bash
# 创建 VLAN 接口(id 为 VLAN 标签,parent 为父接口)
sudo nmcli con add type vlan con-name vlan10 ifname eth0.10 dev eth0 id 10 ipv4.method manual ipv4.addresses 192.168.10.100/24
# 激活 VLAN 接口
sudo nmcli con up vlan10
4.4 配置团队(Team)接口
Team 是 Bonding 的替代方案,提供更灵活的负载均衡和故障转移策略:
bash
# 1. 创建 team 接口(config 为 JSON 格式的团队配置)
sudo nmcli con add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}' ipv4.method manual ipv4.addresses 192.168.1.100/24
# 2. 添加 team 端口(将 eth0 和 eth1 加入 team0)
sudo nmcli con add type ethernet con-name team0-port1 ifname eth0 master team0
sudo nmcli con add type ethernet con-name team0-port2 ifname eth1 master team0
# 3. 激活 team 和端口
sudo nmcli con up team0
sudo nmcli con up team0-port1
sudo nmcli con up team0-port2
五、nmcli 无线管理高级功能
5.1 Wi-Fi 热点创建
nmcli 可快速创建软 AP(无线热点):
bash
# 创建 Wi-Fi 热点
sudo nmcli con add type wifi ifname wlan0 con-name my-hotspot ssid MyHotspot mode ap \
wifi-sec.key-mgmt wpa-psk wifi-sec.psk "hotspot123" \
ipv4.method shared ipv4.addresses 192.168.100.1/24
# 激活热点
sudo nmcli con up my-hotspot
5.2 隐藏 Wi-Fi 连接
连接隐藏的 Wi-Fi 网络(SSID 不广播):
bash
sudo nmcli dev wifi connect "HiddenWiFi" password "hiddenpass" ifname wlan0 hidden yes
六、nmcli 网络策略与优化配置
6.1 连接优先级设置
当一个设备有多个可用连接时,可设置优先级决定激活顺序:
bash
# 设置连接优先级(数值越大,优先级越高)
sudo nmcli con mod "static-eth0" connection.autoconnect-priority 100
sudo nmcli con mod "dhcp-eth0" connection.autoconnect-priority 50
6.2 网络切换策略
配置连接自动切换条件:
bash
# 当更优网络可用时自动切换
sudo nmcli con mod "my-wifi" connection.autoconnect-slaves 1
# 设置信号强度阈值(低于此值自动切换)
sudo nmcli con mod "my-wifi" 802-11-wireless.signal-threshold 70
6.3 电源管理配置
优化无线设备电源管理:
bash
# 启用 Wi-Fi 省电模式
sudo nmcli con mod "my-wifi" 802-11-wireless.powersave 1
# 禁用 Wi-Fi 省电模式(提高性能)
sudo nmcli con mod "my-wifi" 802-11-wireless.powersave 2
七、nmcli 故障排除与调试
7.1 常见问题排查步骤
-
检查 NetworkManager 状态:
bashsystemctl status NetworkManager -
查看设备状态:
bashnmcli device status # 确认设备是否已连接(connected)或可用(available) -
检查连接配置:
bashnmcli con show "连接名" # 确认IP、网关、DNS等配置是否正确 -
查看 NetworkManager 日志(最有效的排错方法):
bashjournalctl -u NetworkManager -f # 实时查看日志 journalctl -u NetworkManager --since "10 minutes ago" # 查看最近10分钟日志
7.2 常见问题解决示例
-
问题 :连接激活失败,提示"设备未托管"
解决:bash# 检查设备托管状态 nmcli device status # 查看DEVICE列是否为unmanaged # 将设备设置为托管模式 sudo nmcli device set eth0 managed yes # 如仍无效,检查 NetworkManager 配置 cat /etc/NetworkManager/NetworkManager.conf # 确保 [main] 部分没有 unmanaged-devices 配置 -
问题 :Wi-Fi 连接速度慢或频繁断开
解决:bash# 禁用电源管理 sudo nmcli con mod "my-wifi" 802-11-wireless.powersave 2 # 固定Wi-Fi频道 sudo nmcli con mod "my-wifi" 802-11-wireless.channel 6 # 切换Wi-Fi模式 sudo nmcli con mod "my-wifi" 802-11-wireless.mode infrastructure -
问题 :静态 IP 配置后无法上网
解决:bash# 检查路由配置 nmcli con show "static-eth0" | grep ipv4.route # 手动添加默认路由 sudo nmcli con mod "static-eth0" ipv4.routes "0.0.0.0/0 192.168.1.1" # 重启连接使配置生效 sudo nmcli con down "static-eth0" && sudo nmcli con up "static-eth0"
八、nmcli 自动化脚本示例
nmcli 适合用于自动化脚本,以下是一个完整的网络配置脚本示例:
bash
#!/bin/bash
# 网络配置自动化脚本
# 定义变量
CON_NAME="server-net"
IF_NAME="eth0"
IP_ADDR="192.168.1.100/24"
GATEWAY="192.168.1.1"
DNS="8.8.8.8,114.114.114.114"
# 检查 NetworkManager 状态
if ! systemctl is-active --quiet NetworkManager; then
echo "NetworkManager is not running. Starting..."
sudo systemctl start NetworkManager
fi
# 删除现有同名连接
if nmcli con show "$CON_NAME" &>/dev/null; then
echo "Deleting existing connection: $CON_NAME"
sudo nmcli con del "$CON_NAME"
fi
# 创建新连接
echo "Creating new connection: $CON_NAME"
sudo nmcli con add \
con-name "$CON_NAME" \
type ethernet \
ifname "$IF_NAME" \
autoconnect yes \
ipv4.method manual \
ipv4.addresses "$IP_ADDR" \
ipv4.gateway "$GATEWAY" \
ipv4.dns "$DNS" \
connection.autoconnect-priority 100
# 激活连接
echo "Activating connection: $CON_NAME"
sudo nmcli con up "$CON_NAME"
# 验证配置
echo "Verifying network configuration..."
nmcli con show "$CON_NAME" | grep -E "ipv4.addresses|ipv4.gateway|ipv4.dns"
ip addr show "$IF_NAME"
ping -c 3 "$GATEWAY"
九、nmcli 与传统网络工具对比
| 功能 | nmcli | ifconfig/ip | network-scripts |
|---|---|---|---|
| 配置持久性 | 永久(保存到配置文件) | 临时(重启失效) | 永久(需手动编辑文件) |
| 设备管理 | 支持物理/虚拟设备 | 仅支持物理设备 | 有限支持虚拟设备 |
| 无线管理 | 完整支持 Wi-Fi/热点 | 无原生支持 | 需额外工具 |
| 网络绑定/网桥 | 内置支持 | 需手动配置 | 复杂配置 |
| 自动化支持 | 命令行友好,适合脚本 | 适合简单脚本 | 配置文件驱动,不适合动态脚本 |
| 依赖 | NetworkManager 服务 | 无依赖 | 无依赖 |
十、总结
nmcli 作为现代 Linux 系统的核心网络管理工具,提供了比传统命令更强大、更灵活的网络配置能力。
- 优先使用 nmcli 管理网络,避免与传统工具(如 ifconfig、ip)混用导致配置冲突
- 为重要连接设置高优先级,确保关键网络稳定
- 使用描述性连接名称(如 "office-eth0-static"),便于管理多个连接
- 定期备份连接配置文件(/etc/NetworkManager/system-connections/)
- 利用 nmcli 日志功能排查网络问题,比传统 ping/traceroute 更高效
- 在脚本中使用 nmcli 实现网络配置自动化,提高一致性和可靠性
如需更深入了解特定功能,可通过 nmcli help 或官方文档获取完整信息。