(2015-02-23)
無線LAN運用実験(全3回)。今回は以下の1回目です。
まずはRaspberry Pi を無線LAN接続にしてみます。
USB無線LANアダプターとして、PLANEXの GW-USNANO2A(右の写真のもの)を使用します。
対象装置はひとまずRaspberry Pi 2号機ってことで。
GW-USNAMO2Aの主な仕様
IEEE802.11n/g/b (2.4GHz帯) アクセス方式 インフラストラクチャーモード セキュリティ WEP, WPA-PSK(TKIP/AES), WPA2-PSK(TKIP/AES) インターフェース USB2.0/1.1 電源 DC5.0V 電力 待機0.5W, 最大1.3W
とりあえず本体のUSB端子へ接続すると・・・予想通り再起動がかかりました。
すでに接続済みのUSBハブへ接続すると、・・・あれれやはり再起動がかかりました。(電源ライン直はんだ付けしている1号機では再起動しないので、電源ラインの弱点が出たのでしょう:-)
ではそそくさと設定に入ります。
まずは無線LANアダプターが認識されたかどうかチェック。
$ lsusb Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 004: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS] Bus 001 Device 005: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
上記の4行目「PLANEX」にて、何もしなくてもドライバの認識までうまくいっているのがわかります。
Raspberry Pi + Raspbianで実績のあるアダプターを購入したので、まあ当たり前っちゃ当たり前の結果です。
下記のファイルをいじります。
/etc/wpa_supplicant/wpa_suplicant.conf /etc/network/interfaces
ルーター本体のSSIDとパスフレーズを入力すると、設定ファイルの書式として出力してくれるコマンドがあります。
$ wpa_passphrase myhome_ssid myhome_passwd network={ ssid="myhome_ssid" #psk="myhome_passwd" psk=b8c03c4b0f9bdedec46bc78f31eb3c89dcfb1cc8e88987114f430e4acd06407b }
myhome_ssid, myhome_passwdのところは各人の環境に合わせて変更してください。
/etc/wpa_supplicant/wpa_supplicant.confに、上記の出力結果を追加し、さらに何行か追加します。編集結果は下記の通り。
$ su # cat /etc/wpa_supplicant/wpa_supplicant.conf ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="myhome_ssid" #psk="myhome_passwd" <- 最後に消す psk=hogehogehogehogehogehogehogehogehogehogehoge proto=WPA key_mgmt=WPA-PSK pairwise=CCMP group=CCMP scan_ssid=1 }
重要!!
管理人TK宅の無線はSSIDを隠匿しているのですが、その場合上記の
scan_ssid=1
を追加しておかないと永遠に接続できません!!
ここでドツボに嵌ってしまいましたorz
ここまで正しいかどうか、手動で設定を有効にしてみる。
# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf rfkill: Cannot open RFKILL control device ioctl[SIOCSIWAP]: Operation not permitted ioctl[SIOCSIWENCODEEXT]: Invalid argument ioctl[SIOCSIWENCODEEXT]: Invalid argument wlan0: Trying to associate with xx:xx:xx:xx:xx:xx (SSID='myhome_ssid' freq=2412 MHz) wlan0: Association request to the driver failed wlan0: Associated with xx:xx:xx:xx:xx:xx wlan0: WPA: Key negotiation completed with xx:xx:xx:xx:xx:xx [PTK=CCMP GTK=CCMP] wlan0: CTRL-EVENT-CONNECTED - Connection to xx:xx:xx:xx:xx:xx completed (auth) [id=0 id_str=]
MACアドレスは xx:xx:xx:xx:xx:xx に変えています。
最初のほうにエラーメッセージが出ますが無視してよいらしい。
wpa_supplicantコマンドはフォアグランドのままです。
この状態で、下記コマンドを実行し、インターフェースが正しく起動したことが確認できます(別シェル起動)。
# iwconfig wlan0 wlan0 IEEE 802.11bgn ESSID:"myhome_ssid" Nickname:"<WIFI@REALTEK>" Mode:Managed Frequency:2.412 GHz Access Point: xx:xx:xx:xx:xx:xx Bit Rate:72.2 Mb/s Sensitivity:0/0 Retry:off RTS thr:off Fragment thr:off Encryption key:****-****-****-****-****-****-****-**** Security mode:open Power Management:off Link Quality=100/100 Signal level=100/100 Noise level=0/100 Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 # ifconfig wlan0 wlan0 Link encap:イーサネット ハードウェアアドレス 00:xx:xx:xx:xx:xx inet6アドレス: fe80::xxxx:xxxx:xxxx:xxxx/64 範囲:リンク inet6アドレス: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 範囲:グローバ ル UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:18 エラー:0 損失:257 オーバラン:0 フレーム:0 TXパケット:8 エラー:0 損失:32 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:186917 (182.5 KiB) TXバイト:27505 (26.8 KiB)
次の節の interfaces ファイルによるIPアドレスの設定はまだ行っていないので、IPv6アドレスが自動的に(勝手に)割り当てられた状態になっています。
実際の無線LANインターフェースの起動、停止は、先ほどの wpa_supplicant ではなく、定番の ifup/ifdown で行えるように設定します。
まずはテストということで、m/etc/network/interfaces は以下のような内容にしてみます。
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.21 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 auto wlan0 iface wlan0 inet static address 192.168.1.51 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 #gateway 192.168.1.1 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
無線LAN は wlan0 で示されている部分です。ひとまず eth0 と同じネットワークにしてみます(^^;)。
wlan0 と eth0 を同じネットワークにする場合、 gateway を記述してしまうと ifup コマンドでエラーになってしまい、
ifdown もできなくなってしまいます。その場合、後述の [ リカバリ方法 ] で復旧させることになります。
あとは、ifup コマンドで起動するだけです。-v オプションをつけると、起動状況を表示してくれるので、動作確認には便利です。
# ifup -v wlan0 Configuring interface wlan0=wlan0 (inet) run-parts --verbose /etc/network/if-pre-up.d run-parts: executing /etc/network/if-pre-up.d/wireless-tools run-parts: executing /etc/network/if-pre-up.d/wpasupplicant wpa_supplicant: wpa-driver nl80211,wext (default) wpa_supplicant: /sbin/wpa_supplicant -s -B -P /var/run/wpa_supplicant.wlan0.pid -i (長いので行を折り返し) wlan0 -D nl80211,wext -c /etc/wpa_supplicant/wpa_supplicant.conf Starting /sbin/wpa_supplicant... ioctl[SIOCSIWAP]: Operation not permitted ioctl[SIOCSIWENCODEEXT]: Invalid argument ioctl[SIOCSIWENCODEEXT]: Invalid argument ioctl[SIOCSIWAP]: Operation not permitted wpa_supplicant: /sbin/wpa_supplicant daemon failed to start run-parts: /etc/network/if-pre-up.d/wpasupplicant exited with return code 1 ip addr add 192.168.1.51/255.255.255.0 broadcast 192.168.1.255 dev wlan0 label wlan0 ip link set dev wlan0 up run-parts --verbose /etc/network/if-up.d run-parts: executing /etc/network/if-up.d/mountnfs run-parts: executing /etc/network/if-up.d/openssh-server run-parts: executing /etc/network/if-up.d/upstart run-parts: executing /etc/network/if-up.d/wpasupplicant
ifup コマンドの実行が終了してから実際に無線LANが使用可能になるまで、少し時間がかかるようです(10秒前後?)。
結果は下記の通り。
# iwconfig wlan0 wlan0 IEEE 802.11bgn ESSID:"myhome_ssid" Nickname:"<WIFI@REALTEK>" Mode:Managed Frequency:2.412 GHz Access Point: yy:yy:yy:yy:yy:yy Bit Rate:72.2 Mb/s Sensitivity:0/0 Retry:off RTS thr:off Fragment thr:off Encryption key:****-****-****-****-****-****-****-**** Security mode:open Power Management:off Link Quality=100/100 Signal level=92/100 Noise level=0/100 Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 # ifconfig wlan0 wlan0 Link encap:イーサネット ハードウェアアドレス xx:xx:xx:xx:xx:xx inetアドレス:192.168.1.51 ブロードキャスト:192.168.1.255 マスク:255.255.255.0 inet6アドレス: fe80::xxxx:xxxx:xxxx:xxxx/64 範囲:リンク inet6アドレス: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 範囲:グローバ ル UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:8 エラー:0 損失:287 オーバラン:0 フレーム:0 TXパケット:8 エラー:0 損失:34 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:202511 (197.7 KiB) TXバイト:29680 (28.9 KiB)
一応、ping の実験なんかも。
# ping -I wlan0 -c 4 192.168.1.1 PING 192.168.1.1 (192.168.1.1) from 192.168.1.51 wlan0: 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_req=1 ttl=255 time=24.9 ms 64 bytes from 192.168.1.1: icmp_req=2 ttl=255 time=7.19 ms 64 bytes from 192.168.1.1: icmp_req=3 ttl=255 time=6.66 ms 64 bytes from 192.168.1.1: icmp_req=4 ttl=255 time=6.69 ms --- 192.168.1.1 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 6.660/11.382/24.982/7.855 ms # ping -I eth0 -c 4 192.168.1.1 PING 192.168.1.1 (192.168.1.1) from 192.168.1.21 eth0: 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_req=1 ttl=255 time=1.64 ms 64 bytes from 192.168.1.1: icmp_req=2 ttl=255 time=1.40 ms 64 bytes from 192.168.1.1: icmp_req=3 ttl=255 time=1.37 ms 64 bytes from 192.168.1.1: icmp_req=4 ttl=255 time=1.35 ms --- 192.168.1.1 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 1.354/1.443/1.644/0.125 ms
制限事項:
実は、別のマシン(例えば 192.168.1.10)から前述の 192.168.1.51 へpingを飛ばすと、実際には 有線側(eth0)が反応してしまったりします(今回のマシンは eth0=192.168.1.21, wlan0=192.168.1.51として実験)。
また、pingの往復パケットがこんなことになったりします。
実は・・・LinuxのARPの仕様だそうで
ARPのブロードキャスト「192.168.1.51を持っているのは誰ですか~?」を
eth0 が最初に受け取ると、カーネルは「192.168.1.51を持っているのはおらだよ!」
といってそのときブロードキャストを受け取ったネットワークインターフェースのMACアドレスを返す、という仕様だそうです。
このあたりをちゃんと動作させるには(できるのかどうかも不明)、ルーティングとか ARP の応答についての知識が必要と思われますが、これはまた別の機会にということで。
無線LANをオフにする場合は、下記でどんぞ。
# ifdown -v wlan0 Configuring interface wlan0=wlan0 (inet) run-parts --verbose /etc/network/if-down.d run-parts: executing /etc/network/if-down.d/upstart run-parts: executing /etc/network/if-down.d/wpasupplicant ip -4 addr flush dev wlan0 label wlan0 ip link set dev wlan0 down run-parts --verbose /etc/network/if-post-down.d run-parts: executing /etc/network/if-post-down.d/wireless-tools run-parts: executing /etc/network/if-post-down.d/wpasupplicant wpa_supplicant: terminating wpa_supplicant daemon via pidfile /var/run/wpa_supplicant.wlan0.pid Stopped /sbin/wpa_supplicant (pid 7234).
あとは、無線LANのみで起動するように interfaces を変更するとか、無線LANを別セグメントのネットワークにつなぐとか、まあそんな感じです。
無線LANアダプターのパワー制御ってできるのかな~。
いろいろ試しているうちに、にっちもさっちもいかなくなった場合、リブートする前にとりあえず下記を試してみます。
# killall wpa_supplicant # ifconfig wlan0 0.0.0.0
管理人TKは、/etc/ntwork/interfaces などをいじっているうちに、
# ifup wlan0
で常時エラーが出るようになってしまい、設定を元に戻してもどうしようもなくなってしまったのですが、特に2行目の ifconfig で アドレス割り当てをクリアすると、ifup がうまく動くようになりました。
親機側でMACアドレスフィルタリング等行っている場合は、適宜許可する。
子機のMACアドレスは、下記のコマンドで表示できる。
$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet 192.168.1.21/24 brd 192.168.1.255 scope global eth0 valid_lft forever preferred_lft forever 3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3番目のwlan0にMACアドレスがあります。上記では伏字にしました。
下記コマンドでアクセスポイントの検索が可能。
なお、スーパーユーザで実行しないと、iwlistの内容は更新されない模様。
$ su # iwlist wlan0 scan wlan0 Scan completed : Cell 01 - Address: ??:??:??:??:??:?? ESSID:"?????" Protocol:IEEE 802.11bgn Mode:Master Frequency:2.417 GHz (Channel 2) Encryption key:off Bit Rates:130 Mb/s Quality=15/100 Signal level=10/100 Cell 02 - Address: ??:??:??:??:??:?? ESSID:"" Protocol:IEEE 802.11bgn : (以下、見つけられたアクセスポイントの一覧がずらずらと出力される)
もし下記のエラーメッセージが表示される場合(子機側の設定を全くしていない等)、同じく下記のインターフェースを活動状態にするコマンドを実行してから、再度上記コマンドを試す。
# iwlist wlan0 scan wlan0 No scan results # ifconfig wlan0 up
詳しくは man ifconfig で見てちょうだい。
無線LANの設定以前の問題。ネットワーク設定の基本中の基本だった模様(管理人TKは知らなかった・・・)