基本结构
主要对象:con(连接)、dev(设备)、gen(通用)
常用命令
查看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 列出所有连接
nmcli con show
# 列出活跃连接
nmcli con show --active
# 查看连接详情
nmcli con show "连接名"
# 查看设备状态
nmcli dev status
# 查看设备详情(IP、MAC 等)
nmcli dev show enp171s0
|
创建连接
1
2
3
4
5
6
7
8
9
10
| nmcli con add \
con-name "连接名" \
type ethernet \
ifname enp171s0 \
ipv4.addresses 192.168.100.2/24 \
ipv4.method manual \
ipv4.gateway "" \
ipv4.dns "" \
ipv4.never-default yes \
connection.autoconnect yes
|
参数说明:
| 参数 | 作用 |
|---|
ipv4.method manual | 静态 IP(auto = DHCP) |
ipv4.never-default yes | 不添加默认路由,不影响 WiFi 上网 |
ipv4.gateway "" | 不设网关 |
ipv4.dns "" | 不设 DNS |
connection.autoconnect yes | 开机自动激活 |
修改连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 改 IP
nmcli con mod "连接名" ipv4.addresses 192.168.200.2/24
# 绑多个 IP
nmcli con mod "连接名" ipv4.addresses "192.168.100.2/24,192.168.200.2/24"
# 改连接名
nmcli con mod "旧名" connection.id "新名"
# 改 autoconnect
nmcli con mod "连接名" connection.autoconnect no
# 绑定到指定网口
nmcli con mod "连接名" connection.interface-name enp171s0
|
启停连接
1
2
3
4
| nmcli con up "连接名" # 激活
nmcli con down "连接名" # 停用(仅停此连接,不影响设备)
nmcli dev disconnect enp171s0 # 断开设备(所有连接)
nmcli dev connect enp171s0 # 重新连接
|
删除连接
设备与连接的关系
- 一个设备(如
enp171s0)可以绑定多个连接 - 一个设备同一时间只能激活一个连接
- 切换连接:
nmcli con up "另一个连接" - 切换后旧连接自动断开
多连接切换场景
1
2
3
4
5
| # 场景 A:直连 Mac(100 网段)
nmcli con up "rj45-direct"
# 场景 B:直连其他设备(200 网段)
nmcli con up "rj45-direct-v2"
|
autoconnect 建议只保留一个连接设为 yes,其余手动 up。
理解 nmcli con show 只显示持久化配置
nmcli con show 列出的是保存在 /etc/NetworkManager/system-connections/ 的 连接配置文件(profile),相当于"预设方案"。只有你手动 nmcli con add 或 nmcli con save 过的才会出现。
插网线后自动协商出的 169.254.x.x(Zeroconf/IPv4LL)是内核自动生成的临时地址,没有 profile,所以在 nmcli con show 里看不见,但 ip addr 里能看见。
| 来源 | 出现 ip addr | 出现 nmcli con show | 重启后持久 |
|---|
nmcli con add 静态 IP | 是 | 是 | 是 |
| DHCP 自动获取 | 是 | 是(自动生成临时 profile) | 仅本次会话 |
| IPv4LL 自动协商 (169.254.x.x) | 是 | 否 | 否 |
macOS 与 Fedora 的默认退避差异
两端插网线且无 DHCP 时:
| 系统 | 无 DHCP 时的默认行为 | 结果 |
|---|
| macOS | 自动启用 Bonjour/Zeroconf → 协商 169.254.x.x | 自动拿到 IPv4 |
| Fedora | ipv4.link-local disabled | IPv4 空着,只有 fe80:: |
如果希望 Fedora 和 Mac 一样,没 DHCP 时自动协商链路本地地址:
1
2
| nmcli con mod "连接名" ipv4.link-local enabled
nmcli con up "连接名"
|
但对于直连场景,固定静态 IP(192.168.100.x)更可靠,避免每次随机协商地址变化带来的麻烦。
autoconnect 与多网口场景
场景还原:enp171s0 绑定了静态 rj45-direct(autoconnect yes),换插到入户网线后,NetworkManager 自动激活了该连接,导致 IP/网关/ DNS 不对,无法上网。
原因:autoconnect yes 的连接,当网口链路 UP 时 NetworkManager 会自动激活它,无视另一端连接的是什么设备。
管理原则
- 每个网口只保留一个连接设为
autoconnect yes(或全设为 no) - 不确定场景的连接优先设为
autoconnect no,需要时手动 nmcli con up
实际方案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 方案一:固定分工,不冲突
# enp170s0 → 入户网(默认 DHCP,可不配任何 profile)
# enp171s0 → 直连 Mac(关 autoconnect)
nmcli con mod "rj45-direct" connection.autoconnect no
# 方案二:同一网口按场景切换
nmcli con add \
con-name "rj45-home" \
type ethernet \
ifname enp171s0 \
ipv4.method auto \
connection.autoconnect no
# 切换
nmcli con up "rj45-direct" # 直连 Mac
nmcli con up "rj45-home" # 入户上网
|
判断当前哪个连接激活
1
| nmcli con show --active | grep enp171s0
|
快速排查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 看网口状态
ip link show enp171s0
# 看 IP
ip addr show enp171s0
# 看路由表
ip route
# 看哪个连接激活了
nmcli con show --active
# 看防火墙是否拦截
sudo firewall-cmd --list-all
|
防火墙相关
1
2
3
4
5
6
7
| # 放行内网 SSH
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" service name="ssh" accept'
sudo firewall-cmd --reload
# 放行 mDNS(用于 hostname.local 解析)
sudo firewall-cmd --permanent --add-service=mdns
sudo firewall-cmd --reload
|