無線LAN問題の調査方法
目次
目的
このページは、 NetworkManager か YaST のいずれかを使用して多数のコンポーネントが関与する無線 LAN を設定する際、発生しうる問題について調査方法を示しています。
無線 LAN 接続を設定するにあたり、主なコンポーネントは下記の通りです:
- nm-applet または KNetworkManager
- NetworkManager または YaST (両方の場合もあります)
- wpa_supplicant
- 無線 LAN ドライバ (mac80211 と共に動作するものもあります)
一般的な落とし穴
切り替えスイッチ
多くの内蔵無線 LAN カードにはハードウエアスイッチが存在し、無線機能を有効にしたり無効にしたりすることができます。まずはスイッチで無線機能が物理的に有効になっているかどうかを確認してください。スイッチで無効化されている場合は、ドライバから無線ネットワークの設定を行なうことはできません。
ファームウエア
いくつかの無線 LAN デバイス (たとえば iwl3945, iwlagn, b43 など) は、オペレーティングシステム内でファイルの形で設置するファームウエアと呼ばれるものを必要とします。いくつかのファームウエアファイルは openSUSE がパッケージの形式で用意しています (iwl3945-ucode や ralink-firmware など) が、法的な制限から提供できないものもあります。これらは手動でインストールする必要があります。ファームウエアファイルによっては、 /usr/sbin 内に置くスクリプトと共に提供されている場合もあります (install_acx100_firmware, install_bcm43xx_firmware, install_intersil_firmware など) 。
チャンネル 12, 13, 14 の無効化 (誤った規制領域)
openSUSE 11.0 から、多くの無線 LAN ドライバは mac80211 に依存するようになっています。無線 LAN スタックは規制領域を取り扱う機能を持っていないため、 FCC に準拠する目的で利用可能なチャンネルのうち最小限に限って有効に設定しています (802.11b/g では 1 から 11 ) 。たとえばドイツでは 12, 13 が利用できるはずですが、既定では無効化されています。これらのチャンネルは規制領域を上書きすることで利用できるようになります (規制領域としては US (アメリカ), EU (ヨーロッパ), JP (日本) のいずれかを指定します):
echo "options cfg80211 ieee80211_regdom=EU" > /etc/modprobe.d/cfg80211
全ての無線 LAN モジュール (mac80211, cfg80211, iwl3945 など) を読み込み直すか、システムを再起動すると新しい規制領域が有効になります。
NetworkManager
必要なログ
NetworkManager における無線 LAN 問題を調査するには、接続が失敗した後の下記のログが必要です:
- /var/log/NetworkManager
- /var/log/wpa_supplicant (可能であれば饒舌 (verbose) モードでのデバッグ出力も)
- dmesg の出力
wpa_supplicant のデバッグ出力の有効化
恒久策
wpa_supplicant からのデバッグ出力を最大に設定するには、 /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service. ファイルを修正する必要があります。
下記の行を
Exec=/usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -u -f /var/log/wpa_supplicant.log
以下のように修正してください。
Exec=/usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -u -dddt -f /var/log/wpa_supplicant.log
その後、 root で下記のコマンドを実行してください:
> rcnetwork stop > killall wpa_supplicant > rcnetwork start
このようにすることで、 wpa_supplicant が /var/log/wpa_supplicant.log に対して詳細なデバッグ出力を書き込むようになります。
暫定策
デバッグ出力が短い間にだけ有効であって欲しい場合 (たとえば 1 回の接続試行分のみを採取したい場合) は、下記のコマンドでデバッグレベルを変更することができます。
> kill -SIGUSR1 `pidof wpa_supplicant`
wpa_supplicant のログ (/var/log/wpa_supplicant) には、下記のように新しいデバッグレベルを示す行を出力します:
Signal 10 received - changing debug level to MSGDUMP
接続を手動で設定する方法
NetworkManager と wpa_supplicant の停止
接続を手動で設定するには、 NetworkManager や wpa_supplicant が動作していない状態にする必要があります。
> rcnetwork stop > killall wpa_supplicant
接続しようとしているアクセスポイントがセキュリティ設定を使用していない場合は、 iwconfig を使用することで接続を開始することができます。 WEP 暗号化接続の場合もこの方法で設定できます。その他の接続方法 (WPA-PSK, WPA-EAP, 動的 WEP を使用した 802.1x) の場合は wpa_supplicant が必要です。
基本的なコマンド
まずは iwconfig を実行して、どの無線インターフェイスを使いたいかを選んでください。
> iwconfig lo no wireless extensions. eth1 no wireless extensions. eth0 unassociated ESSID:"" Mode:Managed Frequency=2.412 GHz Access Point: Not-Associated Bit Rate:0 kb/s Tx-Power=20 dBm Sensitivity=8/0 Retry limit:7 RTS thr:off Fragment thr:off Encryption key:off Power Management:off Link Quality:0 Signal level:0 Noise level:0 Rx invalid nwid:0 Rx invalid crypt:3 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:53 Missed beacon:0
この場合、 eth0 が無線 LAN インターフェイスになっています。
次にお使いの無線ネットワークの名前 (ESSID) がわからない場合は、スキャンを実行してください。
> iwlist eth0 scan ... Cell 02 - Address: XX:XX:XX:XX:XX:XX ESSID:"XXXXXX" Protocol:IEEE 802.11bg Mode:Master Channel:2 Frequency:2.417 GHz (Channel 2) Encryption key:off Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s 11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s 48 Mb/s; 54 Mb/s Quality=37/100 Signal level=-78 dBm Extra: Last beacon: 488ms ago ...
このコマンドでは、検出された全てのアクセスポイントが表示されます。一覧の中に接続したいアクセスポイントが表示されない場合は、 ESSID のブロードキャストを行なっていないアクセスポイントである場合が考えられます。この場合は名前を指定してスキャンしてみてください。
> iwlist eth0 scan essid your_essid_here ...
iwconfig
セキュリティ無しでの接続
mac80211 ドライバ (たとえば iwl3934, iwl4965, ath5k, b43, rtl8187, rt2x00 など) をご利用の場合は、接続を確立させる前にインターフェイスを有効に設定する必要があります。
> ifconfig eth0 up
暗号化無しの無線接続は iwconfig を使用すれば簡単です。
> iwconfig eth0 essid (ここに ESSID を指定します)
数秒待ってから、 iwconfig を使用して接続が確立したかどうかを確認してください。
> iwconfig eth0 eth0 IEEE 802.11g ESSID:"XXXXXX" Mode:Managed Frequency:2.417 GHz Access Point: XX:XX:XX:XX:XX:XX Bit Rate:54 Mb/s Tx-Power=20 dBm Sensitivity=8/0 Retry limit:7 RTS thr:off Fragment thr:off Encryption key:off Power Management:off Link Quality=58/100 Signal level=-68 dBm Noise level=-90 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:10
上記において重要な部分は下記の通りです。
- Access Point: XX:XX:XX:XX:XX:XX - お使いのアクセスポイントの MAC アドレスであるべき項目です
- Link Quality=58/100 - 0 以外の何らかの値になっているべき項目です
- Signal level=-68 dBm - 0 以外の何らかの値になっているべき項目です
- Noise level=-90 dBm - 0 以外の何らかの値になっているべき項目です
これらを確認できたら無線接続は完了です :)
なお、この接続を利用して何らかの作業を行なうには、後に示す IP アドレスの取得を実行する必要があります。
WEP セキュリティを使用した接続
TBD
wpa_supplicant
wpa_supplicant を使用した接続の設定は、暗号化無しの無線ネットワーク接続に比べると少し複雑です。まずは必要な情報を書き込んだ設定ファイルを用意する必要があります。設定ファイルの冒頭には、接続したいネットワークで共通に使用する基本情報を記入します。
ctrl_interface=/var/run/wpa_supplicant ctrl_interface_group=0 eapol_version=1 ap_scan=1 fast_reauth=1
次に設定ファイル内にネットワークブロックを記入します。ネットワークブロックではそれぞれ異なる無線セキュリティを設定することができます。
共有鍵方式の WPA (WPA-PSK)
WPA-PSK セキュリティを使用したネットワークの場合は下記の設定を使用します。 ssid と psk はそれぞれ環境に合わせて指定してください。
network={ ssid="ESSID を指定します" psk="パスワード (パスフレーズや事前共有鍵とも呼ばれます) を指定します" key_mgmt=WPA-PSK priority=5 proto=WPA }
WPA-EAP
TBD
接続の開始
ここまでで設定した設定を使用して wpa_supplicant による接続を開始するには、下記のコマンドを実行します。
> wpa_supplicant -Dwext -ieth0 -c/etc/your_config_file -dddt
-Dwext はローレベルドライバとの通信に wext と呼ばれるドライバを使用することを指定しています。現時点では、ほとんどの無線 LAN カードでこの設定が利用できます (少なくとも mac80211 ベースのドライバはこれで動作します)
-ieth0 は無線接続で使用するインターフェイス名を指定しています
-c/etc/your_config_file は wpa_supplicant が使用する設定ファイルを指定しています
-dddt は最大限のデバッグ出力を行なうよう指定しています
数秒後、うまくいけば下記のように表示されます。
1213018160.349324: State: GROUP_HANDSHAKE -> COMPLETED 1213018160.349334: CTRL-EVENT-CONNECTED - Connection to XX:XX:XX:XX:XX:XX completed (auth) [id=0 id_str=] 1213018160.349341: wpa_driver_wext_set_operstate: operstate 0->1 (UP) 1213018160.349348: WEXT: Operstate: linkmode=-1, operstate=6 1213018160.349880: EAPOL: External notification - portValid=1 1213018160.349899: EAPOL: External notification - EAP success=1 1213018160.349905: EAPOL: SUPP_PAE entering state AUTHENTICATING 1213018160.349911: EAPOL: SUPP_BE entering state SUCCESS 1213018160.349917: EAP: EAP entering state DISABLED 1213018160.349924: EAPOL: SUPP_PAE entering state AUTHENTICATED 1213018160.349930: EAPOL: SUPP_BE entering state IDLE 1213018160.349954: RTM_NEWLINK: operstate=1 ifi_flags=0x11043 ([UP][RUNNING][LOWER_UP]) 1213018160.349965: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan0' added 1213018161.356786: RSN: processing PMKSA candidate list 1213018161.356821: RSN: not in suitable state for new pre-authentication 1213018161.852768: EAPOL: startWhen --> 0
無線接続の設定が完了しますので、別のコンソールを開いて iwconfig を使用 (前述) して間違いなく接続できたかどうかを確認することができます。
wpa_gui
もっと簡単に設定したい場合は、 wpa_supplicant にある 2 種類の連携アプリケーション wpa_cli と wpa_gui を使用することができます。 wpa_cli は wpa_supplicant パッケージに付属していますが、 wpa_gui は別途にインストールする必要があります。
# zypper in wpa_supplicant-gui
wpa_gui が wpa_supplicant を使用できるよう設定するには、ファイル /etc/wpa_supplicant/wpa_supplicant.conf を gedit またはお使いのエディタで編集し、設定を変更する必要があります。
# gedit /etc/wpa_supplicant/wpa_supplicant.conf
既存の設定の最後に "update_config=1" という行を追加してください。 wpa_supplicant の設定方法についての情報は、 /usr/share/doc/packages/wpa_supplicant/wpa_supplicant.conf をご覧ください。
設定が終わったら、 wpa_supplicant を起動します。
# wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf -B
その後、下記を実行します。
# wpa_gui
wpa_gui のダイアログが開きますので、 "スキャン" ボタンを押して検出されたアクセスポイントを表示させてください。いずれかの項目を選んでダブルクリックすると、パスフレーズを入力するためのもう一つのダイアログが表示されます。ここから追加ボタンを押すと、 wpa_gui にネットワークが追加されて接続が実行されます。この仕組みは WEP または WPA で暗号化されたオープンネットワークでのみ動作します。 wpa_gui は必要なパラメータをwpa_supplicant.conf に書き込みますので、何が行なわれているかを知るには下記のように実行してください。
# cat /etc/wpa_supplicant/wpa_supplicant.conf
注意: wpa_gui は NetworkManager から開始された wpa_supplicant のインスタンスに対しては動作しません。これは wpa_supplicant が D-Bus インターフェイスを使用して通信しているためです。 ifup から開始されたインスタンスであれば、設定ファイルを必要とせずに動作します。
IP アドレスの取得
DHCP
お使いのネットワークで IP アドレスの割り当てに DHCP を使用している場合、まずは既に dhcpcd や dhclient が動作していないかどうかを確認してください。いずれかが動作している場合は、以下のようにして終了させてください。
> ps -A | grep dhc # kill pid
これで準備完了です。 dhdpcd wlan0 | eth1 や dhclient wlan0 | eth1 のように実行して IP アドレスを取得してください。
# dhcpcd wlan0
dhcpcd の実行後コマンドラインインターフェイスに戻ってきたら、 IP アドレスの割り当ては完了です。 ifconfig を使用して確認することができます。
> ifconfig wlan0 eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX inet addr:192.168.0.173 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::212:f0ff:fe39:49b4/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:104 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:1 collisions:0 txqueuelen:1000 RX bytes:46360 (45.2 Kb) TX bytes:1468 (1.4 Kb) Interrupt:23 Speicher:b4001000-b4001fff
アドレスは inet addr:192.168.0.173 のように表示されています。
手動 IP 設定
設定したい IP アドレスを ifconfig で設定します。
> ifconfig eth0 192.168.0.145
接続がうまくいっているかどうかの確認
接続が有効化されていて動作しているかどうかは、インターネットサイトに対して ping コマンドを実行するのがベストです。
> ping google.com PING google.com (64.233.167.99) 56(84) bytes of data. 64 bytes from py-in-f99.google.com (64.233.167.99): icmp_seq=1 ttl=242 time=156 ms 64 bytes from py-in-f99.google.com (64.233.167.99): icmp_seq=2 ttl=242 time=151 ms 64 bytes from py-in-f99.google.com (64.233.167.99): icmp_seq=3 ttl=242 time=151 ms ^C --- google.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2008ms rtt min/avg/max/mdev = 151.011/152.976/156.665/2.648 ms
上記のように出力されれば接続がうまくいっていることになります!
上記のように表示されない場合は、少なくともアクセスポイントに届いているかどうかを確認してください。下記の例ではアクセスポイントのアドレスが 192.168.0.1 である場合を示しています:
ping 192.168.0.1 PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.75 ms 64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=2.14 ms 64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=1.75 ms 64 bytes from 192.168.0.1: icmp_seq=4 ttl=64 time=1.84 ms ^C --- 192.168.0.1 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3012ms rtt min/avg/max/mdev = 1.754/1.874/2.145/0.160 ms
アクセスポイントに ping が成功してもインターネットに届かない場合は、名前解決に問題がある可能性が考えられます。 2 つのネットワークカード (たとえば有線と無線) が同時に有効になっていて、いずれかについて dhcpcd が動作している場合があります。
このような場合は、いったん両方のインターフェイスを無効に設定してから無線ネットワークを有効にし、本ページの手順をやり直してください。
# ifdown eth0 # ifdown wlan0 # ifup wlan0
TODO: このあとの説明を追記予定..
モニタモードとも呼ばれるパケットキャプチャ
必要なソフトウエア
無線 LAN インターフェイスでのパケットキャプチャを行なうには、 kismet を使用することができます。その後 Wireshark を利用して kismet が採取したパケットを読み取ることで、読みやすい形でパケットを表示することができるようになります。
mac80211 ベースのドライバにおけるモニタモードの有効化
TBD
FAQ (よくある質問)
Q: 接続が数分程度で切れてしまいます
A: アクセスポイントによってはクライアントが一定時間の間通信を行なわないと接続を切ってしまうものがあります。このような振る舞いはアクセスポイント側の設定インターフェイスから変更することもあります。
リンク
http://wireless.kernel.org/en/users/Reporting_bugs
著者
Helmut Schaa <hschaa@suse.de>