NetworkManager

备注

当前主流发行版采用网络管理工具主要有:

在桌面系统中,例如 Fedora (server/workstation) 以及 Ubuntu Workstation ,通常会使用 NetworkManager 配置,不仅有字符命令配置,也有GUI方便完成设置。

Jetson Nano 上NVIDIA官方提供的是基于 Ubuntu Linux 桌面版 18.04 LTS改造的L4T系统,默认使用的就是 NetworkManager管理网络,熟悉使用对桌面发行版Linux会有很大帮助。

2024年3月,我重新部署 Raspbery Pi OS(Raspbian) (使用我的 树莓派硬件 重新开始构建 边缘云计算架构 ,可以看到最新的树莓派基于 Debian 12内置网络管理系统也已经采用了 NetworManager

移动云架构 部署中,我采用了 Fedora NetworkManager网络管理 来配置 ARM移动云的虚拟机部署 的静态IP地址

nmcli

nmcli 是一个控制NetworkManager并且报告网络状态的工具。nmcli可以替代 nm-applet 或者其他图形管理工具来处理网络。nmcli可以创建,显示,编辑,删除,激活和关闭网络连接,也可以用来显示网络设备状态。

通过使用nmcli可以避免手工管理网络链接,也方便脚本编写。注意NetworkManager也支持运行脚本,这种方式称为 dispatcher scripts 以便能够响应网络事件。nmcli可以在没有图形界面的服务器,headless服务器和终端执行。

General命令

general 命令提供了NetworkManager状态和权限的显示,可以用来获得或修改系统主机名。

  • 检查状态:

    nmcli general status
    

显示输出:

STATE                  CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN
connected (site only)  limited       enabled  enabled  enabled  enabled

如果主机配置了DHCP但是没有获得IP地址,则会显示(例如我在 私有云架构 使用Fedora虚拟机,切换到 libvirt 网桥型网络 后没有DHCP提供IP地址):

STATE       CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN
connecting  none          enabled  enabled  enabled  enabled
  • 检查主机名:

    nmcli general hostname
    

显示输出的是主机名:

jetson
  • 可以修改主机名(实际是修改 /etc/hostname ):

    nmcli general hostname jetson-r
    

这个命令和 hostnamectl set-hostname jetson-r 是同样效果,都是修改 /etc/hostname 配置。

nmcli命令规律

nmcli命令的规律是尽可能使用 help ,每一级命令都有help可以帮助你进行下一级子命令。

  • 假设我们需要修改连接名字,即上述默认名字是 Wired connection 1 和我期望的管理网络连接命名不一致,所以我想修改。则先输入命令 nmcli connection modify help ,就会提示:

    Usage: nmcli connection modify { ARGUMENTS | help  }
    
    ARGUMENTS := [id | uuid | path] <ID> ([+|-]<setting>.<property> <value>)+
    ...
    Examples:
    nmcli con mod home-wifi wifi.ssid rakosnicek
    nmcli con mod em1-1 ipv4.method manual ipv4.addr "192.168.1.2/24, 10.10.1.5/8"
    nmcli con mod em1-1 +ipv4.dns 8.8.4.4
    nmcli con mod em1-1 -ipv4.dns 1
    nmcli con mod em1-1 -ipv6.addr "abbe::cafe/56"
    nmcli con mod bond0 +bond.options mii=500
    nmcli con mod bond0 -bond.options downdelay
    
  • 检查连接:

    nmcli con
    

例如,在 Fedora 虚拟机中看到:

NAME    UUID                                  TYPE      DEVICE
enp1s0  239c09f4-a28c-46e3-b5c7-2beb90c594f2  ethernet  enp1s0

就可以通过后续 nmcli con modify "enp1s0" 来修订(默认安装以后系统生成的是DHCP配置 /etc/NetworkManager/system-connections/enp1s0.nmconnection )

  • 注意 nmcli conneciton edit 命令会需要你使用子命令 set connection.id XXX; set connection.interface-name xxx; 都会使用 set 子命令,在单条命令时不需要使用 set ,所以我们直接使用:

    nmcli connection modify "Wired connection 1" connection.id manage
    

可以看到,如果我们需要修改 connection 的子属性,只需要使用 . ,所以上述命令就把连接的名字修改成 manage ,此时我们检查 nmcli connection 就可以看到连接名字修改了:

NAME    UUID                                  TYPE      DEVICE
ali     3bdf8189-6c9b-4d35-a83b-71441b22ba92  wifi      wlan0
manage  a94fa1de-b290-3b83-9f49-137981396543  ethernet  eth0
  • 如果之前没有用NetworkManager管理网络,则可以添加:

    nmcli con add con-name "static-eth0" ifname eth0 type ethernet ip4 192.168.6.7/24 gw4 192.168.6.200
    nmcli con mod "static-eth0" ipv4.dns "xxx.xxx.120.1,8.8.8.8"
    
  • 很多修改需要看一下属性案例,例如需要修改IP地址:

    nmcli connection modify "manage" ipv4.method manual
    nmcli connection modify "manage" ipv4.address 192.168.6.9/24
    nmcli con modify manage ipv4.gateway 192.168.6.1
    
  • 很多时候初始安装的虚拟机采用DHCP方式,需要切换到静态IP地址,执行以下命令:

    nmcli connection modify "enp1s0" ipv4.method manual ipv4.address 192.168.6.242/24 ipv4.gateway 192.168.6.200 ipv4.dns "192.168.6.200,192.168.6.11"
    

备注

我感觉手册非常枯燥,还是需要看案例比较清晰,请参考 27 nmcli command examples (cheatsheet), compare nm-settings with if-cfg file

  • 假设我要删除 eth0 上的默认网关,则修改 manage 网络连接:

    nmcli con modify "manage" ipv4.gateway ""
    
  • 注意:修改配置以后不会直接生效,需要执行激活 nmcli connection up id <connection name>

    nmcli connection up id "manage"
    

提示显示:

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)

