wpa_supplicantの存在
Wireless LAN製品の開発(使用)をする場合、サプリカント機能としてwpa_supplicantを使用することが多いと思います。
実際に、私が担当しているクアルコム社のWi-Fi製品でもwpa_supplicantをリファレンスとして使用しています。
「supplicant」の意味を検索すると「請願者・嘆願者」などと出てきます。文字通りwpa_supplicantは、”WPA認証の請願者”となります。つまり、client側からAP(アクセスポイント)に対して接続を請願するソフトウェアです。
wpa_supplicantを使用している環境の製品サポートをしていると、wpa_supplicantの設定により接続できないケースがたびたびあります。
そこで今回はwpa_supplicantの使い方を紹介していきます。
wpa_supplicantとは?
wpa_supplicantは、IEEE802.1X/WPA サプリカント機能を提供するフリーソフトウェアでありオープンソースソフトウェアです。
様々なOSやドライバーに対応しており、ユーザーインターフェースもCUI/GUIに対応しています。
以前までは、wpa_supplicantという名前のソフトウェアパッケージでしたが、現在はhostapとなっており、その中のwpa_supplicantモジュールとなっています。
※ AP機能としてhostapdというモジュールも存在します。
環境について
今回、使用する環境はUbuntu16.04+Kernel4.9.11+QCA9377(Qualcomm Wireless LAN製品)の組み合わせになります。
wpa_supplicantの使い方
wpa_supplicantは、内部にAPの情報を設定することでAPへ接続します。
接続の流れとしては、
1.wpa_supplicantの起動
2.ネットワークブロック(AP情報)の登録
3.Scanの実行
4.発見したAPへ接続
となります。
wpa_supplicantは、ユーザーインターフェース(CUI/GUI)で操作することが可能です。
あらかじめ、wpa_supplicant.confファイルにネットワークブロックを書いておくことで、wpa_supplicantを起動するだけで接続させることが可能ですが、ユーザーインターフェースを使用することで、ネットワークブロックを追加したり、接続/切断、接続先の切り替え、WPSでの接続など動的な処理も可能です。
wpa_supplicantの起動
まず、wpa_supplicantの設定ファイルを準備します。
今回は設定するパラメータを説明しながら進めます。
以下、最低限必要と思われる設定ファイル(wpa_supplicant.conf(名前は任意))の中身になります。
ctrl_interface=/var/run/wpa_supplicant <= ユーザーインターフェスのために使用するsocketの指定です。wpa_supplicant起動時の”C”オプションでも指定可能です。ない場合外部からのコントロールができません。
country=JP <= 設定されていない場合、意図しないカントリーコードの設定で動作してしまいます。
wpa_supplicant.conf作成後、ドライバーをロードし、インターフェース名を確認します。
ドライバーのロード前後のiwconfigの結果を確認すればインターフェース名がわかります。
以下の例ではwlan0とp2p0ができていますが、wlan0がclientモード用のインターフェース名になります。p2p0はP2Pモード用になります。
インターフェース名が確認できたのでwpa_supplicantを起動します。(要root権限)
wpa_supplicant -iwlan0 -Dnl80211 -c/home/root/wpa_supplicant.conf -ddd
’i’オプション:インターフェース名=>wlan0
’D’オプション:使用するドライバー=>nl80211(使用する無線LANデバイスにより変わります)
’c’オプション:設定ファイルのパス=>/home/root/wpa_supplicant.conf
'd'オプション:ログレベルを変更します。デフォルトが”MSG_INFO”で'd'の数だけ数値が減ります。”-ddd”で”MSG_EXESSIVE”になります。
MSG_EXCESSIVE < MSG_MSGDUMP < MSG_DEBUG < MSG_INFO < MSG_WARNING < MSG_ERROR
”Successfully initialized wpa_supplicant”が表示されれば起動成功です。
test@test-ThinkPad-T430:~# iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
test@test-ThinkPad-T430:~# insmod wlan.ko
test@test-ThinkPad-T430:~# iwconfig
p2p0 Qcom:802.11n ESSID:off/any Nickname:""
Channel:0 Access Point: Not-Associated Bit Rate:0 kb/s
Tx-Power=off
RTS thr:off Fragment thr:off
Encryption key:off
lo no wireless extensions.
eth0 no wireless extensions.
wlan0 Qcom:802.11n ESSID:off/any Nickname:""
Channel:0 Access Point: Not-Associated Bit Rate:0 kb/s
Tx-Power=off
RTS thr:off Fragment thr:off
Encryption key:off
test@test-ThinkPad-T430:~# wpa_supplicant -iwlan0 -Dnl80211 -c ~/wpa_supplicant.conf &
test@test-ThinkPad-T430:~# Successfully initialized wpa_supplicant
さて、起動はしてみましたが設定ファイルの中は、ctrl_interfaceとcountry以外記載がありません。
これでは、wpa_supplicantは起動しているだけの状態です。
ここからいろいろ触っていきましょう。
wpa_cliの起動
まずは、CUIをインタラクティブモードで起動していきます。(要root権限)
wpa_cli -iwlan0 -p/ver/run/wpa_supplicant
’i’オプション:インターフェース名=>wlan0
’p’オプション:コントロールインターフェースのパス=>/var/run/wpa_supplicant(wpa_supplicant.confに記載のctrl_interfaceの設定値)
test@test-ThinkPad-T430:~# wpa_cli -iwlan0 -p/var/run/wpa_supplicant
wpa_cli v2.10-devel-hostap_2_9-2307-g7b65003+
Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi> and contributors
This software may be distributed under the terms of the BSD license.
See README for more details.
Interactive mode
>
スキャンの実行
スキャンを実行しスキャン結果(見つかったAPのリスト)を表示します。
scan:Scanを実行します。
scan_results:Scan結果を表示します。
> scan
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-NETWORK-NOT-FOUND
> scan_results
bssid / frequency / signal level / flags / ssid
11:22:33:44:55:66 5180 -39 [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] test
ネットワークブロックの作成
スキャン結果とAPの設定情報をもとにネットワークブロックを作成します。
add_network:空のネットワークブロックを作成します。
set_network <network ID> <parameter> <value>:ネットワークブロックにパラメーターを設定します。
parameter:
ssid:APのssidをダブルコート””で囲んで入力します。
psk:APのパスフレーズをダブルコート””で囲んで入力します。
key_mgmt:キーマネージメント対応を入力します。(NONE(オープン)/WPA-PSK/SAEなど)
list_networks:登録しているネットワークブロックを表示します。
save_config:登録したネットワークブロックをwpa_supplicant.confに保存します。セーブしなかった場合、wpa_supplicant終了時に追加したネットワークブロックが消えます。
> add_network
0
<3>CTRL-EVENT-NETWORK-ADDED 0 <= 作成したネットワークブロックにID=0が付与されました。以降このIDでネットワークブロックにアクセスします。
> set_network 0 ssid "test" <= ID=0のネットワークブロック対して、ssidを”test”に設定します。
OK
> set_network 0 psk "12345678" <= ID=0のネットワークブロック対して、pskを”12345678”に設定します。
OK
> set_network 0 key_mgmt WPA-PSK <= ID=0のネットワークブロック対して、key_mgmtをWPA-PSKに設定します。スキャン結果の[WPA-PSK-CCMP][WPA2-PSK-CCMP]よりWPA/WPA2対応APなのでWPA-PSKを設定します。protoでWPA(RSN)を指定するとWPA(RSN)で接続します。設定しない場合RSNを優先して設定します。
OK
>save_config
wpa_supplicant.confにネットワークブロックを記載する場合は、以下のように記載します。
上記コマンドで作成したネットワークブロックです。
network={
ssid="test"
psk="12345678"
key_mgmt=WPA-PSK
}
ちなみに、上記設定にないパラメータはデフォルト値もしくはサポートされているよりセキュアなものが使用されます。
例:
proto:RSN(WPA2) > WPA
pairwise chipher:CCMP > TKIP
group chipher:CCMP > TKIP
接続
作成したネットワークブロックで接続します。
ネットワークブロックの状態としては、有効(何もなし)/一時的に無効([TEMP-DISABLED])/無効([DISABLED])/選択状態(CURRENT)のどれかになります。
それぞれの状態:
有効(何もなし):[CURRENT]のネットワークが接続できない状態(電波を受信できない状態)になったときの接続対象
一時的に無効([TEMP-DISABLED]):パスワード間違いなどで接続に失敗しRetry中の状態
無効([DISABLED]):非接続対象
選択状態(CURRENT):接続対象
ネットワークブロックを作成しただけでは、「DISABLED」の状態ですので有効にし、必要であれば選択します。
”enable_network <ID>”:ネットワークブロックを有効にします。
”select_network <ID>”:ネットワークブロックを選択します。
未接続の場合
> list_networks <= ネットワークブロックの一覧を表示します。
network id / ssid / bssid / flags
0 test1 any [DISABLED]
> enable_network 0 <= 作成したネットワークブロックを有効にします。
====== 接続処理 =====
> list_networks
network id / ssid / bssid / flags
0 test1 any [CURRENT] <= 有効になった後接続処理が実行され選択状態になります。
既に他のAPへ接続積みの場合:
> list_networks
network id / ssid / bssid / flags
0 test1 any [DISABLED]
1 test2 any [CURRENT]
> enable_network 0
> list_networks
network id / ssid / bssid / flags
0 test1 any
1 test2 any [CURRENT] <= ID'0'は有効になるが接続先は変わらず
> select_network 0 <= 選択先を'0'に変更します。
====== 接続処理 =====
> list_networks
network id / ssid / bssid / flags
0 test1 any [CURRENT] <= '0'が選択先になります。
1 test2 any [DISABLED]
切断/再接続
切断し再度接続する場合は、以下のコマンドを実行します。
disconnect:接続中のAPから切断します。ネットワークブロックは削除されません。
reconnect:有効状態のネットワークに再接続します。
> list_networks
network id / ssid / bssid / flags
0 test1 any [DISABLED]
1 test2 any [CURRENT]
> disconnect
<3>CTRL-EVENT-DISCONNECTED bssid=98:de:d0:af:9f:1d reason=3 locally_generated=1
> list_networks
network id / ssid / bssid / flags
0 test1 any [DISABLED]
1 test2 any
> reconnect
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
> wlan0: Trying to associate with SSID 'test2'
<3>Trying to associate with SSID 'test2'
> wlan0: Associated with 98:de:d0:af:9f:1d
<3>Associated with 98:de:d0:af:9f:1d
> wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
> wlan0: WPA: Key negotiation completed with 98:de:d0:af:9f:1d [PTK=CCMP GTK=CCMP]
wlan0: CTRL-EVENT-CONNECTED - Connection to 98:de:d0:af:9f:1d completed [id=1 id_str=]
<3>WPA: Key negotiation completed with 98:de:d0:af:9f:1d [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to 98:de:d0:af:9f:1d completed [id=1 id_str=]
> list_networks
network id / ssid / bssid / flags
0 test1 any [DISABLED]
1 test2 any [CURRENT]
>
ネットワークブロックの削除
ネットワークブロックを削除する場合は、以下のコマンドを実行します。
remove_network <ID>
切断後ネットワークブロックを削除します。
> list_networks
network id / ssid / bssid / flags
0 test1 any [DISABLED]
1 test2 any [CURRENT]
> remove_network 1
<3>CTRL-EVENT-NETWORK-REMOVED 1
<3>CTRL-EVENT-DISCONNECTED bssid=98:de:d0:af:9f:1d reason=3 locally_generated=1
> list_networks
network id / ssid / bssid / flags
0 test1 any [DISABLED]
> save_config <= wpa_supplicantconfを更新します。
WPSでの接続
ネットワークブロックを作成しなくともWPSで接続することも可能です。
ここでは、APでよく使用されるpush buttonについて記載します。
wps_pbc:push buttonを使用してANY接続します。
wps_pbc <bssid>:push buttonを使用して<bssid>のAPへ接続します。
wps_cancel:実行中のWPSの処理をキャンセルします。
> wps_pbc
wlan0: WPS-PBC-ACTIVE
OK
<3>CTRL-EVENT-NETWORK-ADDED 1
<3>WPS-PBC-ACTIVE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
> wlan0: Trying to associate with 98:de:d0:af:9f:1d (SSID='TP-LINK_9F1D_5G' freq=5200 MHz)
<3>Trying to associate with 98:de:d0:af:9f:1d (SSID='TP-LINK_9F1D_5G' freq=5200 MHz)
> wlan0: Associated with 98:de:d0:af:9f:1d
wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>Associated with 98:de:d0:af:9f:1d
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
> wlan0: CTRL-EVENT-EAP-STARTED EAP authentication started
<3>CTRL-EVENT-EAP-STARTED EAP authentication started
<3>CTRL-EVENT-EAP-STATUS status='started' parameter=''
> wlan0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=1
wlan0: CTRL-EVENT-EAP-METHOD EAP vendor 14122 method 1 (WSC) selected
<3>CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=1
<3>CTRL-EVENT-EAP-STATUS status='accept proposed method' parameter='WSC'
<3>CTRL-EVENT-EAP-METHOD EAP vendor 14122 method 1 (WSC) selected
> wlan0: WPS-CRED-RECEIVED
<3>WPS-CRED-RECEIVED
> wlan0: WPS-SUCCESS
<3>WPS-SUCCESS
> wlan0: CTRL-EVENT-DISCONNECTED bssid=98:de:d0:af:9f:1d reason=8
<3>CTRL-EVENT-DISCONNECTED bssid=98:de:d0:af:9f:1d reason=8
> wlan0: CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
<3>CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
> wlan0: CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=JP
<3>CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=JP
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-NETWORK-NOT-FOUND
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
> wlan0: Trying to associate with SSID 'TP-LINK_9F1D_5G'
<3>Trying to associate with SSID 'TP-LINK_9F1D_5G'
> wlan0: Associated with 98:de:d0:af:9f:1d
wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>Associated with 98:de:d0:af:9f:1d
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
> wlan0: WPA: Key negotiation compl[ 177.273055] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
eted with 98:de:d0:af:9f:1d [PTK=CCMP GTK=TKIP]
wlan0: CTRL-EVENT-CONNECTED - Connection to 98:de:d0:af:9f:1d completed [id=1 id_str=]
<3>WPA: Key negotiation completed with 98:de:d0:af:9f:1d [PTK=CCMP GTK=TKIP]
<3>CTRL-EVENT-CONNECTED - Connection to 98:de:d0:af:9f:1d completed [id=1 id_str=]
>
まとめ
今回はwpa_supplicantの基本的な使い方を説明してきました。
次回はhostapdの基本的な使い方について説明しようと思います。
クアルコム社のWi-Fi製品は、リファレンスとしてLinux+wpa_supplicant/hostapdに対応しております。製品へのご興味もございましたら、下記よりお問い合わせをお願い致します。
お問い合わせ
Qualcomm製品に関するご質問等がございましたら、以下リンクよりお問い合わせください。
Qualcomm メーカー情報Topへ
Qualcomm メーカー情報Topページへ戻りたい方は、以下をクリックしてください。