FreeBSDの無線LANクライアントを設定する

FreeBSDを無線LANクライアントとして設定する場合、有線と異なり一発で設定OKという訳に行かず、いろいろと設定ファイルを準備する必要がある。
FreeBSD Handbookを読みながら進めば問題ないが、備忘のために残す。

要件

無線LANクライアントとして使うということはDHCPでIPアドレスを取得するので、その前提で。

FreeBSD Handbook

ここ。
以下、Handbookに沿って進める。

無線LANインタフェースの特定

sysctlで特定。
ご覧の通りiwm0である。
良かった。ここで出てこないと自分でカーネルモジュールをインストールする必要がある。

$ sysctl net.wlan.devices
net.wlan.devices: iwm0

kldstatを実行すれば、確かにif_iwm.koが読み込まれている。

$ kldstat
Id Refs Address                Size Name
 1   69 0xffffffff80200000  1f11f28 kernel
 2    1 0xffffffff82112000   67feb0 zfs.ko
 3    1 0xffffffff82792000     ae38 cryptodev.ko
 4    1 0xffffffff830f9000     3378 acpi_wmi.ko
 5    1 0xffffffff830fd000     3250 ichsmb.ko
 6    1 0xffffffff83101000     2180 smbus.ko
 7    1 0xffffffff83104000    17310 if_iwm.ko
 8    1 0xffffffff8311c000     2110 pchtherm.ko
 9    1 0xffffffff8311f000   1bc6e8 iwm8265fw.ko
10    1 0xffffffff832dc000   158458 i915kms.ko
11    1 0xffffffff83435000    7f548 drm.ko
12    2 0xffffffff834b5000     cbc8 linuxkpi_gplv2.ko
13    2 0xffffffff834c2000     2328 lindebugfs.ko
14    1 0xffffffff834c5000     2340 uhid.ko
15    1 0xffffffff834c8000     4350 ums.ko
16    1 0xffffffff834cd000     3380 usbhid.ko
17    1 0xffffffff834d1000     31f8 hidbus.ko

無線LANインタフェースの有効化

インタフェース事前確認

次に無線LANインタフェースを有効化する。
OSに認識はされているが、有効にはなっていないから。
実際にifconfigすればわかる。
以下の通り無線LANインタフェースが見えていない。

$ ifconfig
em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP>
        ether
        inet 10.0.0.11 netmask 0xffffff00 broadcast 10.0.0.255
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>

無線LANインタフェースの設定(基礎)

有効化には/etc/rc.confを変更する。
以下の通り記述する。

# Wireless LAN
wlans_iwm0="wlan0"  # 扱いやすいようwlan0と名前をつける
ifconfig_wlan0="WPA SYNCDHCP"  # WPAで暗号化。SYNCDHCPは後述
create_args_wlan0="country JP regdomain ETSI"  # 国の設定。後述

SYNCDHCPを設定すると、起動時にIPアドレス取得が完了するまで待つ。
DHCPだけだと待たない。

国の設定は/etc/regdomain.xmlから読み取る。
Handbookに沿って上記の通り設定しておけばOK。
そうしたらいったん再起動。

起動時にwpa_supplicant.confが無いと怒られ、DHCPでIPアドレスが取得できないと怒られるが無視。

無線LANインタフェースの確認(基礎)

あらためてifconfigする。
確かにwlan0が表示されていますね(不要なインタフェースは省略)。

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

とりあえずiwm0改めwlan0をupさせてみる。
wlan0のステータスにUPが追加されていることに注目。

$ sudo ifconfig wlan0 up
$ ifconfig wlan0
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether xxxxxx
        groups: wlan
        ssid "" channel 1 (2412 MHz 11g)
        regdomain ETSI country JP authmode OPEN privacy OFF txpower 30
        bmiss 10 scanvalid 60 protmode CTS wme bintval 0
        parent interface: iwm0
        media: IEEE 802.11 Wireless Ethernet autoselect (autoselect)
        status: no carrier
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

続いてscanすると見えている無線LANが表示される。
もしここで狙いのAPが見えないのなら、それは隠しAPだと言うこと。後述。

$ sudo ifconfig wlan0 scan
SSID/MESH ID                      BSSID              CHAN RATE    S:N     INT CAPS
xxxxxx                        0x:xx:xx:xx:xx:xx    1   54M  -69:-96   102 EPS  BSSLOAD HTCAP RSN WME
(略)

ここまで来て初めて無線LANアクセスポイント接続の設定をする。

wpa_supplicant.confの設定(基礎)

