作为 Linux 管理员,您有各种工具可用于配置网络连接,例如 nmtui、带有 GNOME 图形用户界面的 NetworkManager,当然还有 nmcli(网络管理器命令行工具)。
我观察到许多管理员使用 nmtui,因为它非常简单。然而,使用 nmcli 可以节省时间,增强您的信心,允许将其集成到脚本中,并且是排查 Linux 服务器网络问题的主要工具,能迅速恢复其功能。
注意到有许多评论在寻求 nmcli 方面的帮助后,我决定撰写这篇文章。当然,您应始终仔细阅读手册页(它们是您最重要的资源)。我的目的是为您节省时间,并提供一些有用的提示。
nmcli 命令语法
nmcli 的语法如下:
nmcli [OPTIONS] OBJECT {COMMAND | help}
其中 OBJECT 可以是 general、networking、radio、connection、device 或 agent 中的一种。
检查 Linux 中的网络设备状态
一个好的开始方式是检查我们的设备:
nmcli dev status DEVICE TYPE STATE CONNECTION docker0 bridge connected docker0 virbr0 bridge connected virbr0 enp0s3 ethernet connected enp0s3 virbr0-nic ethernet disconnected -- lo loopback unmanaged --
从第一列可以看出,这里列出了我们的网络设备。我们有一块名为 enp0s3 的网络卡。在您的机器上,您可能会看到不同的名称。
名称取决于网络卡的类型(是板载卡、PCI 卡还是其他类型)。在最后一列中,我们可以看到我们的配置文件,这些文件被设备用来连接到网络。
很容易理解,我们的设备本身无法独立工作。我们需要创建配置文件来指导它们如何实现网络连接。这些文件也被称为“连接配置文件”,位于 /etc/sysconfig/network-scripts 目录中。
cd /etc/sysconfig/network-scripts/ ls
示例输出
ifcfg-enp0s3 ifdown-isdn ifup ifup-plip ifup-tunnel ifcfg-lo ifdown-post ifup-aliases ifup-plusb ifup-wireless ifdown ifdown-ppp ifup-bnep ifup-post init.ipv6-global ifdown-bnep ifdown-routes ifup-eth ifup-ppp network-functions ifdown-eth ifdown-sit ifup-ib ifup-routes network-functions-ipv6 ifdown-ib ifdown-Team ifup-ippp ifup-sit ifdown-ippp ifdown-TeamPort ifup-ipv6 ifup-Team ifdown-ipv6 ifdown-tunnel ifup-isdn ifup-TeamPort
如您所见,以 'ifcfg-' 开头的文件(接口配置文件)就是连接配置文件。当我们使用 nmcli 或 nmtui 创建新连接或修改现有连接时,结果会保存在这里作为连接配置文件。
我将展示我机器上的两个配置文件,一个带有 DHCP 配置,一个带有静态 IP 配置。
cat ifcfg-static1 cat ifcfg-Myoffice1

我们意识到有些属性的值不同,有些属性如果没有必要则不存在。
让我们快速看看最重要的属性。
TYPE– 这里是 Ethernet 类型。我们也可能有 WiFi、team、bond 等其他类型。DEVICE– 与这个配置文件关联的网络设备名称。
BOOTPROTO – 如果值为 “dhcp”,那么我们的连接配置将从DHCP服务器获取动态IP。如果值为 “none”,则不会使用动态IP,我们可能会分配一个静态IP。IPADDR – 我们分配给该配置的静态IP。PREFIX – 子网掩码。值 24 表示 255.255.255.0。你可以写下其二进制格式来更好地理解子网掩码。例如,值 16、24 和 26 分别表示前 16、24 或 26 位被设置为1,其余位为0。这定义了网络地址以及可分配的IP地址范围。GATEWAY – 网关IP。DNS1、DNS2 – 我们要使用的两个DNS服务器。ONBOOT – 如果值为 “yes”,意味着在启动时,我们的计算机将读取此配置并尝试将其分配给设备。在Linux中检查网络连接
现在,让我们继续检查我们的连接状态:
nmcli con show