nmcli命令案例

备注

在游泳中学游泳

检查NetworkManager是否运行

  • nmcli提供了 -t 参数可以简短( --terse )输出,结合 -f 可以指点字段 ( --field ):

    nmcli -t -f RUNNING general
    

输出就是简单的:

running
  • 当然,什么参数也没有就是所有信息:

    nmcli general
    

输出:

STATE      CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN
connected  full          enabled  enabled  enabled  enabled

列出所有可用设备

  • dev 对象状态可显示所有可用设备:

    nmcli dev status
    

输出显示:

DEVICE  TYPE      STATE      CONNECTION
wlan0   wifi      connected  ali
eth0    ethernet  connected  manage
l4tbr0  bridge    unmanaged  --
dummy0  dummy     unmanaged  --
rndis0  ethernet  unmanaged  --
usb0    ethernet  unmanaged  --
lo      loopback  unmanaged  --

备注

我注意到这里有2个特别的以太网设备:

rndis0  ethernet  unmanaged  --
usb0    ethernet  unmanaged  --

这是我之前调研过的 ethernet over usb设备,也就是微软平台和Linux平台通讯的USB连接以太网卡,我后续准备参考 ARM9 Based Platforms - Enabling USB RNDIS Support 实践

USB Device RNDIS to Ethernet Bridge

How to use USB device networking

配置静态IP地址

  • 检查连接:

    nmcli
    
  • 配置静态IP地址:

    nmcli con add con-name "static-eth0" ifname eth0 type ethernet ip4 192.168.6.7/24 gw4 192.168.6.200
    nmcli con mod "static-eth0" ipv4.dns "xxx.xxx.120.1,8.8.8.8"
    nmcli con up id "static-eth0"
    

配置单网卡多IP(IP Aliasing)

我没有找到直接使用 nmcli 来添加IP别名的命令行文档,不过 NetworkManager 有一个终端交互界面程序 nmtui (Text User Interface for controlling NetworkmNager),可以非常方便配置网络以及IP Aliasing:

  • 运行:

    nmtui
    
  • 选择菜单 Edit a connection => eth0 => 则在下图中,可以为 eth0 添加多个IP地址:

../../../_images/nmtui_ip_aliasing.png
  • 实际完成后可以检查 /etc/NetworkManager/system-connections/eth0 :

nmtui配置/etc/NetworkManager/system-connections/eth0的单网卡多IP(IP Aliasing)
[connection]
id=eth0
uuid=a94fa1de-b290-3b83-9f49-137981396543
type=ethernet
autoconnect-priority=-999
permissions=
timestamp=1648732842

[ethernet]
auto-negotiate=true
mac-address=00:00:00:00:00:01
mac-address-blacklist=

[ipv4]
address1=192.168.7.23/24
address2=192.168.6.23/24
dns-search=
method=manual

[ipv6]
addr-gen-mode=stable-privacy
dns-search=
ip6-privacy=0
method=auto
  • 然后需要重启一次网卡来激活:

    nmcli con down eth0
    nmcli con up eth0
    
  • 观察 ip addr list 就可以看到 eth0 上绑定了2个IP地址:

    3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:00:00:00:00:01 brd ff:ff:ff:ff:ff:ff
        inet 192.168.7.23/24 brd 192.168.7.255 scope global noprefixroute eth0
           valid_lft forever preferred_lft forever
        inet 192.168.6.23/24 brd 192.168.6.255 scope global noprefixroute eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::1f6:d793:b68c:bbcd/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    

