NetworkManager 完全使用指南:从入门到精通
NetworkManager 是 Linux 世界中最强大的网络管理工具之一。它不仅仅是一个命令行工具,更是一整套完整的网络管理框架。本文将从最基础的日常操作,到高级的自动化配置,为您全面解析 NetworkManager 的使用方法。
一、核心概念速览
在开始操作之前,必须理解两个最基本的概念:
| 概念 | 说明 | 类比 |
|---|---|---|
| 设备 (Device) | 物理或虚拟的网络接口硬件 | 网卡本身,如 ens33、wlan0 |
| 连接 (Connection) | 一套网络配置参数(IP、DNS、Wi-Fi SSID等) | 配置方案,如“家里Wi-Fi”、“办公室有线” |
核心关系:一个设备可以有多个“连接”配置,但同一时间只有一个“连接”是激活的。例如,你的无线网卡可以有“Home”和“Office”两个连接,但同一时刻只能连一个。
二、三大管理工具
NetworkManager 提供了三种管理工具,适用不同场景:
| 工具 | 适用场景 | 学习曲线 |
|---|---|---|
| 图形界面 | 日常桌面使用 | ⭐ 最简单 |
nmtui | 纯终端环境、SSH 连接 | ⭐⭐ 中等 |
nmcli | 服务器、脚本、自动化 | ⭐⭐⭐ 功能最强 |
三、图形界面使用详解
GNOME 桌面环境的网络管理完全基于 NetworkManager,所有操作都在调用其 D-Bus API。
3.1 右上角网络菜单
点击右上角的网络图标,你会看到:
- 有线网络:显示“有线连接”状态,点击可开启/关闭
- Wi-Fi 网络:显示可用网络列表,点击即可连接
- VPN 连接:已配置的 VPN 列表
- 网络设置:进入详细的设置面板
3.2 “设置”应用中的网络配置
打开“设置”(Settings)→“网络”(Network),你可以进行更详细的配置:
有线网络配置:
- 开启/关闭有线网络
- 进入“齿轮”图标 → 设置静态 IP、DNS、路由
- 设置代理
Wi-Fi 配置:
- 查看已连接网络
- “齿轮”图标 → 查看 IP、MAC 地址
- 设置是否自动连接
- 修改 Wi-Fi 密码(保存的密码可以在“可见密码”处查看)
- 设置静态 IP
所有图形界面的配置最终都保存在:
/etc/NetworkManager/system-connections/*.nmconnection
四、nmtui 文本菜单工具
nmtui 是一个基于文本的图形化界面,适合纯终端环境或 SSH 远程管理。
启动 nmtui
nmtui
你会看到一个简单的菜单:
- Edit a connection:编辑现有连接或添加新连接
- Activate a connection:激活/停用连接
- Set system hostname:设置主机名
操作方式
- 方向键:上下移动光标
- Tab 键:切换焦点区域
- Enter 键:确认选择
- Esc 键:返回上一级
示例:添加一个静态 IP 的有线连接
- 选择 “Edit a connection” → “Add” → “Ethernet”
- 设置 Profile name(连接名称)
- 在 IPv4 CONFIGURATION 中选择 “Manual”
- 填入 Address(如 192.168.1.100/24)、Gateway(192.168.1.1)、DNS(8.8.8.8)
- 选择 “OK” 保存
优点:无需记忆命令,菜单式操作,适合偶尔需要快速配置的场景。
五、nmcli 命令行完全指南
nmcli 是最强大的管理工具,几乎可以做任何事情。它是服务器管理和自动化脚本的首选。
5.1 查看状态
查看 NetworkManager 整体状态:
nmcli general status
输出示例:
STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN
connected full enabled enabled enabled enabled
查看所有网络设备:
nmcli device status
输出示例:
DEVICE TYPE STATE CONNECTION
ens33 ethernet connected Wired connection 1
wlan0 wifi disconnected --
lo loopback unmanaged --
查看所有连接配置:
nmcli connection show
只查看当前活跃的连接:
nmcli connection show --active
查看某个连接的详细信息:
nmcli connection show "Wired connection 1"
这会显示该连接的所有配置参数,包括 IP、DNS、MAC 地址等。
扫描附近的 Wi-Fi:
nmcli device wifi list
5.2 管理设备
启用/禁用 Wi-Fi 或 WWAN:
nmcli radio wifi on
nmcli radio wifi off
nmcli radio wwan on
连接/断开设备:
nmcli device connect ens33 # 连接有线网卡
nmcli device disconnect wlan0 # 断开无线网卡
5.3 管理连接
激活连接:
nmcli connection up "Wired connection 1"
停用连接:
nmcli connection down "Wired connection 1"
删除连接:
nmcli connection delete "旧连接名"
重新加载配置文件:
nmcli connection reload
5.4 创建和修改连接
创建一个新的有线连接(使用 DHCP):
nmcli connection add type ethernet con-name "办公室有线" ifname ens33
创建一个新的有线连接(静态 IP):
nmcli connection add type ethernet con-name "服务器静态IP" ifname ens33 \
ipv4.method manual ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "8.8.8.8 1.1.1.1"
连接 Wi-Fi(命令行最常用):
# 连接到开放网络
nmcli device wifi connect "网络名称"
# 连接到加密网络(WPA/WPA2)
nmcli device wifi connect "网络名称" password "密码"
# 连接隐藏的 Wi-Fi
nmcli device wifi connect "网络名称" password "密码" hidden yes
修改现有连接:
# 将 DHCP 改为静态 IP
nmcli connection modify "Wired connection 1" \
ipv4.method manual \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "8.8.8.8"
# 改为 DHCP
nmcli connection modify "Wired connection 1" ipv4.method auto
# 设置自动连接(开机自启)
nmcli connection modify "Wired connection 1" autoconnect yes
# 设置 MTU
nmcli connection modify "Wired connection 1" 802-3-ethernet.mtu 1500
# 设置 VLAN
nmcli connection add type vlan con-name "VLAN10" ifname "ens33.10" \
dev ens33 id 10 ipv4.method manual ipv4.addresses 192.168.10.1/24
查看修改历史(调试用):
nmcli connection show "连接名" | grep -E "^ipv4|^802-3-ethernet"
5.5 高级操作
创建网桥(用于虚拟机):
# 创建网桥
nmcli connection add type bridge con-name "br0" ifname br0
# 添加物理网卡到网桥
nmcli connection add type ethernet con-name "br0-slave" ifname ens33 master br0
# 启用网桥
nmcli connection up br0
创建链路聚合 (Bonding):
# 创建 bond
nmcli connection add type bond con-name "bond0" ifname bond0 \
bond.options "mode=802.3ad"
# 添加两个网卡到 bond
nmcli connection add type ethernet con-name "bond0-slave1" ifname ens33 master bond0
nmcli connection add type ethernet con-name "bond0-slave2" ifname ens34 master bond0
# 设置 IP
nmcli connection modify bond0 ipv4.method manual ipv4.addresses 10.0.0.1/24
nmcli connection up bond0
配置 VPN:
# 导入 OpenVPN 配置
nmcli connection import type openvpn file /path/to/config.ovpn
# 手动创建 WireGuard 连接
nmcli connection add type wireguard con-name "wg0" ifname wg0 \
wireguard.private-key /path/to/private.key
# 添加 peer
nmcli connection modify wg0 wireguard.peers "公钥=允许IP"
5.6 脚本友好的输出
对于自动化脚本,nmcli 提供了 -t (terse, 简洁) 和 -f (fields, 字段) 选项:
# 获取所有活跃连接的 UUID
nmcli -t -f UUID,NAME connection show --active
# 获取 Wi-Fi 信号强度
nmcli -t -f IN-USE,SIGNAL device wifi list
六、配置文件详解
6.1 主配置文件:/etc/NetworkManager/NetworkManager.conf
这是 NetworkManager 的全局配置文件,控制其核心行为。
[main]
plugins=keyfile,ifcfg-rh
dns=default
[ifupdown]
managed=false
[connectivity]
uri=http://connectivity-check.ubuntu.com/
[keyfile]
unmanaged-devices=interface-name:eth1
各段落说明:
| 段落 | 选项 | 说明 |
|---|---|---|
[main] | plugins | 设置插件,keyfile 是主要配置文件格式 |
[main] | dns | DNS 管理方式:default、dnsmasq、unbound |
[ifupdown] | managed | 是否让 NM 管理 /etc/network/interfaces 中的接口 |
[connectivity] | uri | 连接性检查的 URL,用于检测是否真正联网 |
[keyfile] | unmanaged-devices | NM 忽略的设备列表 |
⚠️ 最佳实践:不要直接修改此文件,而是在 /etc/NetworkManager/conf.d/ 目录下创建 *.conf 文件来覆盖设置。
6.2 连接配置文件:/etc/NetworkManager/system-connections/*.nmconnection
这是每个网络连接的详细配置。文件格式类似 Windows INI 文件:
[connection]
id=Wired connection 1
uuid=27afa607-ee36-43f0-b8c3-9d245cdc4bb3
type=802-3-ethernet
autoconnect=true
autoconnect-priority=100
interface-name=ens33
timestamp=1721567890
[802-3-ethernet]
mac-address=00:23:5a:47:1f:71
[ipv4]
method=auto
dns-search=localdomain
[ipv6]
method=auto
[proxy]
重要字段解析:
| 字段 | 含义 |
|---|---|
id | 连接名称(显示名) |
uuid | 唯一标识符 |
type | 连接类型:802-3-ethernet、802-11-wireless、vpn 等 |
autoconnect | 是否开机自动连接 |
autoconnect-priority | 自动连接的优先级(数字越大优先级越高) |
interface-name | 绑定的设备名 |
method | auto=DHCP,manual=静态 |
⚠️ 注意:uuid 必须唯一,且文件权限必须为 600(仅 root 可读写)。
七、事件响应脚本 (Dispatcher)
NetworkManager 允许在网络事件发生时自动执行脚本,这是实现自动化的强大功能。
7.1 基本原理
- 脚本位置:
/etc/NetworkManager/dispatcher.d/ - 执行顺序:按文件名字母顺序
- 接收参数:接口名 + 事件类型(如
up、down) - 要求:脚本必须由
root所有,权限不超过0755
7.2 事件类型
| 事件 | 触发时机 | 说明 |
|---|---|---|
pre-up | 设备激活前 | 用于准备操作,执行后会阻塞网络启动 |
up | 设备激活后 | 用于启动依赖于网络的服务 |
pre-down | 设备停用前 | 用于清理操作,可阻塞网络停用 |
down | 设备停用后 | 用于清理依赖于网络的服务 |
vpn-up | VPN 连接建立 | VPN 隧道建立后触发 |
vpn-down | VPN 连接断开 | VPN 隧道断开后触发 |
dhcp4-change | DHCPv4 租约更新 | IP 地址变化时触发 |
connectivity-change | 连通性状态改变 | 从 none → full 或反之 |
7.3 环境变量
脚本执行时可访问大量环境变量:
| 变量名 | 含义 |
|---|---|
CONNECTION_UUID | 连接 UUID |
CONNECTION_ID | 连接名称 |
DEVICE_IFACE | 设备接口名 |
IP4_ADDRESS_0 | IPv4 地址 |
IP4_GATEWAY | IPv4 网关 |
DHCP4_HOST_NAME | DHCP 获取的主机名 |
IP4_NAMESERVERS | IPv4 DNS 服务器列表 |
7.4 示例脚本
/etc/NetworkManager/dispatcher.d/10-update-iptables:在 VPN 连接时自动更新防火墙规则
#!/bin/bash
# 10-update-iptables
if [ "$2" = "vpn-up" ]; then
iptables -I OUTPUT -o tun0 -j ACCEPT
iptables -I INPUT -i tun0 -j ACCEPT
logger "VPN connected, firewall rules updated"
fi
if [ "$2" = "vpn-down" ]; then
iptables -D OUTPUT -o tun0 -j ACCEPT
iptables -D INPUT -i tun0 -j ACCEPT
logger "VPN disconnected, firewall rules removed"
fi
脚本调试:可在脚本中添加 logger 命令查看执行情况:
logger "NetworkManager event: $2 on interface $1"
7.5 特殊目录
pre-up.d/和pre-down.d/:软链接到dispatcher.d/中的脚本,但会阻塞操作,必须执行完毕才能继续no-wait.d/:脚本不会阻塞,可以并行执行,适合耗时操作
八、故障排除
8.1 查看日志
# 实时查看 NetworkManager 日志
sudo journalctl -u NetworkManager -f
# 查看最近 100 条日志
sudo journalctl -u NetworkManager -n 100
# 查看特定时间段的日志
sudo journalctl -u NetworkManager --since "1 hour ago"
8.2 常见问题与解决
问题1:Wi-Fi 列表为空
# 检查 Wi-Fi 是否被硬件开关关闭
nmcli radio wifi
# 开启 Wi-Fi
nmcli radio wifi on
# 如果硬件开关被关闭,可能需要物理开关或 `rfkill` 命令
rfkill list
rfkill unblock wifi
问题2:无法获取 IP 地址
# 查看 DHCP 客户端日志
sudo journalctl -u NetworkManager -f | grep dhcp
# 手动释放并重新获取
sudo dhclient -v ens33
问题3:配置不生效
# 重新加载配置
nmcli connection reload
# 重启 NetworkManager
sudo systemctl restart NetworkManager
问题4:网桥或 VLAN 配置失败
检查 NetworkManager 版本是否支持:NetworkManager --version。某些高级功能需要较新版本。
8.3 重置 NetworkManager
如果配置完全混乱,可以重置:
# 重置所有连接配置
sudo rm -rf /etc/NetworkManager/system-connections/*
# 重启 NetworkManager
sudo systemctl restart NetworkManager
# 重新创建连接
九、常用命令速查表
| 操作 | 命令 |
|---|---|
| 查看状态 | nmcli general status |
| 查看设备 | nmcli device status |
| 查看连接 | nmcli connection show |
| 查看活跃连接 | nmcli connection show --active |
| 查看连接详情 | nmcli connection show "连接名" |
| 扫描 Wi-Fi | nmcli device wifi list |
| 连接 Wi-Fi | nmcli device wifi connect "SSID" password "密码" |
| 启用/禁用 Wi-Fi | nmcli radio wifi on/off |
| 激活连接 | nmcli connection up "连接名" |
| 停用连接 | nmcli connection down "连接名" |
| 删除连接 | nmcli connection delete "连接名" |
| 创建 DHCP 连接 | nmcli connection add type ethernet con-name "名称" ifname ens33 |
| 创建静态连接 | nmcli connection add type ethernet con-name "名称" ifname ens33 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8" |
| 修改为静态 IP | nmcli connection modify "连接名" ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8" |
| 修改为 DHCP | nmcli connection modify "连接名" ipv4.method auto |
| 设置自动连接 | nmcli connection modify "连接名" autoconnect yes |
| 创建网桥 | nmcli connection add type bridge con-name "br0" ifname br0 |
| 重新加载配置 | nmcli connection reload |
| 查看实时日志 | sudo journalctl -u NetworkManager -f |
| 重启服务 | sudo systemctl restart NetworkManager |
总结
NetworkManager 提供了一套完整的网络管理方案:
- 图形界面:适合日常桌面使用,直观易用
nmtui:适合纯终端环境,菜单式操作nmcli:功能最强大,适合服务器和自动化脚本- 配置文件:所有操作最终都保存在
/etc/NetworkManager/system-connections/ - 事件脚本:可实现网络状态变化时的自动化响应
无论你是普通桌面用户、系统管理员,还是需要自动化运维的工程师,NetworkManager 都能提供从简单到复杂的完整工具链。掌握它,你就掌握了 Linux 网络管理的核心。