(2015-02-23)
無線LAN運用実験(全3回)。今回は以下の1回目です。

まずはRaspberry Pi を無線LAN接続にしてみます。 USB無線LANアダプターとして、PLANEXの GW-USNANO2A(右の写真のもの)を使用します。
対象装置はひとまずRaspberry Pi 2号機ってことで。

メイン

USB無線LANアダプターの仕様

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

/etc/wpa_supplicant/wpa_suplicant.conf

ルーター本体の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アドレスが自動的に(勝手に)割り当てられた状態になっています。

/etc/network/interfaces

実際の無線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 もできなくなってしまいます。その場合、後述の [ リカバリ方法 ] で復旧させることになります。

無線LANの起動・終了

あとは、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の往復パケットがこんなことになったりします。

  1. 行きのパケット 192.168.1.10(eth0) -> 192.168.1.51(wlan0)
  2. 戻りのパケット 192.168.1.21(eth0) -> 192.168.1.10(eth0)

実は・・・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 がうまく動くようになりました。

無線LAN親機

親機側で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は知らなかった・・・)


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-02-15 (火) 10:06:48