▼RHEL7 / CentOS 7 で、NetworkManager 管理下で WiFi の自動接続をコマンドラインで設定する▼

NetworkManagerから外して、直接 wpa_supplicant -iwlan0 で制御する 資料はよく見かけますが、 RHEL 7 で標準(のはず)のNetworkManager制御下で WiFiの自動接続を行う設定方法は意外に資料がなかったりします。

$Id: c7-nm-wifi.html,v 1.2 2021-09-06 15:36:55+09 kabe Exp $


◆「接続プロファイル」

通常の有線LANアダプタが存在する状態では、 その有線アダプタ用の「接続プロファイル」が自動で作られています。

[kabe@scorpio3 ~]$ nmcli connection show
NAME    UUID                                  TYPE            DEVICE
enp2s1  a012d956-1650-4976-b27e-65cddbefc946  802-3-ethernet  enp2s1

[kabe@scorpio3 ~]$ nmcli device status
DEVICE  TYPE      STATE         CONNECTION
enp2s1  ethernet  connected     enp2s1
wlp2s2  wifi      disconnected  --
lo      loopback  unmanaged     --

ip linkで確認できるデバイス名(enp2s1)と同じなので わかりにくいですが、 nmcli connection show で出てくるほうが 「接続プロファイル」(connection profile) です。

◆NetworkManager-wifi パッケージの確認

NetworkManager-wifi パッケージがインストールされていることをまず確認します。 最小インストールでは入っていない場合があります。

[kabe@scorpio3 ~] rpm -q NetworkManager-wifi
NetworkManager-wifi-1.12.0-6.el7.i686

入っていないと、 NetworkManager が起動時に

(wlp2s2): 'wifi' plugin not available; creating generic device
といったエラーを出し、以下の wifi 関連のコマンドは使えません。

◆wifiの「接続プロファイル」を作成する

[kabe@scorpio3 ~] sudo nmcli connection add \
	type wifi \
	ifname '*' \
	con-name aterm-8e4d37-g \
	ssid aterm-8e4d37-g
Connection 'aterm-8e4d37-g' (96221c80-ffee-4f62-ba5e-ef5dc73e5402) successfully added.

[kabe@scorpio3 ~]$ nmcli connection show	追加されたプロファイルを確認
NAME            UUID                                  TYPE             DEVICE
enp2s1          a012d956-1650-4976-b27e-65cddbefc946  802-3-ethernet   enp2s1
aterm-8e4d37-g  96221c80-ffee-4f62-ba5e-ef5dc73e5402  802-11-wireless  --

基本は、nmcli connection addです。 値が足らない場合はその旨のエラーが出ます。 type wifi のプロファイル作成時は、最低限、ifname '*' と ssid ssid が必要です。 プロファイル名は、デフォルトだと "wifi" になってしまうので、 GUIでの設定を踏襲するのであれば SSID と同じ値を con-name name で与えます。

新規プロファイルを作成すると、ファイル的には /etc/sysconfig/network-scripts/ifcfg-aterm-8e4d37-g というファイルが作られます。

この辺の RHEL の network-scripts 互換的な動作は、 NetworkManager のプラグインの /usr/lib/NetworkManager/libnm-settings-plugin-ifcfg-rh.so が行っています。

◆作成されたプロファイルを編集する

nmcli connection edit コマンドを発行し、 今作ったプロファイルを編集します。 指定できる設定項目は、 nm-settings(5) を参照してください。

[kabe@scorpio3 ~]$ sudo nmcli connection edit aterm-8e4d37-g

===| nmcli interactive connection editor |===

Editing existing '802-11-wireless' connection: 'aterm-8e4d37-g'

Type 'help' or '?' for available commands.
Type 'describe [<setting>.<prop>]' for detailed property description.

You may edit the following settings: connection, 802-11-wireless (wifi), 802-11-wireless-security (wifi-sec), 802-1x, ipv4, ipv6

nmcli> print	初期値の確認
connection.id:                          aterm-8e4d37-g
connection.uuid:                        96221c80-ffee-4f62-ba5e-ef5dc73e5402
connection.interface-name:              --
connection.type:                        802-11-wireless
connection.autoconnect:                 yes
...
nmcli> _

◆自動接続の旨を設定する

nmcli> set connection.autoconnect yes

新規プロファイルでは最初から yes になっていますが、 念のため手動でセットします。

ファイル的には、 /etc/sysconfig/network-scripts/ifcfg-aterm-8e4d37-gONBOOT=yesの設定です。 (saveコマンドを発行するまでファイルには書き込まれません)

◆802-11-wireless-security 設定を追加する

