Raspberry Pi 無線LAN (wifi) SSH接続ができない

WLI-UC-GNM2
Raspberry pi を有線LAN経由でSSH接続してHeadless運用(モニタとかキーボードを接続しない)していたのですが、無線LANでSSHが使えれば離れたところにも設置できて便利です。そこでwifiで使うために、BUFFALOの無線アダプタを購入いたしました。型番はWLI-UC-GNM2。Amazon.co.jpで891円でした。無線LANに関してはWeb上で多くの方が報告されていますので問題ないハズと思ったのですが、なかなかうまくいきませんでした。

まず私のRPi環境のスペックです

Raspberry Pi Model B
Downloaded image: 2012-10-28-wheezy-raspbian.zip
Kernel version: 3.2.27+
Wireless adapter: BUFFALO WLI-UC-GNM2
lsusb output: Bus 001 Device 004: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]

board revision
root@raspberrypi:~# cat /proc/cpuinfo

Hardware : BCM2708
Revision : 0003

電源は 5V 2A
無線アダプタはセルフパワードハブ( powered hub)に接続
(電源に問題があって通信できない事例をWebで見ていましたので、この構成で試してみました。が、結果的には直接RPiに無線アダプタを挿しても同じでした。)

アクセスポイント側 BUFFALO WHR-HP-GN

無線アダプタは接続するとすぐ認識できました。

root@raspberrypi:~# lsusb
Bus 001 Device 004: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]

root@raspberrypi:~# dmesg
[    3.263009] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
[    3.409389] usb 1-1.2: New USB device found, idVendor=0411, idProduct=01ee
[    3.423267] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    3.437499] usb 1-1.2: Product: 802.11 n WLAN
[    3.448902] usb 1-1.2: Manufacturer: Ralink
[    3.460167] usb 1-1.2: SerialNumber: 1.0

IP address ,SSID, 事前共有Key等をセットします。(IPアドレス等は実際とは異なる便宜上のものです)LANケーブルが差し込まれている時は eth0 から通信して、また反対に無線アダプタが差し込まれている時はwlan0から通信する事を目的としています。 (1/29 追記: 後日、新しいSD-CARDに再構築してみたところ、下記の設定だけではデフォルトゲートウエイがwlan0に切り替わりませんでした。何の設定をしたのか思い出せないので、しかたなくeth0の設定をコメントアウトしました。また、アクセスポイントはWPA-PSK 暗号化はAESで試してみました。 )

</etc/network/interfaces>

auto lo
iface lo inet loopback

# auto eth0
# allow-hotplug eth0
# iface eth0 inet static   
# address 192.168.11.200
# network 192.168.11.0
# netmask 255.255.255.0
# broadcast 192.168.11.255
# gateway 192.168.11.1


auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.11.201
network 192.168.11.0
netmask 255.255.255.0
broadcast 192.168.11.255
gateway 192.168.11.1

wpa-ssid "エスエスID"
wpa-psk "事前共有key"

</etc/resolv.conf>

nameserver 192.168.11.1
root@raspberrypi:~# shutdown -r now

無線アダプタをセットして、LANケーブルは抜いた状態でリブートします。

root@raspberrypi:~# iwconfig
lo        no wireless extensions.

wlan0     IEEE 802.11bgn  ESSID:"エスエスID"
          Mode:Managed  Frequency:2.412 GHz  Access Point: 00:24:A5:xx:xx:xx
          Bit Rate=48 Mb/s   Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on
          Link Quality=70/70  Signal level=-19 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:1  Invalid misc:16   Missed beacon:0

eth0      no wireless extensions.

リンクはOKみたいです

root@raspberrypi:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.11.1      0.0.0.0         UG    0      0        0 wlan0
192.168.11.0      *               255.255.255.0   U     0      0        0 wlan0

ルーティングテーブルもOKみたいです。おや?簡単に繋がりました。インターネットもOK。Raspberry Pi側から通信する事は全然問題は無いですね。ですが・・・
クライアントのWindowsPCから有線LANでは繋がったSSHが無線LANでは繋がりません。(涙)

かなりの時間を費やしてようやく原因がわかりました。

(1)Windows PC   --- ping ---> Raspberry Pi  <NG>
(2)Raspberry Pi --- ping ---> Windows PC    <OK>
(3)Windows PC   --- ping ---> Raspberry Pi  <OK> (しばらくの間だけ)

上記のような状況です。Raspberry PiからクライアントPCに向けてPingを打った直後のみ、クライアントPCからRaspberry Piに通信できます。クライアント側からの ARP Request に Raspberry Pi の wlan0 が応答を返さない事が原因みたいです。

この対策を探すために必死にラズベリーパイのフォーラム等を探しまくりましたが、一番有力な解決策と思われるものは定期的にRaspberry Pi側からPingを打つ方法でした。簡単と言えばそうですが、これはスマートとはいえない解決策ですね。たいした成果も得られず、しかも夜遅くまで作業していたので、私はくたくたになってしまいました。(意識もうろう)

そこで後日、状況を整理するために、普段使っていなかった無線ルータ(PCI GW-MF54G2)で実験環境を作ってみましたところ、驚いたことに、何の問題もなく無線LANでクライアントマシンからSSH通信ができました。Raspberry Pi側ではなく、アクセスポイント側 BUFFALO WHR-HP-GNの仕様に問題があったということが結論でした。

バッファロのサイトを見たら新しいファームウエア【Ver.1.85 (R1.18/B1.00)】があって、「broadcast通信が出来なくなる場合がある問題を修正しました。」と書かれていましたので早速アップデートしたところ、現在使用している無線LANアクセスポイント (WHR-HP-GN)でも使えるようになりました。めでたしめでたしです。