SVX日記
2016-08-28(Sun) ラズベリーパイ(pidora)で無線LANアクセスポイントする
先日「無線LANアクセスポイント自体をラズベリーパイで構築するのもいいかもしれん」などと書いたが、やってみることにした。
市販の無線LANルータをアクセスポイントモードに設定し、無線ブリッジとして振舞わせたいのだが、どーにも安定しないのだ。有線側からのブロードキャストが無線側に飛ばない。arpが飛ばなければ、接続できない。改めて購入したローエンドな無線LANルータも、結局はダメな感じだ。そりゃ、フツーの人は無線側の端末からWANと通信できるだけで十分なのかもしれないが、わしゃ宅内のホスト同士の通信が必須なんだ。
さて「ラズベリーパイ アクセスポイント」でググると大量のサイトが引っかかるのだが、どれもhostapdを使うことは共通しているものの、イマイチ内容がバラバラ。手順は書いてあるものの、その必要性がよくわからない。結局はhostapdに添付のドキュメントを読みつつ、試行錯誤が必要になった。
今回、構成したい無線LANアクセスポイントは、いわゆるルータモードではなく、ブリッジモードで動作させたいので、まずはブリッジインタフェイスを作る。前回と違うのは固定IPアドレスを割り振るところだ(別にDHCPでは絶対ダメということはないが)。
[root@xxxpi ~]# nmcli connection add type bridge ifname br0 stp no
[root@xxxpi network-scripts]# diff -bc x.ifcfg-bridge-br0.org ifcfg-bridge-br0
DEVICE=br0
STP=no
TYPE=Bridge
! BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
--- 1,10 ----
DEVICE=br0
STP=no
TYPE=Bridge
! BOOTPROTO=none
! IPADDR=172.xx.xx.xx
! NETMASK=255.255.255.0
! GATEWAY=172.xx.xx.xx
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
さて、ここから無線LANアクセスポイント化を開始する。上述したように、ラズベリーパイを無線LANアクセスポイント化する記事は多くあるのだが、よくわからないまま手順だけ書いてある記事が多いので混乱させられる。使用する無線LANアダプタなどに応じてアレンジを加える必要があるのだ。
今回、使用した無線LANアダプタは、IO DATAのWN-G300UAなのだが、重要なのは製品名よりも搭載している無線LANチップの種類だ。この製品はRealtekの8192CUという無線LANチップを搭載しており、これが同じならば、OS的には同じ機器であるとみなしていい。
[root@xxxpi ~]# lsmod
Module Size Used by
8192cu 540710 0
[root@xxxpi ~]# yum install hostapd
ここが混乱ポイント。hostapdには「ドライバ」という概念が存在し、搭載している無線LANチップの種類に応じて「/etc/hostapd/hostapd.conf」の中で適切に指定してやる必要があるのだが、ここでいう「ドライバ」とは、上記の8192cuドライバ(カーネルモジュール)とは完全に無関係であり、上記でインストールしたhostapdというパッケージに含まれる「/usr/sbin/hostapd」という実行ファイルに、予め組み込み済みのものなのだ。
そこでどうするかというと、Realtek社が個別に配布している、hostapdパッケージをコンパイルして、実行ファイルだけまるごと差し替えてやる。これにより、Realtekの8192CUという無線LANチップを搭載した無線LANアダプタで、無線LANアクセスポイントを構成することができる。なんだよ、そういうことなのかよ、そうならそうと言ってくれよ。
・Realtekのサイトから8192CU用のパッケージをダウンロード
http://www.realtek.com.tw/downloads/searchView.aspx?keyword=RTL8192CU
0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
・展開、コンパイル、差し替え
[root@xxxpi ~]# unzip 0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
[root@xxxpi ~]# cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/
[root@xxxpi wpa_supplicant_hostapd]# tar xvfz wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz
[root@xxxpi wpa_supplicant_hostapd]# cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd/
[root@xxxpi hostapd]# make
[root@xxxpi hostapd]# mv /usr/sbin/hostapd /usr/sbin/hostapd.org
[root@xxxpi hostapd]# mv /usr/sbin/hostapd_cli /usr/sbin/hostapd_cli.org
[root@xxxpi hostapd]# cp hostapd /usr/sbin/hostapd
[root@xxxpi hostapd]# cp hostapd_cli /usr/sbin/hostapd_cli
[root@xxxpi ~]# cd /etc/hostapd/
[root@xxxpi hostapd]# diff -bc hostapd.conf.org hostapd.conf
ignore_broadcast_ssid=0
# Uncomment these for base WPA & WPA2 support with a pre-shared key
! wpa=3
! wpa_key_mgmt=WPA-PSK
! wpa_pairwise=TKIP CCMP
! rsn_pairwise=TKIP CCMP
# DO NOT FORGET TO SET A WPA PASSPHRASE!!
! wpa_passphrase=YourPassPhrase
# Most modern wireless drivers in the kernel need driver=nl80211
! driver=rtl871xdrv
# Customize these for your local configuration...
! interface=wlan0
! hw_mode=g
! ieee80211n=1
! channel=N
! ssid=XXXXXXXX
! eap_server=1
! wpa_group_rekey=7200
hostapdを動作させる場合、wpa_supplicantが動作していると、処理が競合するっぽいので止めてやる。どうやら、単にサービスを止める設定をするだけでは、dbus経由で再起動がかかってしまうようなので、dbusの設定から殺しておく。
[root@xxxpi ~]# cd /usr/share/dbus-1/system-services/
[root@xxxpi system-services]# mv fi.w1.wpa_supplicant1.service x.fi.w1.wpa_supplicant1.service.org
[root@xxxpi system-services]# systemctl stop wpa_supplicant
[root@xxxpi ~]# cd /etc/modprobe.d/
[root@xxxpi modprobe.d]# vi 8192cu.conf
[root@xxxpi modprobe.d]# cat 8192cu.conf
options 8192cu rtw_power_mgnt=0
[root@xxxpi ~]# systemctl enable hostapd
[root@xxxpi ~]# systemctl start hostapd
[root@xxxpi ~]# systemctl status hostapd
なお、詳しい検証はしていないが、この直後にPSPやKOBOを接続しようとすると、認証が通らず、接続に失敗する現象が発生した。不思議なことに、PCから接続しようとすれば、接続に成功し、その後はPSPやKOBOも問題なく接続できるようになる。原因は不明。
[root@xxxpi ~]# journalctl -u hostapd.service -n 1000 | grep -C 1 pairwise
8月 28 14:54:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000115
8月 28 14:54:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
8月 28 15:04:33 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 IEEE 802.11: deauthenticated due to local deauth request
--
8月 28 15:04:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000116
8月 28 15:04:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
8月 28 15:14:33 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 IEEE 802.11: deauthenticated due to local deauth request
--
8月 28 15:14:55 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000117
8月 28 15:14:55 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
8月 28 15:24:33 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 IEEE 802.11: deauthenticated due to local deauth request
--
8月 28 15:24:56 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000118
8月 28 15:24:56 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)