设备的最后一列有助于我们了解哪些连接是“UP”且正在运行,哪些没有。在上面的图片中,你可以看到两个活动连接:Myoffice1 和 enp0s8。
提示:如果你想仅查看活动连接,请输入:
nmcli con show -a
提示:在使用 nmcli 时,你可以按下 Tab键进行自动补全,但最好使用命令的最小格式。
因此,以下命令是等效的:
nmcli connection shownmcli con show nmcli c s
在Linux中检查IP地址
如果我检查我的设备的IP地址:
ip a

我发现我的设备 enp0s3 从DHCP服务器获取了 192.168.1.6 IP,因为正在运行的连接配置 Myoffice1 有DHCP配置。
如果我将名为 static1 的连接配置设置为 “up”,那么我的设备将获得在连接配置中定义的静态IP 192.168.1.40。
nmcli con down Myoffice1 ; nmcli con up static1nmcli con show
让我们再次查看IP地址:
ip a

我们可以创建第一个连接配置。我们必须定义的最小属性是 type、ifname 和 con-name:
type– 连接的类型。ifname– 分配给我们连接的设备名称。con-name– 连接名称。
在Linux中创建新的以太网连接
让我们创建一个名为 Myhome1 的新以太网连接,分配给设备 enp0s3:
nmcli con add type ethernet con-name Myhome1 ifname enp0s3
检查其配置:
cat ifcfg-Myhome1

如你所见,它有 BOOTPROTO=dhcp,因为我们没有指定静态IP地址。
提示:我们可以使用 “nmcli con mod“ 命令修改任何连接。然而,如果您修改了 DHCP 连接并将其改为静态连接,请不要忘记将 “ipv4.method” 从 “auto” 更改为 “manual”。否则,您将获得两个 IP 地址:一个来自 DHCP 服务器,另一个是静态 IP。
让我们创建一个名为 static2 的新以太网连接配置,该配置将分配给设备 enp0s3,其静态 IP 为 192.168.1.50,子网掩码为 255.255.255.0=24,网关为 192.168.1.1。
nmcli con add type ethernet con-name static2 ifname enp0s3 ip4 192.168.1.50/24 gw4 192.168.1.1
检查其配置:
cat ifcfg-static2

在 Linux 中修改 DNS 服务器
让我们修改最后一个连接配置并添加两个 DNS 服务器。
nmcli con mod static2 ipv4.dns "8.8.8.8 8.8.4.4"
提示:这里有一个需要注意的地方:当添加或修改连接时,IP 地址和网关的属性名称不同。添加连接时使用 “ip4” 和 “gw4”,而修改它们时则使用 “ipv4” 和 “gwv4”。
在 Linux 中启动以太网连接
现在让我们启动这个连接配置:
nmcli con down static1 ; nmcli con up static2
如您所见,设备 enp0s3 现在拥有 192.168.1.50 的 IP 地址。
ip a

提示:有许多属性可以修改。如果您不记得这些属性,可以通过输入 “nmcli con show” 并随后输入连接名称来帮助自己:
nmcli con show static2

您可以修改所有以小写字母书写的属性。
例如:当您关闭连接配置时,NetworkManager 会搜索另一个连接配置并自动启动它。(我将其作为练习留作检查)。如果您不希望连接配置自动连接:
nmcli con mod static2 connection.autoconnect no
最后一个练习非常有用:您创建了一个连接配置,但希望特定用户可以使用它。对您的用户进行分类是很好的做法!
在 Linux 中设置以太网连接的权限给用户
我们仅允许用户 stella 使用此配置:
nmcli con mod static2 connection.permissions stella
提示:如果您想将权限赋予多个用户,必须输入 user:user1,user2 且之间不要有空格:
nmcli con mod static2 connection.permissions user:stella,john

如果您以其他用户身份登录,无法 “启动”此连接配置:
nmcli con show nmcli con up static2ls /etc/sysconfig/network-scripts

错误信息显示 ‘static2’ 连接不存在,尽管我们确实看到该连接存在。这是因为当前用户没有权限打开此连接。
结论:不要犹豫使用 nmcli。它简单且实用。