跳至内容

NetworkManager 网络配置工具套件

2004 年,Red Hat 推出了 NetworkManager 项目,旨在让 Linux 用户更轻松地满足当前网络管理的需求,尤其是无线网络管理。如今,该项目由 GNOME 管理。可以在这里找到 NetworkManager 的主页

官方介绍 - NetworkManager 是一个标准的 Linux 网络配置工具套件。它支持从桌面到服务器和移动设备的各种网络设置,并且与流行的桌面环境和服务器配置管理工具完美集成。

该套件主要包含两个命令行工具

  • nmtui。在图形界面中配置网络。
shell > dnf -y install NetworkManager NetworkManager-tui
shell > nmtui
NetworkManager TUI
编辑连接
激活连接
设置系统主机名
退出
确定
  • nmcli。使用命令行配置网络,可以是纯命令行,也可以是交互式命令行。
Shell > nmcli connection show
NAME    UUID                                  TYPE      DEVICE
ens160  25106d13-ba04-37a8-8eb9-64daa05168c9  ethernet  ens160

对于 RockyLinux 8.x,我们在本文档中介绍过如何配置其网络。你可以使用 vim 编辑 /etc/sysconfig/network-script/ 目录下的网卡配置文件,也可以使用 nmcli/nmtui,两者均可。

udev 设备管理器命名规则

对于 RockyLinux 9.x,如果你进入 /etc/sysconfig/network-scripts/ 目录,会有一个 readme-ifcfg-rh.txt 说明文本,提示你去 /etc/NetworkManager/system-connections/ 目录。

Shell > cd /etc/NetworkManager/system-connections/  && ls
ens160.nmconnection

这里的 ens160 指的是系统中网卡的名称。你可能会好奇为什么名称看起来如此奇怪?这是因为 udev 设备管理器。它支持多种不同的命名方案。默认情况下,会根据固件、拓扑和位置信息分配固定名称。它的优点包括

  • 设备名称完全可预测。
  • 即使添加或删除硬件,设备名称也会保持不变,因为不会进行重新枚举。
  • 可以无缝更换有故障的硬件。

在 RHEL 9 和相应的社区版本操作系统中,默认启用了一致的设备命名。udev 设备管理器将根据以下方案生成设备名称

方案 描述 示例
1 设备名称包含固件或 BIOS 提供的板载设备索引号。如果此信息不可用或不适用,udev 将使用方案 2。 eno1
2 设备名称包含固件或 BIOS 提供的 PCI Express (PCIe) 热插拔槽索引号。如果此信息不可用或不适用,udev 将使用方案 3。 ens1
3 设备名称包含硬件连接器的物理位置。如果此信息不可用或不适用,udev 将使用方案 5。 enp2s0
4 设备名称包含 MAC 地址。Red Hat Enterprise Linux 默认不使用此方案,但管理员可以根据需要选择使用。 enx525400d5e0fb
5 传统的不可预测的内核命名方案。如果 udev 无法应用任何其他方案,设备管理器将使用此方案。 eth0

udev 设备管理器根据接口类型为网卡命名

  • en 表示以太网。
  • wl 表示无线局域网 (WLAN)。
  • ww 表示无线广域网 (WWAN)。
  • ib, InfiniBand 网络。
  • sl, 串行线路互联网协议 (slip)

在前缀后添加一些后缀,例如

  • o 板载_索引号
  • s 热插拔槽索引号 [f] 功能 [d] 设备 ID
  • x MAC 地址
  • [P] 域号 p 总线 s 插槽 [f] 功能 [d] 设备 ID
  • [P] 域号 p 总线 s 插槽 [f] 功能 [u] USB 端口 [c] 配置 [i] 接口

你可以使用 man 7 systemd.net-naming-scheme 获取更详细的信息。

用户不仅可以在纯命令行模式下配置网络,还可以使用交互式命令来配置网络。

nmcli connection

nmcli connection 命令可以显示、删除、添加、修改、编辑、启用、禁用等操作。

具体用法请参考 nmcli connection add --helpnmcli connection edit --helpnmcli connection modify --help 等。

例如,使用纯命令行配置一个新的 ipv4 静态 IP 连接并使其自动启动,可以这样操作:

