在ThinkPadX220笔记本上安装CentSO 7操作系统,系统安装过程自动配置了wifi。然而,和原先Mac上安装Gentoo Linux不同,当前RHEL/CentOS 7采用NetworkManager来管理网络,虽然也使用了wpa_supplicent程序,但是配置文件做了很大调整。既熟悉又陌生的配置方法,让我很是迷惑了一阵。

本文是采用NetworkManager命令行操作的经验总结,也是适应开源技术发展的学习实践。

nmcli是NetworkManager命令行管理工具。

NetworkManager状态

  • 显示NetworkManager状态
nmcli general status

如果已经有网络连接,则显示类似如下

STATE      CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN
connected  full          enabled  enabled  enabled  enabled
  • 显示激活的连接
nmcli connection show --active

显示网络连接概要

NAME    UUID                                  TYPE             DEVICE
mylink  cc54be34-0ad5-4bc7-ad76-f7f33ef8bc2c  802-11-wireless  wlp3s0
  • 显示所有已经配置的连接
nmcli connection show

该命令会显示目前已经配置的所有配置名列表:

NAME         UUID                                  TYPE             DEVICE
mylink       cc54be34-0ad5-4bc7-ad76-f7f33ef8bc2c  802-11-wireless  wlp3s0
comlink      f771d330-1639-40a7-a705-842ebbc59939  802-11-wireless  --
enp0s25      4ac9284e-d7e0-49e6-9f58-a9530cd5d36f  802-3-ethernet   --

如果要详细显示某个配置,例如,我配置了mylink,需要详细查看:

nmcli connection show mylink

连接或者断开已经已经配置的连接

通过名字来连接一个已经配置的连接

nmcli connection up id <connection name>

通过名字断开连接

nmcli connection down id <connection name>

Wifi

  • 获取wifi状态
nmcli radio wifi

如果wifi是激活状态的会显示enabled

  • 开启或关闭wifi
nmcli radio wifi <on|off>
  • 显示所有可以连接的访问热点(AP):
nmcli device wifi list

显示输出

*  SSID           MODE   CHAN  RATE       SIGNAL  BARS  SECURITY
   Xiaomi_9DE8    Infra  4     54 Mbit/s  59      ▂▄▆_  WPA1 WPA2
*  mylink         Infra  11    54 Mbit/s  58      ▂▄▆_  WPA2
   ChinaNet-An3r  Infra  11    54 Mbit/s  52      ▂▄__  WPA1 WPA2
  • 刷新AP
nmcli device wifi rescan
  • 创建一个连接到开放AP的新连接:
nmcli device wifi connect <SSID|BSSID>
  • 创建一个连接到有密码保护的AP
nmcli device wifi connect <SSID|BSSID> password <password>

网络接口

  • 列出可用接口和它们的状态
nmcli device status

显示如下

DEVICE   TYPE      STATE        CONNECTION
wlp3s0   wifi      connected    mylink
enp0s25  ethernet  unavailable  --
lo       loopback  unmanaged    --
  • 断开一个接口
nmcli device disconnect iface <interface>
  • 创建或修改一个连接

  • 使用交互编辑方式创建一个连接

nmcli conncection edit con-name <name of new connection>

要编辑一个已经存在的连接:

nmcli connection edit <connection name>

不过交互界面很繁琐,实际还是以命令行来设置较为方便

实践笔记

  • 新增加一个wifi类型连接,连接到名为mylink的AP上
nmcli con add con-name mylink ifname wlp3s0 type wifi ssid mylink

提示信息:

Connection 'mylink' (cc54be34-0ad5-4bc7-ad76-f7f33ef8bc2c) successfully added.

如果要配置静态IP地址,可以使用

nmcli con add con-name mylink ifname wlp3s0 type wifi ssid mylink \
ip4 192.168.1.101/24 gw 192.168.1.1

NetworkManager设置了内部参数connection.autoconnectyes,并且在/etc/sysconfig/network-scripts/ifcfg-mylink配置中设置ONBOOT=yes以便启动时连接。

  • 修改mylink配置,增加wifi密码管理方式wpa-psk
nmcli con modify mylink wifi-sec.key-mgmt wpa-psk
  • mylink配置添加访问密码:
nmcli con modify mylink wifi-sec.psk MYPASSWORD
  • 指定设备连接
nmcli dev connect wlp3s0

连接命令也可以通过指定配置方式:

nmcli con up mylink

这里wlp3s0是已经配置过的无线网卡设备,会根据这个接口上配置过的多个config选择最合适的AP进行连接。

连接成功提示无线ESSID对应的UUID

