作为 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
    
    检查服务器IP地址
    检查服务器IP地址

    我发现我的设备 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
    
    检查网络静态IP地址
    检查网络静态IP地址

    我们可以创建第一个连接配置。我们必须定义的最小属性是 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
    
    验证新网络连接的 IP 地址
    验证新网络连接的 IP 地址

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

    nmcli con show static2
    
    验证新网络连接的 IP 地址
    验证新网络连接的 IP 地址

    您可以修改所有以小写字母书写的属性。

    例如:当您关闭连接配置时,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。它简单且实用。