【FreeBSD】無線LAN(Wi-Fi)に接続したい

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.0-RELEASE-p3

課題

無線LAN(Wi-Fi)に接続したい。

対策

ここでは、手動で接続する方法と、パソコン起動時に自動で接続する方法それぞれ説明する。
詳細はいいからパソコン起動時に自動接続する方法を知りたい人は、こちらの記事を見て下さいまし。

ここで説明する手順は下記となる。

  1. パソコンの無線LANバイスを確認 ... sysctl net.wlan.devices
  2. ネットワークI/Fを作成 ... ifconfig wlan0 create wlandev WDEV country JP
  3. ネットワークI/Fを起動 ... ifconfig wlan0 up
  4. WPA認証用の設定ファイルを作成 ... wpa_passphrase SSID PASS > wpa_supplicant.conf
  5. アクセスポイントに接続 ... wpa_supplicant -B -i wlan0 -c wpa_supplicant.conf
  6. IPアドレスを割り当てる ... dhclient wlan0
  7. パソコン起動時に自動で無線LAN接続 ... /etc/rc.conf, /etc/wpa_supplicant.conf

以降は、root権限で実行することを前提に説明する。

アクセスポイント側の設定は、予め管理者や無線LANルータの説明書を読んで確認しておいてね。

もし、意味不明な用語があれば、こちらも覗いてみてねと。

1. パソコンの無線LANバイスを確認

まずは、あなたのパソコンで使える無線LANバイスを確認しよう。
下記コマンドを使えばいい。

> sysctl net.wlan.devices  
net.wlan.devices: iwm0  

上記結果から、iwm0という無線LANバイスが使えること分かる。
この結果は環境によって異なる為、各自、自分の環境のデバイス名をメモしておこう。

ちなみに、既に無線ネットワークI/Fが作成されていて、そのI/Fで使用している無線LANバイスを知りたい場合は、下記コマンドで確認できる。
(wlan0というネットワークI/Fで使用しているデバイスを確認する例)

> sysctl net.wlan.0.%parent  
net.wlan.0.%parent: iwm0  

2. ネットワークI/Fを作成

次に、無線LANバイスを使うためのネットワークI/Fを作成する。
下記コマンドで作成できる。
iwn0は各自、手順1で確認した無線LANバイス名に置き換えること。

> ifconfig wlan0 create wlandev iwn0 country JP  

上記コマンドではiwm0という名前の無線LANバイスに対して、wlan0という名前のネットワークI/Fを作成している。
country JPは日本で無線LANを使う場合に必要な指定。
無線というのは用途によって使える周波数帯が国で定められている。
国を指定することで、無線LANバイスの周波数などをその国で適切な値に設定してくれる。
周波数などの情報は、/etc/regdomain.xmlを使っているらしい。

それでは、作成したネットワークI/Fをifconfigコマンドで確認してみよう。

> ifconfig wlan0  
wlan0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500  
        ether zz:zz:zz:zz:zz:zz  
        groups: wlan  
        ssid "" channel 1 (2412 MHz 11b)  
        regdomain JAPAN country JP authmode OPEN privacy OFF txpower 23  
        bmiss 10 scanvalid 60 wme bintval 0  
        media: IEEE 802.11 Wireless Ethernet autoselect (autoselect)  
        status: no carrier  
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>  

上記のように作成したネットワークI/Fが表示されれば問題ない。
まだアクセスポイントに接続していないのでssidなどは空の状態だ。
当然、IPアドレスも割り当てられていない。

3. ネットワークI/Fを起動

次に、作成したネットワークI/Fを下記コマンドで起動する。

> ifconfig wlan0 up  

正常に起動して無線LANバイスが使える状態になれば、下記コマンドで無線LANのアクセスポイントを検出できるはずだ。

> ifconfig wlan0 scan  
SSID/MESH ID     BSSID              CHAN RATE    S:N     INT CAPS  
XXX-A            xx:xx:xx:xx:xx:xx    6   54M  -58:-96   100 EPS  HTCAP WME ATH RSN WPA WPS  
XXX-B            yy:yy:yy:yy:yy:yy   36   54M  -77:-96   100 EP   HTCAP VHTCAP VHTOPMODE VHTPWRENV WME ATH RSN WPA WPS  

左端の列がSSIDになっている。
上記結果ではXXX-AXXX-BというSSIDのアクセスポイントを検出できている。

