nmcli 快速参考

基本结构

1
nmcli [对象] [动作] [参数]

主要对象: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      # 重新连接

删除连接

1
nmcli con del "连接名"

设备与连接的关系

  • 一个设备(如 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 addnmcli 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
Fedoraipv4.link-local disabledIPv4 空着,只有 fe80::

如果希望 Fedora 和 Mac 一样,没 DHCP 时自动协商链路本地地址:

1
2
nmcli con mod "连接名" ipv4.link-local enabled
nmcli con up "连接名"

但对于直连场景,固定静态 IP(192.168.100.x)更可靠,避免每次随机协商地址变化带来的麻烦。


autoconnect 与多网口场景

场景还原enp171s0 绑定了静态 rj45-directautoconnect 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
使用 Hugo 构建
主题 StackJimmy 设计