無線LAN設定のキモである/etc/wpa_supplicant.confの設定に取り掛かる。
exampleは/usr/share/examples/etc/wpa_supplicant.confにある。
これを/etc下にコピーして修正する。
のだが、このファイルはとんでもなく巨大である。
そのままではさすがに全体像を掴めないので、# EAP fast re-authenticationセクションまでを残し、それより下は削除する。

後述するが、このファイルには無線LANアクセスポイントのパスワードを記載する。
所有はroot、パーミッションは400にしておくこと。

まず冒頭までで以下のようにする。

ctrl_interface=/var/run/wpa_supplicant # デフォルト
eapol_version=2  # 1でよい。2にして動くなら2で。
ap_scan=1  # FreeBSDにおいては1だけ。
fast_reauth=1  # デフォルト

wpa_supplicant.confの設定(本番)

パスワードの難読化

で、問題はここから先である。
SSIDとパスワードを平分で記述するである。
これはさすがに気持ち悪い。
そこで/usr/sbin/wpa_passphraseを使う。
このツールは、SSIDとパスワード(パスフレーズ)から256bitのpskを生成してくれるものである。
要するに難読化っぽいことをするわけ。
manすればわかるとおり、wpa_passphrase SSID パスワードと続けて引数を与えればよい。
便利なのは、そのままwpa_supplicant.confに貼り付けられる書式で出力してくれる点である。
以下は実施例。

$ wpa_passphrase SSIDexample SSIDpassword
network={
      ssid="SSIDexample"
      #psk="SSIDpassword"
      psk=6d7b3e5128969e9dd66ffa26d8ba503ff4b43f021f114a5f5bc9dadb8488ee1f
}

wpa_supplicant.confへの書き込み

そうしたら、パスワードが平分で記載されている行を削除したうえで、wpa_supplicant.confに貼り付ければよい。
ただし注意点があり、APがステルスの場合にはscan_ssid=1を追加しておくこと。
要するにさっきscanした結果、狙いのAPが表示されていなければ、それは隠しAPということ。

以下の通り。

ctrl_interface=/var/run/wpa_supplicant # デフォルト
eapol_version=2  # 1でよい。2にして動くなら2で。
ap_scan=1  # FreeBSDにおいては1だけ。
fast_reauth=1  # デフォルト
network={
      scan_ssid=1
      ssid="SSIDexample"
      psk=6d7b3e5128969e9dd66ffa26d8ba503ff4b43f021f114a5f5bc9dadb8488ee1f
}

DHCP clientとしての設定

さて。
本気はDHCPクライアントとして動作させる。
そのためには、デフォルトルータについてもDHCPで払い出してもらう必要がある。
それには/etc/dhclient.confに以下の記載をしておく必要がある。

# $FreeBSD$
#
#       This file is required by the ISC DHCP client.
#       See ``man 5 dhclient.conf'' for details.
#
#       In most cases an empty file is sufficient for most people as the
#       defaults are usually fine.
#
interface "wlan0" {
        request routers;
}

これをしておくとデフォルトルートを設定してくれる。
※以下は後述の無線LANを起動したあとの話。

$ netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags     Netif Expire
default            192.168.10.1       UGS       wlan0
127.0.0.1          link#2             UH          lo0
192.168.10.0/24    link#3             U         wlan0
192.168.10.3       link#3             UHS         lo0

また、resolv.confについても同様。
※以下は後述の無線LANを起動したあとの話。

# Generated by resolvconf
nameserver 192.168.10.1

無線LANインタフェースの起動

service netif restartとすればよい。

$ sudo service netif restart
Created wlan(4) interfaces: wlan0.
Starting wpa_supplicant.
Starting dhclient.
wlan0: no link ..... got link
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPNAK from 192.168.10.1
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 4
DHCPOFFER from 192.168.10.1
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPACK from 192.168.10.1
bound to 192.168.10.3 -- renewal in 43200 seconds.
Starting Network: lo0 em0 wlan0.
(略)
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether xxxxxx
        inet 192.168.10.3 netmask 0xffffff00 broadcast 192.168.10.255
        groups: wlan
        ssid xxxxxx channel 4 (2427 MHz 11g) bssid xxxxxx
        regdomain ETSI country JP authmode WPA2/802.11i privacy ON
        deftxkey UNDEF AES-CCM 3:128-bit txpower 30 bmiss 10 scanvalid 60
        protmode CTS wme roaming MANUAL
        parent interface: iwm0
        media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11g
        status: associated
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

以上