このとき、使用するアクセスポイントのSSIDが表示されているか確認しておこう。
アクセスポイントのSSIDは市販の無線LANルータの場合、ルータ本体に載っていたりする。
詳細は各自ルータの説明書などを読んで確認してほしい。

もし、使用するアクセスポイントのSSIDが表示されていない場合は、無線の届く範囲外かもしれない。
無線LANルータの近くにパソコンを持って行き、もう一度scanを実行してみよう。
それで表示される場合、無線LANルータを置く場所を調整するか、以下のような無線LAN中継機の導入を検討してはいかがだろうか。

TP-Link WIFI 無線LAN 中継器 11ac/n/a/g/b 433+300Mbps 11ac対応 3年保証 RE200

TP-Link WIFI 無線LAN 中継器 11ac/n/a/g/b 433+300Mbps 11ac対応 3年保証 RE200

もし、無線LANルータの近くでも表示されない場合は、下記サイトなどを参考に原因特定されたし。

4. WPA認証用の設定ファイルを作成

次に、アクセスポイントへ認証するための設定ファイルを作成する。
設定ファイルは下記コマンドで作成できる。
XXX-Bhogehogeは、各環境のSSIDと暗号キーに置き換えて実行すること。

> wpa_passphrase XXX-B hogehoge > wpa_supplicant.conf  

