Linux---nmcli (NetworkManager服务的核心命令行工具)

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 常见问题排查步骤

  1. 检查 NetworkManager 状态

    bash 复制代码
    systemctl status NetworkManager
  2. 查看设备状态

    bash 复制代码
    nmcli device status  # 确认设备是否已连接(connected)或可用(available)
  3. 检查连接配置

    bash 复制代码
    nmcli con show "连接名"  # 确认IP、网关、DNS等配置是否正确
  4. 查看 NetworkManager 日志(最有效的排错方法)

    bash 复制代码
    journalctl -u NetworkManager -f  # 实时查看日志
    journalctl -u NetworkManager --since "10 minutes ago"  # 查看最近10分钟日志

7.2 常见问题解决示例

  1. 问题 :连接激活失败,提示"设备未托管"
    解决

    bash 复制代码
    # 检查设备托管状态
    nmcli device status  # 查看DEVICE列是否为unmanaged
    
    # 将设备设置为托管模式
    sudo nmcli device set eth0 managed yes
    
    # 如仍无效,检查 NetworkManager 配置
    cat /etc/NetworkManager/NetworkManager.conf
    # 确保 [main] 部分没有 unmanaged-devices 配置
  2. 问题 :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
  3. 问题 :静态 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 系统的核心网络管理工具,提供了比传统命令更强大、更灵活的网络配置能力。

  1. 优先使用 nmcli 管理网络,避免与传统工具(如 ifconfig、ip)混用导致配置冲突
  2. 为重要连接设置高优先级,确保关键网络稳定
  3. 使用描述性连接名称(如 "office-eth0-static"),便于管理多个连接
  4. 定期备份连接配置文件(/etc/NetworkManager/system-connections/)
  5. 利用 nmcli 日志功能排查网络问题,比传统 ping/traceroute 更高效
  6. 在脚本中使用 nmcli 实现网络配置自动化,提高一致性和可靠性

如需更深入了解特定功能,可通过 nmcli help官方文档获取完整信息。

相关推荐
不愿透露姓名的大鹏2 小时前
VMware vcenter报错no healthy upstream
linux·运维·服务器·vmware
zcongfly2 小时前
绿联云+rustdesk+tailscale自建服务器通信
运维·服务器
胡楚昊2 小时前
Polar PWN (4)
linux·运维·算法
桌面运维家2 小时前
虚拟化服务器备份恢复:快速切换方案详解
运维·服务器
nangonghen2 小时前
centos 7.9安装hiclaw
linux·运维·centos
小李小李快乐不已2 小时前
docker(2)容器管理与镜像操作
运维·c++·docker·容器
-凌凌漆-2 小时前
【C语言】大小端判断
linux·c语言·算法
余衫马2 小时前
在 IIS 部署 .NET6 WebApi 应用
运维·c#·iis·.net·发布
看-是灰机2 小时前
企业级openclaw应用部署
运维·人工智能·机器学习