nmcli> goto 802-11-wireless-security
You may edit the following properties: key-mgmt, wep-tx-keyidx, auth-alg, proto, pairwise, group, leap-username, wep-key0, wep-key1, wep-key2, wep-key3, wep-key-flags, wep-key-type, psk, psk-flags, leap-password, leap-password-flags

nmcli 802-11-wireless-security> print	初期値の確認
['802-11-wireless-security' setting values]
802-11-wireless-security.key-mgmt:      --
...
802-11-wireless-security.psk:           <hidden>
802-11-wireless-security.psk-flags:     0 (none)
802-11-wireless-security.leap-password: <hidden>
802-11-wireless-security.leap-password-flags:0 (none)

nmcli 802-11-wireless-security> set key-mgmt
Allowed values for 'key-mgmt' property: none, ieee8021x, wpa-none, wpa-psk, wpa-eap
Enter 'key-mgmt' value: WPA-PSK
nmcli 802-11-wireless-security> set psk-flags
Enter 'psk-flags' value: 0
nmcli 802-11-wireless-security> set psk
Enter 'psk' value: xxxxxxxxxxxxxxxx

ここで重要なのが、 psk-flags を 0 (none) に設定するところです。 GUIで作成した接続プロファイルでは 1 (agent-owned) になっていて、 nmcli で接続を開始するには nmcli --ask device connect wlp2s2 と パスワードを陽に聞かれるモードにしないと接続できなくなってしまいます。

psk-flags を 0 にすると、「システム側でパスワードを保存する」モードになり、 以下の save コマンドでパスワードがファイルに保存されます。

◆固定IPアドレスをふる

固定IPアドレスをふりたい場合は、 ipv4.* 設定にて設定します。 (無線ではDHCPが普通なので、あまりやりませんが)

nmcli> goto ipv4
You may edit the following properties: method, dns, dns-search, addresses, gateway, routes, route-metric, ignore-auto-routes, ignore-auto-dns, dhcp-hostname, dhcp-send-hostname, never-default, may-fail, dhcp-client-id
nmcli ipv4> set method
Allowed values for 'method' property: auto, link-local, manual, shared, disabled
Enter 'method' value: manual
nmcli ipv4> print
['ipv4' setting values]
ipv4.method:                            manual
ipv4.dns:
ipv4.dns-search:
ipv4.addresses:
ipv4.gateway:                           --
...
nmcli ipv4> set addresses	マニュアル nm-settings(5) では address-dataを使え、とあるが…
Enter 'addresses' value: 10.5.0.99/24
nmcli ipv4> set gateway
...
nmcli ipv4> set dns
...

◆設定の保存

nmcli 802-11-wireless-security> save
Connection 'aterm-8e4d37-g' (96221c80-ffee-4f62-ba5e-ef5dc73e5402) successfully updated.
nmcli 802-11-wireless-security> _
保存すると、 なので、nmcli connection edit を使わずにファイルで直接設定したい場合は これらのファイルを手動で作ります。 が、 NetworkManager の仕様変更に弱くなるので、nmcliでやったほうが いいんじゃないでしょうか。

設定の保存にはroot権限が必要

nmcli 802-11-wireless-security> save
Error: Failed to save 'aterm-8e4d37-g' (96221c80-ffee-4f62-ba5e-ef5dc73e5402) connection: Insufficient privileges.
と言われる場合は、sudo nmcli connection edit でroot権限で起動しましょう。

スクリプトで全自動設定したい

nmcli connection edit はインタラクティブなので、 スクリプトに固定したい時は以下のように書き下します。

nmcli connection modify con-name connection.autoconnect yes
nmcli connection modify con-name 802-11-wireless-security.key-mgmt wpa-psk
nmcli connection modify con-name 802-11-wireless-security.psk-flags 0
nmcli connection modify con-name 802-11-wireless-security.psk xxxxxxxxx


▼接続する

プロファイルを編集すれば接続されますが、 陽に接続を開始させるには

$ nmcli connection up aterm-8e4d37-g	接続プロファイルで接続する
もしくは
$ nmcli device connect wlp2s1	デバイス指定で接続する
従来互換の ifup aterm-8e4d37-gでも接続できますが、 ifup内部では nmcli con up を起動しているので同じことです。

無線インタフェースを複数持っている場合は、 デバイス指定でどっちを使うか選べます。実験以外ではあまりそういうことは ないかもしれませんが。


▼切断する

$ nmcli connection down aterm-8e4d37-g	接続プロファイル
もしくは
$ nmcli device disconnect wlp2s1	デバイス指定

▼参考文献


かべ@sra-tohoku.co.jp