Device 'wlp3s0' successfully activated with 'cc54be34-0ad5-4bc7-ad76-f7f33ef8bc2c'

配置文件解析

nmcli con add con-name mylink ifname wlp3s0 type wifi ssid mylinknmcli con modify mylink wifi-sec.key-mgmt wpa-psk指令生成了对应配置文件:

  • /etc/sysconfig/network-scripts/ifcfg-mylink
ESSID="mylink"
MODE=Managed
TYPE=Wireless
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=mylink
UUID=cc54be34-0ad5-4bc7-ad76-f7f33ef8bc2c
DEVICE=wlp3s0
ONBOOT=yes
KEY_MGMT=WPA-PSK
MAC_ADDRESS_RANDOMIZATION=default
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes

nmcli con modify mylink wifi-sec.psk MYPASSWORD指令生成了对应密码配置文件

  • /etc/sysconfig/network-scripts/keys-mylink - 文件权限是600只对root用户可读写
WPA_PSK='MYPASSWORD'

wifi接口静态MAC地址

默认情况下,wifi接口的MAC地址是随机生成的,在网卡接口配置/etc/sysconfig/network-scripts/ifcfg-mylink中有如下配置

MAC_ADDRESS_RANDOMIZATION=default

该配置导致每次网卡启动后MAC地址随机生成。

参考 Configuring MAC Address Randomization

在NetworkManager 1.4.0,支持两种随机MAC地址方式:在扫描时随机生成,和 固定随机生成。这两种方式可以通过 /etc/NetworkManager/NetworkManager.conf 配置。

从 NetworkManager 1.2.0开始默认激活了Wifi扫描时随机生成MAC地址,可以通过添加以下行配置禁止:

[device]
wifi.scan-rand-mac-address=no

相反,固定随机生成则在每个不同连接时生成一个不同的MAC地址。这对于一些环境,如基于你的MAC地址的登录系统。要使用这种固定随机生成,则使用配置

[connection]
wifi.cloned-mac-address=random

[connection]
ethernet.cloned-mac-address=random

关闭随机生成MAC地址,并设置固定MAC地址

WPA认证

  • 配置 /etc/NetworkManager/NetworkManager.conf 添加
[device]
wifi.mac-address-randomization=1

这里值1表示never

参考 Re: How to activate MAC address randomization?

typedef enum {
»···NM_SETTING_MAC_RANDOMIZATION_DEFAULT = 0,
»···NM_SETTING_MAC_RANDOMIZATION_NEVER = 1,
»···NM_SETTING_MAC_RANDOMIZATION_ALWAYS = 2,
} NMSettingMacRandomization;

然后重启主机,就会看到WIFI网络接口的MAC地址始终保持不变。

实践发现,WPA认证仅设置wifi.mac-address-randomization=1就能够保持MAC不变,只使用网卡实际MAC地址。但是,在802.1X认证中发现,需要同时设置wifi.scan-rand-mac-address=no才能使用MAC地址保持不变。

  • 接下来我们需要设置一个固定MAC地址,编辑 /etc/sysconfig/network-scripts/ifcfg-mylink

参考 Changing Your MAC Address/Linux

添加如下配置

MACADDR=12:34:56:78:90:ab

注意MACADDR=配置和HWADDR=配置不同,前者是设置接口MAC地址,后者是根据接口MAC地址标识。

重启主机,就可以看到每次无线网卡的MAC地址都是指定设置的 12:34:56:78:90:ab

注意:配置文件修改也可以通过 nmcli 命令进行(实际也是设置相同的配置):

nmcli connection modify mylink wifi.cloned-mac-address 12:34:56:78:90:ab

为什么是wifi.cloned-mac-address?这是参考MAC Address Spoofing in NetworkManager 1.4.0,NetworkManager一直提供了这个参数来设置指定MAC。对应在Dbus中,这个参数是assinged-mac-address

802.1X认证

经过实践验证,nmcli指令可以完成802.1x配置创建和使用,但是在MAC spoof上实践没有成功生效。待进一步验证。

  • 通过nmcli创建配置
nmcli con add con-name comlink ifname wlp3s0 type wifi ssid comlink \
wifi-sec.key-mgmt wpa-eap 802-1x.eap peap 802-1x.phase2-auth mschapv2 \
802-1x.identity "USERNAME" 802-1x.password "PASSWORD" wifi.cloud-mac-address 12:34:56:78:90:ab

上述命令就可以完整创建 ifcfg-comlink 配置和对应的密码配置 keys-comlink

命令案例参考 How to connect to an 802.1x wireless network via nmcli

  • 然后执行启动
nmcli connection up comlink