备注

不过,NetworkManager不直接支持 IP Aliasingeth0eth0:1 这样的配置

配置无线网络

我在 Kali Linux网络配置 实践中有一个配置无线网络的案例,汇总整理在这里

  • 对于5GHz无线网络必须指定的国家编码,否则会导致非常奇怪的连接不存在全为0的SSID热点 ( 5G Hz无线网络国家代码 ):

    • 配置 wpa_supplicant.conf

      ``country=CN``
      
    • 或者配置 /etc/default/crda

      REGDOMAIN=CN
      
  • 检查无线网络AP:

    sudo nmcli device wifi list
    

显示:

IN-USE  BSSID              SSID    MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
...
        80:A2:35:45:8D:D8  office  Infra  56    130 Mbit/s  52      **    WPA2 802.1X
...
        80:A2:35:45:B2:00  home    Infra  8     130 Mbit/s  80      ***   WPA2
  • 增加连接到 home 热点(WPA认证)的网络连接:

nmcli添加wpa-psk认证wifi
nmcli con add con-name home ifname wlp3s0 type wifi ssid home \
      wifi-sec.key-mgmt wpa-psk wifi-sec.psk MYPASSWORD
nmcli添加wpa-psk认证wifi的静态IP地址
nmcli con add con-name home ifname wlp3s0 type wifi ssid home \
      wifi-sec.key-mgmt wpa-psk wifi-sec.psk MYPASSWORD \
      ipv4.method manual ipv4.address 192.168.7.23/24 \
      ipv4.dns 192.168.7.11 ipv4.gateway 192.168.7.1
  • 添加连接到 office 热点的网络连接:

nmcli添加wpa-eap认证(802.1x)wifi
nmcli con add con-name office ifname wlan0 type wifi ssid office \
  wifi-sec.key-mgmt wpa-eap 802-1x.eap peap 802-1x.phase2-auth mschapv2 \
  802-1x.identity "USERNAME" 802-1x.password "MYPASSWORD"
  • 执行以下命令连接到 home 热点:

    nmcli con up home
    

如果要连接 office 热点则使用:

nmcli con up office

MAC Spoofing

NetworkManager的Mac Spoofing是通过 ethernet.cloned-mac-addresswifi.cloned-mac-address 属性实现的,通过 nmcli 命令可以设置。

  • 查看连接:

    nmcli con show
    
  • 修改连接,添加 cloned-mac-address 属性:

    nmcli con modify <con_name> wifi.cloned-mac-address XX:XX:XX:XX:XX:XX
    

备注

如果不知道需要修改的属性名字,可以通过 nmcli con show <con_name> | grep cloned 来查看。

  • 然后启动连接:

    nmcli con up <con_name>
    

一旦启动连接,就会看到无线网卡的MAC地址做了spoofing修改。

nmtui

nmcli 虽然非常强大灵活,适合服务器远程管理,但是对于普通用户而言还是有些复杂。所以NetworkManager还提供了一个 nmtui ( Text User Interface for controlling NetworkManager ),提供了基本的交互生成配置的终端图形工具:

../../../_images/nmtui.png

简而言之,可以使用方向键或者 Tab键 / Shift+Tab键 在选项中移动,使用 Enter 键选择选项,并使用 Space 键切换状态。操作有点繁琐,但是能正确生成NetworkManager配置文件。

上文其实已经介绍过使用 nmtui 来为网卡添加IP Alias,可以看到命令行添加配置是可以为配置命名 eth0 的,也就是对应于 /etc/NetworkManager/system-connections/eth0 配置文件(名)。

而在 树莓派(Raspberry Pi)快速起步 配置静态IP地址时,使用 nmtui 交互配置IP最为方便,简单来说交互设置完成后,生成了一个 /etc/NetworkManager/system-connections/'Wired connection 1.nmconnection' 配置:

通过 nmtui 交互生成的树莓派静态IP地址配置文件 /etc/NetworkManager/system-connections/'Wired connection 1.nmconnection'
[connection]
id=Wired connection 1
uuid=c76cf7a8-9e5e-37f8-bbf6-792ccd3c595c
type=ethernet
autoconnect-priority=-999
interface-name=eth0

[ethernet]

[ipv4]
address1=192.168.7.11/24,192.168.7.1
dns=192.168.7.1;
dns-search=cloud-atlas.io;
method=manual

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

[proxy]

参考