wpa_supplicant
wpa_supplicant はクロスプラットフォームのサプリカントで WEP, WPA, WPA2 (IEEE 802.11i / RSN (Robust Secure Network)) をサポートしています。デスクトップやノートパソコン、組込みシステムを対象としています。
wpa_supplicant はクライアントステーションで使われている IEEE 802.1X/WPA コンポーネントです。WPA アクセスポイントとのキーネゴシエーションを実装しており、無線ドライバーのローミングと IEEE 802.11 認証/アソシエーションを制御します。
インストール
wpa_supplicant パッケージをインストールしてください。メインのプログラムである wpa_supplicant とパスフレーズツールの wpa_passphrase、テキストフロンドの wpa_cli が含まれています。
任意で、wpa_supplicant のグラフィカルフロントエンドである wpa_gui が入っている wpa_supplicant_guiAUR もインストールしてください。
概要
暗号化された無線ネットワークに接続するためにまず wpa_supplicant が WPA アクセスポイントから認証を取得します。このために、wpa_supplicant を設定して適切な証明書をアクセスポイントに送信できるようにしておく必要があります。認証が成功したら、通常通り IP アドレスを取得してネットワークに接続することが可能になります。
wpa_cli で接続する
実行中に wpa_supplicant をインタラクティブに設定するのに使われるコマンドラインツール wpa_cli を利用します。この接続方法では利用可能なネットワークをスキャンすることができます。詳しくは wpa_cli(8) を見て下さい。
wpa_cli を使用するには、wpa_supplicant のコントロールインターフェイスを指定して設定を更新する権限を与える必要があります。最小限の設定ファイルを作成してください:
/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/run/wpa_supplicant update_config=1
そして次のコマンドで wpa_supplicant を起動します:
# wpa_supplicant -B -i interface -c /etc/wpa_supplicant/wpa_supplicant.conf
ここで次を実行すると:
# wpa_cli
インタラクティブプロンプト (>
) が現れます。タブ補完機能と完全なコマンドの説明があります。
scan
と scan_results
コマンドを使って利用可能なネットワークを表示してください:
> scan OK <3>CTRL-EVENT-SCAN-RESULTS > scan_results bssid / frequency / signal level / flags / ssid 00:00:00:00:00:00 2462 -49 [WPA2-PSK-CCMP][ESS] MYSSID 11:11:11:11:11:11 2437 -64 [WPA2-PSK-CCMP][ESS] ANOTHERSSID
MYSSID
と接続するには、ネットワークを追加して証明書を設定し、有効にします:
> add_network 0 > set_network 0 ssid "MYSSID" > set_network 0 psk "passphrase" > enable_network 0 <2>CTRL-EVENT-CONNECTED - Connection to 00:00:00:00:00:00 completed (reauth) [id=0 id_str=]
SSID にパスワード認証が設定されていない場合、set_network 0 psk "passphrase"
コマンドを set_network 0 key_mgmt NONE
に置き換えて明示的にパスワードを使わないとネットワークを設定してください。
最後にこのネットワークを設定ファイルに保存してください:
> save_config OK
これで WAP の設定は完了です。iproute2 スイートを使用するか systemd-networkd や dhcpcd などのネットワークプログラムを使って手動で設定して IP アドレスを取得してください。ネットワーク#IP アドレスの設定も参照してください。例えば:
# dhcpcd interface
wpa_passphrase で接続する
この接続方法では SSID が既知のネットワークに素早く接続することができます。wpa_supplicant が使用する最小限の設定を作成するコマンドラインツール wpa_passphrase を使います。例:
$ wpa_passphrase MYSSID passphrase
network={ ssid="MYSSID" #psk="passphrase" psk=59e0d07fa4c7741797a4e394f38a5c321e3bed51d54ad5fcbd3f84bc7415d73d }
これは wpa_passphrase で wpa_supplicant が関連付けられることを意味し次のコマンドで簡単に起動できます:
# wpa_supplicant -B -i interface -c <(wpa_passphrase MYSSID passphrase)
WAP との関連付けが完了したら、iproute2 スイートを使用するか systemd-networkd や dhcpcd などのネットワークプログラムを使って手動で設定して IP アドレスを取得してください。ネットワーク#IP アドレスの設定も参照してください。例えば:
# dhcpcd interface
高度な使用方法
EAP を後で利用するなど、複雑性が変化するネットワークでは、カスタマイズした設定ファイルを作るのが有用かもしれません。設定の例と大要については、wpa_supplicant.conf(5) を参照してください。サポートされている設定パラメータの詳細についてはサンプルファイルの /usr/share/doc/wpa_supplicant/wpa_supplicant.conf
を参照してください [1]。
設定
wpa_passphrase で接続するを読めば明らかなように、基本の設定ファイルは次のコマンドで生成できます:
# wpa_passphrase MYSSID passphrase > /etc/wpa_supplicant/example.conf
これによって network
セクションだけが作成されます。よく使われるオプションを記述した設定ファイルは以下のようになります:
/etc/wpa_supplicant/example.conf
ctrl_interface=/run/wpa_supplicant ctrl_interface_group=wheel update_config=1 country=US # ISO/IEC alpha2 country code ap_scan=1 network={ ssid="MYSSID" psk=59e0d07fa4c7741797a4e394f38a5c321e3bed51d54ad5fcbd3f84bc7415d73d }
クォートで囲むことでパスフレーズは平文で定義することもできます。ただしセキュリティについて十分に警戒してください:
network={ ssid="MYSSID" psk="passphrase" }
ネットワークにパスフレーズが設定されていない場合 (公共の Wi-Fi など):
network={ ssid="MYSSID" key_mgmt=NONE }
network
ブロック以下は手動で追加するか、wpa_cli で接続するで説明されているように wpa_cli を使います。wpa_cli を使用するには、コントロールインターフェイスを ctrl_interface
オプションで設定する必要があります。ctrl_interface_group=wheel
と設定することで wheel グループに属するユーザーが wpa_cli を実行することが可能になります (root 権限がなくても無線ネットワークに接続できるようになります)。また、update_config=1
を追加すると wpa_cli による example.conf
への変更が保存されるようになります。
fast_reauth=1
と ap_scan=1
は書き込み時にグローバルで有効になる wpa_supplicant オプションです。この2つのオプションや、その他のグローバルオプションが必要かどうかは、接続するネットワークのタイプによります。他のグローバルオプションが必要な場合、/usr/share/doc/wpa_supplicant/wpa_supplicant.conf
からファイルにオプションをコピーしてください。
また、wpa_cli set
を使うことでオプションの状態を見たり新しいオプションを設定することができます。この設定には複数の network ブロックを追記できます: サプリカントは関連付けを管理しそれら全てのローミングを行います。通常は network ブロックで定義された一番強いシグナルがデフォルトで接続されます、priority=
で挙動を変えることができます。
/usr/share/doc/wpa_supplicant/wpa_supplicant.conf
のカスタマイズした設定ファイルを使用する利点はデフォルトで dhcpcd によって使用されることです。その場合、オリジナルのバックアップを作成してその中の拡張 network ブロックの例を削除することができます。さもなければ、突然定義されたネットワークにデバイスが接続されても驚かないで下さい。どんな場合でも、設定ファイルの新しいバージョンへの変更はマージするべきです。
接続
手動
まず wpa_supplicant コマンドを起動します、よく使われる引数は:
-B
- バックグラウンドにフォーク。-c filename
- 設定ファイルのパス。-i interface
- listen するインターフェイス。-D driver
- 使用するドライバーを任意で指定。サポートされているドライバーのリストはwpa_supplicant -h
の出力を見て下さい。nl80211
が現在の標準ですが、全ての無線チップモジュールがこれをサポートしているわけではありません。wext
は現在推奨されていませんが、いまだに幅広くサポートされています。
引数の完全なリストは wpa_supplicant(8) を見て下さい。例:
# wpa_supplicant -B -i interface -c /etc/wpa_supplicant/example.conf
iproute2 スイートを使用するか systemd-networkd や dhcpcd などのネットワークプログラムを使って手動で設定して IP アドレスを取得してください。ネットワーク#IP アドレスの設定も参照してください。例えば:
# dhcpcd interface
起動時 (systemd)
wpa_supplicant パッケージには複数の systemd サービスファイルが入っています:
wpa_supplicant.service
- D-Bus を使用します、NetworkManager に推奨。wpa_supplicant@interface.service
- 引数としてインターフェイスの名前を指定することができ、そのインターフェイスで wpa_supplicant デーモンを起動します。/etc/wpa_supplicant/wpa_supplicant-interface.conf
の設定ファイルを読み込みます。wpa_supplicant-nl80211@interface.service
- 同じくインターフェイスを指定しますが、nl80211
ドライバーの使用を明示的に強制します (下記参照)。設定ファイルのパスは/etc/wpa_supplicant/wpa_supplicant-nl80211-interface.conf
。wpa_supplicant-wired@interface.service
- 同じくインターフェイスを指定しますが、wired
ドライバーを使用します。設定ファイルのパスは/etc/wpa_supplicant/wpa_supplicant-wired-interface.conf
。
起動時にワイヤレスを有効にするには、上記のサービスのどれかを特定の無線インターフェイスで有効にしてください、例えば:
# systemctl enable wpa_supplicant@interface
そのインターフェイスで dhcpcd も有効にします:
# systemctl enable dhcpcd@interface
802.1x/radius
802.1x/radius を使って有線アダプタを接続する場合、アダプタにあわせて設定を指定してサービスを有効化する必要があります。networkd を使用してヘッドレスサーバーを組む場合に有用です。
802.1x/radius の要件にあわせて以下のように設定してください (adapter
は接続したい有線アダプタに置き換えてください):
/etc/wpa_supplicant/wpa_supplicant-wired-adapter.conf
ctrl_interface=/var/run/wpa_supplicant ap_scan=0 network={ key_mgmt=IEEE8021X eap=PEAP identity="user_name" password="user_password" phase2="autheap=MSCHAPV2" }
上記のファイルでは平文でパスワードを保存しているため、root:root
に chown してから 600
に chmod してください。
wpa_supplicant-wired@adapter.service
サービスを起動する前に、デバイスを落としてください:
# ip link set adapter down
wpa_cli アクションスクリプト
wpa_cli はデーモンモードで起動することができ wpa_supplicant からのイベントによって指定のスクリプトを実行することができます。2つのイベントがサポートされています: CONNECTED
と DISCONNECTED
。スクリプトにはいくつかの環境変数を使うことができます、詳しくは wpa_cli(8) を見て下さい。
以下の例ではデスクトップ通知を使ってイベントをユーザーに通知します:
#!/bin/bash case "$2" in CONNECTED) notify-send "WPA supplicant: connection established"; ;; DISCONNECTED) notify-send "WPA supplicant: connection lost"; ;; esac
スクリプトを忘れずに実行可能にして、-a
フラグを使って wpa_cli にスクリプトのパスを渡して下さい:
$ wpa_cli -a /path/to/script
ローミング
複数のアクセスポイントが存在するワイヤレスネットワークに接続する際、通常、wpa_supplicant がアクセスポイント間のローミングを行います。新しいアクセスポイントを選択するには wpa_supplicant が利用可能なネットワークのスキャンを行う必要があり、無線機が他の周波数をスキャンする間、現在のアクセスポイントに対する接続が短時間切断されます。スキャン後、wpa_supplicant が現在のネットワーク (SSID) 内で (シグナル強度 (RSSI) の点で) より近いアクセスポイント (BSSID) を検出した場合、そのアクセスポイントに再びアソシエーションします。
wpa_supplicant のデフォルトの設定は比較的穏やかです: 現在のアクセスポイントとのアソシエーションが失われた時に限り、再スキャンを行います。これはつまり、クライアントが現在のアクセスポイントから遠く (ただしシグナルが完全には失われない程度に) 離れた場合に、クライアントは、より近いアクセスポイントにローミングすることなく、その弱いシグナルを使用し続けてしまうことを意味します。
wpa_supplicant に積極的にローミングさせるには、設定ファイルで bgscan
パラメータを例えば以下のように設定してください:
bgscan="simple:30:-70:3600"
上記の例では、シグナルが弱い (-70 未満) 時に 30 秒毎にスキャンを行い、シグナルが弱くない時には 3600 秒毎にスキャンを行います。bgscan
は、特定の network
ブロック、あるいは全ネットワークに対してグローバルに指定することができます。
トラブルシューティング
nl80211 ドライバーがサポートされていない
ハードウェアによっては (特に古いハードウェアの場合)、以下のエラーで wpa_supplicant が失敗することがあります:
Successfully initialized wpa_supplicant nl80211: Driver does not support authentication/association or connect commands wlan0: Failed to initialize driver interface
上記のエラーは標準の nl80211
ドライバーが指定のハードウェアをサポートしていないことを示しています。非推奨となっている wext
ドライバーならまだデバイスがサポートされている可能性があります:
# wpa_supplicant -B -i wlan0 -D wext -c /etc/wpa_supplicant/example.conf
上記のコマンドで接続できた場合、systemd を使って無線接続を管理したいときは、パッケージに含まれている wpa_supplicant@.service
ユニットを編集して ExecStart
行を修正してください:
/etc/systemd/system/wpa_supplicant@.service.d/wext.conf
[Service] ExecStart= ExecStart=/usr/bin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I -Dnl80211,wext
ネットワーク共有 (cifs) をマウントしたときにシャットダウン時に起こる問題
無線を使ってネットワーク共有に接続している場合、シャットダウンが異常に長くなるという問題が起こることがあります。systemd のタイムアウトが3分になっているのが原因です。WPA supplicant の終了が早すぎて、systemd が共有をアンマウントする前に接続が切れてしまいます。バグレポート において以下のように wpa_supplicant@.service
を編集することが提案されています:
/etc/systemd/system/wpa_supplicant.service.d/override.conf
[Unit] After=dbus.service
パスワードに関連する問題
特殊文字を含む長くて複雑なパスワードを標準入力から直接指定された場合 wpa_supplicant が正しく動作しないことがあります。例えば wpa_supplicant を起動したときに failed 4-way WPA handshake, PSK may be wrong
というエラーが表示されます。
上記の問題を解決するには、wpa_passphrase <MYSSID> <<< "<passphrase>"
という形でパスワードを指定するか、-c
フラグでファイルを指定してください:
# wpa_supplicant -i <interface> -c /etc/wpa_supplicant/example.conf
ときどき、wpa_supplicant.conf
の network
ブロックの psk
キーで平文のパスフレーズを保存するという方法で回避するように示唆されている場合があります ([2] を参照)。しかしながら、このような方法は安全ではありません。大抵の場合、手動でパスワードを書いてしまうよりも wpa_cli
を使ってファイルを作成する方がベストです。
eduroam などの MSCHAPv2 接続の問題
設定の中で大文字の "v" が使われていることを確認してください:
phase2="auth=MSCHAPV2"
MSCHAPV2 はデフォルトであるため、上記の設定は完全に削除しても問題ありません (FS#51358)。
純粋な WPA3-SAE アクセスポイントへの接続
純粋な WPA3アクセスポイント への接続を有効にするには、configのネットワークブロック内で以下を定義してください:
ssid="network SSID" key_mgmt=SAE sae_password="the.literal.wifi.password" ieee80211w=2
混合 WPA2-PSK/WPA3-SAE アクセスポイントへの接続
WPA2-PSK/WPA3-SAE が混在するアクセスポイントでは、以下のように、key_mgmt の代替設定が必要になります:
ssid="network SSID" key_mgmt=WPA-PSK-SHA256 psk=xxx ieee80211w=2
参照
- wpa_supplicant ホーム
- wpa_supplicant README - プロジェクトのドキュメント、man ページに記載されていない wpa_cli コマンドなど
- wpa_cli 使用例
- wpa_supplicant(8)
- wpa_supplicant.conf(5)
- wpa_cli(8)
- Kernel.org wpa_supplicant ドキュメント