/var/log/wpa_supplicant.log 有认证日志信息可以作为排查依据(从ps aux | grep wpa_supplicant可以找到对应日志):

EAP-TLV: TLV Result - Failure
wlp3s0: CTRL-EVENT-EAP-FAILURE EAP authentication failed
wlp3s0: CTRL-EVENT-DISCONNECTED bssid=4c:48:da:25:0a:b9 reason=23

以下步骤是手工配置方法,供参考。建议还是采用nmcli命令来创建配置(见前述)

参考 What’s new with NetworkManager? 提到了Wi-Fi增强中,从 NetworkManager 1.4.0开始,支持指定MAC地址,使用的是 802-11-wireless.cloned-mac-address属性:

  • MAC地址
  • permanent - 使用设备的永久MAC地址
  • preserve - 激活时不更改设备MAC
  • random - 每次链接生成一个随机MAC地址
  • stable - 生成一个固定的哈希的MAC地址

详细参考 MAC Address Spoofing in NetworkManager 1.4.0

  • 配置 /etc/NetworkManager/NetworkManager.conf 添加(手工修改配置文件实际应该和nmcli指令配置方法相同)
[device-mac-randomization]
wifi.scan-rand-mac-address=no
wifi.cloned-mac-address=12:34:56:78:90:ab  # 这行没有生效

wifi.scan-rand-mac-address=no似乎和wifi.mac-address-randomization=1起的是相同作用?

由于 /etc/NetworkManager/NetworkManager.conf 添加wifi.cloned-mac-address没有生效,则采用 nmcli connection modify comlink wifi.cloned-mac-address 12:34:56:78:90:ab。原来 nmcli 是修改了/etc/sysconfig/network-scripts/ifcfg-comlink配置,添加了MACADDR=12:34:56:78:90:AB

  • 配置/etc/sysconfig/network-scripts/ifcfg-comlink(如上所述)

假设802.1X认证的AP名字是comlink,使用以下命令设置(可选),也可以直接修改配置文件

nmcli connection modify comlink wifi.cloned-mac-address 12:34:56:78:90:ab

但是,实际操作发现nmcli命令设置wifi.cloned-mac-address的方法虽然成功在/etc/sysconfig/network-scripts/ifcfg-comlink添加了MACADDR=12:34:56:78:90:AB,但是操作系统启动后发现,MAC地址只是恢复成了无线网卡实际的MAC地址,而没有实现MAC spoof。

802.1X认证中的MAC spoof

  • 虽然ifcfg-comlink配置中MACADDR=12:34:56:78:90:AB无效,但是可以手工通过ip link set dev指令设置无线网卡MAC地址:
ip link set dev wlp3s0 down
ip link set dev wlp3s0 address 12:34:56:78:90:ab
ip link set dev wlp3s0 up

验证确实能够成功更改无线网卡MAC地址

  • 另外实践验证,通过udev rules设置,可以实现操作系统启动网卡时自动更改无线网卡MAC - 这个机制利用了systemd-udev机制。即参考 MAC address spoofing 设置 /etc/udev/rules.d/75-mac-spoof.rules :
ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="物理网卡硬件MAC地址", RUN+="/sbin/ip link set dev %k address 12:34:56:78:90:ab"

操作系统重启就可以看到无线网卡MAC地址正确设置成了12:34:56:78:90:ab

  • 然而,通过nmcli命令,没有任何参数时候查看发现,无线网卡的MAC地址立即被随机修改了
wlp3s0: disconnected
        "Intel Centrino Advanced-N 6205 [Taylor Peak] (Centrino Advanced-N 6205 AGN)"
        1 connection available
        wifi (iwlwifi), 94:ED:CD:8E:EB:3F, hw

非常奇怪,从nmcli命令查看无线网卡wifi(iwlwifi)设备的MAC地址依然是一个随机MAC地址。

802.1X认证密码文件

在完成了MAC地址修改之后,执行链接AP

nmcli connection up comlink

此时提示错误

Passwords or encryption keys are required to access the wireless network 'comlink'.
Warnging: password for '802-1x.identity' not given in 'passwd-file' and nmcli cannot ask without '--ask' option.
Error: Connection activation failed.

这个问题比较奇怪,实际上前述nmcli con add con-name comlink实际上已经在配置文件中存储了认证帐号名字和密码。

参考 802.1x with NetworkManager using nmcli 提供了一种设置帐号密码的方法,就是在/etc/NetworkManager/system-connections/CONNECTION_NAME保存密码,即编辑/etc/NetworkManager/system-connections/comlink

[connection]
id=comlink

[802-1x]
password=YOUR_8021X_PASSWORD

参考

results matching ""

    No results matching ""