Shell > nmcli  connection  add  type  ethernet  con-name   CONNECTION_NAME  ifname  NIC_DEVICE_NAME   \
ipv4.method  manual  ipv4.address "192.168.10.5/24"  ipv4.gateway "192.168.10.1"  ipv4.dns "8.8.8.8,114.114.114.114" \
ipv6.method  disabled  autoconnect yes

如果使用 DHCP 获取 ipv4 地址,可以这样做:

Shell > nmcli  connection  add  type ethernet con-name CONNECTION_NAME  ifname  NIC_DEVICE_NAME \
ipv4.method  auto  ipv6.method  disabled  autoconnect  yes

通过上述配置,连接尚未激活。你需要执行以下操作:

Shell > nmcli connection up  NIC_DEVICE_NAME

在现有连接的基础上,通过 edit 关键字进入交互式界面进行修改。

Shell > nmcli connection  edit  CONNECTION_NAME
nmcli > help

你也可以使用 modify 关键字直接在命令行中修改连接的一个或多个属性。例如:

Shell > nmcli connection modify CONNECTION_NAME autoconnect yes ipv6.method dhcp

信息

通过 nmclinmtui 进行的操作是永久保存的,而不是临时的。

一些场景会使用多网卡进行链路聚合。早期使用 bonding 技术,有七种工作模式 (0~6),且 bond 模式最多只支持两张网卡。后来逐渐使用了 teaming 技术作为替代,有五种工作模式,team 模式最多可支持八张网卡。关于 bonding 和 teaming 的对比可以在这个链接中找到。

例如,bonding 的 0 模式

Shell > nmcli  connection  add  type  bond  con-name  BOND_CONNECTION_NAME   ifname  BOND_NIC_DEVICE_NAME  mode 0
Shell > nmcli  connection  add  type  bond-slave   ifname NIC_DEVICE_NAME1   master  BOND_NIC_DEVICE_NAME
Shell > nmcli  connection  add  type  bond-slave   ifname NIC_DEVICE_NAME2   master  BOND_NIC_DEVICE_NAME

网卡配置

警告

不建议通过 vim 或其他编辑器进行修改。

你可以通过 man 5 NetworkManager.confman 5 nm-settings-nmcli 查看更详细的信息。

NetworkManager 网卡配置文件的内容是一种 init 风格的键值对文件。例如:

Shell > cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
uuid=5903ac99-e03f-46a8-8806-0a7a8424497e
type=ethernet
interface-name=ens160
timestamp=1670056998

[ethernet]
mac-address=00:0C:29:47:68:D0

[ipv4]
address1=192.168.100.4/24,192.168.100.1
dns=8.8.8.8;114.114.114.114;
method=manual

[ipv6]
addr-gen-mode=default
method=disabled

[proxy]
  • 以 # 开头和空行被视为注释。
  • 用方括号 [] 括起来的是节 (section),它声明了一个标题,其下方是包含的具体键值对。每个声明的标题及其键值对构成了一个语法段。
  • 任何以 .nmconnection 结尾的文件都可以被 NetworkManager 使用。

connection 节名称可以包含这些通用键值对:

键名 描述
id con-name 的别名,其值为字符串。
uuid 通用唯一标识符,其值为字符串。
type 连接类型,其值可以是 ethernet, bluetooth, vpn, vlan 等。你可以使用 man nmcli 查看所有支持的类型。
interface-name 此连接绑定的网络接口的名称,其值为字符串。
timestamp Unix 时间戳,单位为秒。此处的值是自 1970 年 1 月 1 日以来的秒数。
autoconnect 系统启动时是否自动启动。其值为布尔类型。

ethernet 节名称可以包含这些通用键值对:

键名 描述
mac-address MAC 物理地址。
mtu 最大传输单元。
auto-negotiate 是否自动协商。其值为布尔类型。
duplex 其值可以是 half (半双工),full (全双工)。
speed 指定网卡的传输速率。100 表示 100Mbit/s。如果 auto-negotiate=false,则必须设置 speed 键和 duplex 键;如果 auto-negotiate=true,则使用的速度是协商后的速度,此处写入无效 (仅适用于 BASE-T 802.3 规范);当非零时,duplex 键必须有值。

ipv4 节名称可以包含这些通用键值对:

键名 描述
addresses 分配的 IP 地址。
gateway 接口的网关 (下一跳)。
dns 使用的域名服务器。
method 获取 IP 的方法。其值为字符串类型。其值可以是: auto, disabled, link-local, manual, shared。

作者:李天赐

贡献者:Steven Spencer