Debian Wikiの「Q. Is anyone running this in production?」の答えに「wireless access points (hostapd)」という記事があります。そのため無線LANが使える方法を試しました。
linuxカーネルとFreeBSDカーネル、どちらでも無線LANアクセスポイントに接続するデーモンはwpa_supplicantを使います。しかし、使い方が若干違いますし、FreeBSD特有の部分やkfreebsd特有部分があります。
FreeBSDでは無線LANのファームウェアはkernel moduleとして提供される。(kfreebsdではstaticビルドされています)
kfreebsdではnon-freeで提供されているfirmware-hogeのパッケージが別途必要(これはDebian GNU/Linuxと同じ)
FreeBSDではifconfigで出てくる無線LANインタフェース名とwpa_supplicantで指定するインタフェース名は別
FreeBSDでは、wpa_supplicantで指定する無線LANインタフェースは論理インタフェースのほう
順に追って手順を示します。
まず、Debian GNU/kFreeBSDで利用するkernelは、2014-03-10以降にリリースされた10.0系以上を使ってください。unstableでは10.1系kernelが提供されているためほぼ大丈夫だと思います。(kernel module内でfirmwareファイルを読み取るパッチがマージされている。BTS(642468)情報はこちら。
次に対応する無線LANデバイスを使ってください。動作確認したのはThinkpad X220に搭載しているIntel Centrino dvanced-N 6205です。FreeBSDカーネルでifconfigするとiwn0でいうインタフェース名となります。無線LANデバイスに合わせたファームウェアファイル必要ですので、これもインストールします。
# apt-get install kfreebsd-image-10-amd64 # apt-get install firmware-iwlwifi →intelの無線LANを利用する場合。apt-lineを編集してnon-freeを有効にしてください。
FreeBSDでのお作法に従い、論理無線LANデバイスを作ります。このあたりがlinuxカーネルと異なるところです。
# ifconfig iwn0 (これが物理インタフェース名) iwn0: flags=8802 metric 0 mtu 2290 ether xx:xx:xx:xx:xx:xx media: IEEE 802.11 Wireless Ethernet autoselect (autoselect) status: no carrier nd6 options=23 # ifconfig wlan create wlandev iwn0 wlan0 # ifconfig wlan0 (これが無線LAN用の論理インタフェース名) wlan0: flags=8802 metric 0 mtu 1500 ether xx:xx:xx:xx:xx:xx inet6 fe80::xxxx:xxxx:xxxx:xxxx%wlan0 prefixlen 64 scopeid 0x6 ssid "" channel 5 (2432 MHz 11g) country US authmode WPA2/802.11i privacy OFF txpower 15 bmiss 10 scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme media: IEEE 802.11 Wireless Ethernet autoselect (autoselect) status: no carrier nd6 options=23
無線LANを制御するデーモンはwpa_supplicantコマンドのため、パッケージをインストールします。
# apt-get install wpasupplicant # which wpa_passphrase /usr/bin/wpa_passphrase # which wpa_supplicant /sbin/wpa_supplicant
次はwpa_supplicantで接続するアクセスポイント情報ファイルを作成します。これはwpa_passphraseコマンドを使います。(ここはlinuxで手動でやる場合と同様です)
$ wpa_passphrase apname1 appassword > wpa_apname1.conf $ cat wpa_apname1.conf network={ ssid="apname1" #psk="appassword" psk=e9fdcb43eba09b6342df30f14275625c8494e534799a82d6639b6124434ea627 }
wpa_supplicantコマンドを実行します。このとき、指定するインタフェースはwlan0のほうです。オプションの「-D bsd」はkfreebsdの場合はデフォルトになっているため未指定でもよいはずです。
# wpa_supplicant -i wlan0 -D bsd -c ./wpa_apname1.conf Successfully initialized wpa_supplicant ioctl[SIOCS80211, op=20, val=0, arg_len=7]: Invalid argument ioctl[SIOCS80211, op=20, val=0, arg_len=7]: Invalid argument wlan0: Trying to associate with yy:yy:yy:yy:tt:tt (SSID='apname1' freq=2432 MHz) wlan0: Associated with yy:yy:yy:yy:yy:yy wlan0: WPA: Key negotiation completed with yy:yy:yy:yy:yy:yy [PTK=CCMP GTK=CCMP] wlan0: CTRL-EVENT-CONNECTED - Connection to yy:yy:yy:yy:yy:yy completed [id=0 id_str=] wlan0: WPA: Group rekeying completed with yy:yy:yy:yy:yy:yy [GTK=CCMP]
# dhclient wlan0 # ifconfig iwn0 iwn0: flags=8843 metric 0 mtu 2290 ether xx:xx:xx:xx:xx:xx media: IEEE 802.11 Wireless Ethernet autoselect mode 11g status: associated nd6 options=23 # /sbin/ifconfig wlan0 wlan0: flags=8843 metric 0 mtu 1500 ether xx:xx:xx:xx:xx:xx inet6 fe80::xxxx:xxxx:xxxx:xxxx%wlan0 prefixlen 64 scopeid 0x6 inet 192.168.22.226 netmask 0xffffff00 broadcast 192.168.22.255 ssid pcdennokan channel 5 (2432 MHz 11g) bssid yy:yy:yy:yy:yy:yy country US authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 2:128-bit txpower 15 bmiss 10 scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme roaming MANUAL media: IEEE 802.11 Wireless Ethernet OFDM/48Mbps mode 11g status: associated nd6 options=23
補足ですが、試した時点ではどうも5GHz帯の無線LANはうまく接続できなかったり、802.11nでも40MHzを利用するモードだとwpa_supplicantでエラーになったりすることがあります。
そのため、接続するSSIDは2.4GHz帯で接続できるものを選択し、以下コマンドを実行して40MHz接続モードを無効するのがよさそうです。(このコマンドは、wpa_supplicantでアクセスポイントに接続する前に実行してください。)
# ifconfig wlan0 -ht40
kfreebsdで快適な無線LANライフをお楽しみください。