作成したファイルは下記のような最低限の設定が記載されている。
#psk="hogehoge"の暗号化前の暗号キーの行は削除してしまって良い。
(暗号化してない#psk="hogehoge"の行を有効にしても動くよ)

network={  
        ssid="XXX-B"  
        #psk="hogehoge"  
        psk=d816ead32ddafcd0d27c9be016ce53b056db3c9f5c21e95b802c72e0550e69ea  
}  

上記設定の場合、認証方式:WPA2-PSK、暗号化方式:AES(CCMP)がデフォルト動作となる。
実際はルータが許可している認証方式などによって変わるはず。

このファイルの設定項目は他にも色々ある。
僕が使うかもなぁという項目を下記に抜粋。
network={}ブロック内の設定値はいずれもデフォルト値を掲載している。

ctrl_interface=/var/run/wpa_supplicant  #他プログラムから制御させるためのソケット作成ディレクトリ  
ctrl_interface_group=wheel   # root以外のユーザがネットワークI/Fファイルにアクセスする場合に必要  
network={  
        ssid="XXX-B"  
        psk=d816ead32ddafcd0d27c9be016ce53b056db3c9f5c21e95b802c72e0550e69ea  
        key_mgmt=WPA-PSK WPA-EAP       # 認証方式。他に IEEE802X, NONE が指定可能  
        pairwise=CCMP TKIP             # 暗号化方式。他に NONE が指定可能(非推奨)  
        group=CCMP TKIP WEP104 WEP40   # 許可する暗号化方式  
        scan_ssid=0     # SSIDを公開しないアクセスポイントをスキャンする場合は 1  
        priority=0      # 接続するアクセスポイントの優先度。値が大きい方が優先度が高い  
        proto=WPA RSN   # 受付可能プロトコル (RSNはWPA2の別名らしい)  
        mode=0          # インストラクチャ:0 アドホック:1  
}  

network={}ブロックは使用するアクセスポイントごとに追加して良さげ。
同時に複数のアクセスポイントを検出している場合、priorityの設定値が高いアクセスポイントから優先的に接続してくれるようだ。

詳細はman wpa_supplicant.confで確認してねと。

5. アクセスポイントに接続

次に、手順4で作成した設定ファイルを使って無線LANアクセスポイントに接続する。
下記コマンドを実行すればいい。

> wpa_supplicant -B -i wlan0 -c wpa_supplicant.conf  
Successfully initialized wpa_supplicant  

-Bはバックグラウンド(デーモン)で動作させる指定。
-iでは手順3で作成したネットワークI/Fを指定。
-cでは手順4で作成した設定ファイルを指定。

上記のように初期化成功のメッセージが出たら、接続状態をifconfigコマンドで確認してみよう。

> ifconfig wlan0  
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500  
        ether zz:zz:zz:zz:zz:zz  
        groups: wlan  
        ssid XXX-B channel 36 (5180 MHz 11a) bssid mm:mm:mm:mm:mm:mm  
        regdomain JAPAN country JP authmode WPA2/802.11i privacy ON  
        deftxkey UNDEF AES-CCM 3:128-bit txpower 23 bmiss 10 mcastrate 6  
        mgmtrate 6 scanvalid 60 wme roaming MANUAL  
        media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11a  
        status: associated  
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>  

上記の結果から、下記となっているようだ。

  • アクセスポイント ... XXX-B
  • 無線LAN規格 ... IEEE 802.11a
  • 認証方式 ... WPA2-PSK
  • 暗号化方式 ... AES(CCMP)

これでアクセスポイントに認証して接続はできたが、まだIPアドレスは割り当てられていない。

6. IPアドレスを割り当てる(DHCP)

あとは、IPアドレスを割り当てればネットワークに接続完了だ。
ここでは下記コマンドを使ってDHCPで割り当ててもらう。

> dhclient wlan0  
DHCPREQUEST on wlan0 to 255.255.255.255 port YY  
DHCPACK from 192.XXX.XXX.1  
bound to 192.XXX.XXX.XXX -- renewal in 43200 seconds.  

ifconfigコマンドで確認しても、無事にIPアドレスが割り当てられている。

> ifconfig wlan0  
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500  
        ether zz:zz:zz:zz:zz:zz  
        inet 192.XXX.XXX.XXX netmask 0xffffff00 broadcast 192.XXX.XXX.255  
        groups: wlan  
        ssid XXX-B channel 36 (5180 MHz 11a) bssid mm:mm:mm:mm:mm:mm  
        regdomain JAPAN country JP authmode WPA2/802.11i privacy ON  
        deftxkey UNDEF AES-CCM 3:128-bit txpower 23 bmiss 10 mcastrate 6  
        mgmtrate 6 scanvalid 60 wme roaming MANUAL  
        media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11a  
        status: associated  
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>  

念のため、pingコマンドでインターネットに接続できているか確認しよう。

> ping www.google.co.jp  
PING www.google.co.jp (xxx.xxx.xxx.xxx): 56 data bytes  
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=56 time=14.634 ms  
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=56 time=13.955 ms  
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=56 time=14.027 ms  
^C   # Ctrl+Cを押す  

もし、pingの応答がない場合、www.google.co.jpIPアドレス直打ちにして試してみよう。
それでつながるようならDNSの設定が怪しいと思うので調べてみてねと。

7. パソコン起動時に自動で無線LAN接続

最後に、パソコン起動時に自動で無線LAN接続するように設定する。

7-1. アクセスポイント認証設定

まず、手順4で作成したファイルを/etc/wpa_supplicant.confに移動する。
また、このファイルにはアクセスポイントの暗号キーも記載されている為、誰でも覗けないようにアクセス権限を変えておこう。

> mv wpa_supplicant.conf /etc/wpa_supplicant.conf  
> chown root:wheel /etc/wpa_supplicant.conf  
> chmod 640 /etc/wpa_supplicant.conf           # rootのみアクセス可能にするなら 600  

7-2. パソコン起動時のネットワーク設定

次に、/etc/rc.conf無線LANの設定を追加する。

下記内容を追記しよう。
wlans_iwm0=iwm0の部分は、各自手順1で確認した無線LANバイス名に置き換えること。

wlans_iwm0="wlan0"  
ifconfig_wlan0="WPA DHCP"  
create_args_wlan0="country JP regdomain ETSI"  

7-3. 接続確認

設定が終わったら、ネットワークに接続できるか確認しよう。
下記コマンドでネットワークサービスを再起動後、pingで接続確認だ。

> service netif restart  
> ifconfig wlan0  
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500  
        ether zz:zz:zz:zz:zz:zz  
        inet 192.XXX.XXX.XXX netmask 0xffffff00 broadcast 192.XXX.XXX.255  
        groups: wlan  
        ssid XXX-B channel 36 (5180 MHz 11a) bssid mm:mm:mm:mm:mm:mm  
        regdomain ETSI country JP authmode WPA2/802.11i privacy ON  
        deftxkey UNDEF AES-CCM 3:128-bit txpower 17 bmiss 10 mcastrate 6  
        mgmtrate 6 scanvalid 60 wme roaming MANUAL  
        media: IEEE 802.11 Wireless Ethernet OFDM/48Mbps mode 11a  
        status: associated  
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>  
> ping www.google.co.jp  
PING www.google.co.jp (xxx.xxx.xxx.xxx): 56 data bytes  
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=56 time=21.146 ms  
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=56 time=22.027 ms  
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=56 time=21.726 ms  
^C   # Ctrl+Cを押す  

これであなたも幸せ無線LAN生活を始めることができる。

参考

以上。