NetworkManager¶
备注
当前主流发行版采用网络管理工具主要有:
NetworkManager
在桌面系统中,例如 Fedora (server/workstation) 以及 Ubuntu Workstation ,通常会使用 NetworkManager 配置,不仅有字符命令配置,也有GUI方便完成设置。
Jetson Nano 上NVIDIA官方提供的是基于 Ubuntu Linux 桌面版 18.04 LTS改造的L4T系统,默认使用的就是 NetworkManager管理网络,熟悉使用对桌面发行版Linux会有很大帮助。
移动云架构 部署中,我采用了 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 实践
配置静态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地址:
实际完成后可以检查
/etc/NetworkManager/system-connections/eth0:
[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 Aliasing 的 eth0 和 eth0:1 这样的配置
配置无线网络¶
我在 Kali Linux网络配置 实践中有一个配置无线网络的案例,汇总整理在这里
对于5GHz无线网络必须指定的国家编码,否则会导致非常奇怪的连接不存在全为0的SSID热点 ( 5G Hz无线网络国家代码 ):
配置
wpa_supplicant.conf``country=CN``
或者配置
/etc/default/crdaREGDOMAIN=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 con add con-name home ifname wlp3s0 type wifi ssid home \
wifi-sec.key-mgmt wpa-psk wifi-sec.psk MYPASSWORD
我在 边缘云计算架构 为 边缘计算Jetson Nano网络 的无线网络配置静态IP以便能够构建 K3s - 轻量级Kubernetes 工作节点:
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 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-address 和 wifi.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修改。