2010/08/06(Fri)FedoraでのNetworkManagerを使わない無線接続方法まとめ

2010/08/06 18:35 Software::Linux
最近のメジャーなLinuxディストリビューションは皆、といって良いほどNetworkManagerがネットワークを管理しています。
画面上部のパネルの通知領域から、ネットワークを選べばいいのでお手軽なんですけど、相性でうまく繋がらなかったりネットワークが勝手に切り替わったりと、面倒なので、従来のnetwork-scriptsを用いる方法での繋ぎ方でチャレンジします。

前提環境

Fedora 13
kernel 2.6.33.6-147.fc13.i686.PAE
Fedoraのバージョンはあまり関係ないかもしれませんが念のため。
RedHat系のCentOSでも同様の手順でうまくいくはずです。
Debian系は知らんっ(ぉ

事前準備

# chkconfig NetworkManager off

# chkconfig network on

# chkconfig --list | grep -i network

NetworkManager  0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
と表示されるのを確認しておきます。
# service NetworkManager stop

# service network start

基礎知識

設定ファイルは、/etc/sysconfig/network-scripts/以下のifcfg-デバイス名です。
# ifconfig

eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet6 addr: XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/64 Scope:Global
          inet6 addr: fe80::XXXX:XXXX:XXXX:XXXX/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:41954 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35089656 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:34240626 (32.6 MiB)  TX bytes:1457112775 (1.3 GiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3040 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3040 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:297768 (290.7 KiB)  TX bytes:297768 (290.7 KiB)

wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet6 addr: XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/64 Scope:Global
          inet6 addr: fe80::XXXX:XXXX:XXXX:XXXX/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3288 errors:0 dropped:0 overruns:0 frame:0
          TX packets:773 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:644810 (629.6 KiB)  TX bytes:122824 (119.9 KiB)
有線デバイスはeth0, eth1,...というように見えますが、無線デバイスはwlan0のように見えます。
wlan0がUPしていない(ifconfig -aでは見えているけど、ifconfigでリストに表示されない)場合は、$ sudo ifconfig wlan0 upとやれば見えるようになるはずです。
この時upに失敗した場合は、右上辺りにバルーンが出てきてDevice Driverをインストールするか?と聞かれるのでInstallを押せば、自動的にダウンロードされてupできるようになりましたー。
最近のFedoraはすごいね…

初期状態だと、どことも繋がっていないので、Not-Associatedになっているはず。
$ iwconfig wlan0

wlan0     IEEE 802.11abg  Mode:Managed  Frequency:5.18 GHz
          Access Point: Not-Associated   Tx-Power=15 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:off

ANY接続可能なAPリスト

rootで実行しないと現在Associateしているものしか見えないのかも。
# iwlist wlan0 scan

wlan0     Scan completed :
          Cell 01 - Address: XX:XX:XX:XX:XX:XX
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Quality=69/70  Signal level=-41 dBm
                    Encryption key:on
                    ESSID:"TestNetworkAP"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              12 Mb/s; 24 Mb/s; 36 Mb/s
                    Bit Rates:9 Mb/s; 18 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
...(略)...

WEPの繋ぎ方

とりあえず繋いでみる

AP名が"TestNetworkAP", WEPキーが"wep_password5"だとすると
# iwconfig wlan0 essid "TestNetworkAP" key "s:wep_password5"
とやってみる。keyにはs:を忘れないように。
# iwconfig wlan0

wlan0     IEEE 802.11abg  ESSID:"TestNetworkAP"
          Mode:Managed  Frequency:2.437 GHz  Access Point: XX:XX:XX:XX:XX:XX
          Bit Rate=54 Mb/s   Tx-Power=15 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:7765-705F-7061-7373-776F-7264-35
          Power Management:off
          Link Quality=70/70  Signal level=-34 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
Encryption keyはrootで実行した場合のみ見えるようです。

DHCPサーバからIPアドレスをもらってみます。
#  dhclient -d wlan0

Internet Systems Consortium DHCP Client 4.1.1-P1
Copyright 2004-2010 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/XX:XX:XX:XX:XX:XX
Sending on   LPF/wlan0/XX:XX:XX:XX:XX:XX
Sending on   Socket/fallback
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPACK from 192.168.1.1
bound to 192.168.1.215 -- renewal in 32777 seconds.

^C
もらえれば成功。

設定ファイルに書き込む

#  vim /etc/sysconfig/network-scripts/ifcfg-wlan0


# Intel Wireless 3945ABG (デバイス名などを適当に書いておく)
DEVICE=wlan0
TYPE=Wireless
ESSID=TestNetworkAP
BOOTPROTO=dhcp
ONBOOT=yes
HWADDR=XX:XX:XX:XX:XX:XX    (ifconfig wlan0で調べておく)
IPV6INIT=yes
でAP側の設定を書いておき、WEPキーに関しては、
#  echo 'KEY=s:wep_password5' > /etc/sysconfig/network-scripts/keys-wlan0

#  chmod 600 /etc/sysconfig/network-scripts/keys-wlan0
としておく。KEY=の次にs:を忘れないように。
後は、sudo ifconfig wlan0 {up|down}で勝手に繋がってくれるはず。

WPA-PSK, WPA2-PSKの繋ぎ方

とりあえず繋いでみる

WPA/WPA2の場合は、wpa_supplicantというプログラムを使わねばなりません。
そして、PSK(事前共有キー)も暗号化して設定ファイルに埋め込むという方法をとらねばいけないので、WEPよりも繋ぎ方は面倒です。
# cat /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
という風になっているはずなので、APの設定を追記します。
# wpa_passphrase "TestNetworkAP" "wpa_password" >> /etc/wpa_supplicant/wpa_supplicant.conf

# cat /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
        ssid="TestNetworkAP"
        #psk="wpa_password"
        psk=3eb29c717b649d04f8b15e6678916ac80dbc3c3acddb2c0831dcd066c7417966
}
ちなみに、暗号化されたpsk行はssidと生pskから生成されているので、同じキーでもAP名が変わった場合には再生成が必要です。

さらにAP情報え、key_mgmt, proto, pairwise, groupを追記します。
key_mgmtはWPA-PSKとなっていますが、これはAPとWPA2-PSKで接続する場合もWPA-PSKでOKです。
また、WPA-PSKで接続したい場合も、protoからWPA2を消す必要はありません。
# vim /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
        ssid="TestNetworkAP"
        key_mgmt=WPA-PSK
        proto=WPA WPA2
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        #psk="wpa_password"
        psk=3eb29c717b649d04f8b15e6678916ac80dbc3c3acddb2c0831dcd066c7417966
}
接続テスト。
# wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0 -Dwext

Trying to associate with XX:XX:XX:XX:XX:XX (SSID='TestNetworkAP' freq=2437 MHz)
Associated with XX:XX:XX:XX:XX:XX
WPA: Key negotiation completed with XX:XX:XX:XX:XX:XX [PTK=CCMP GTK=CCMP]

CTRL-EVENT-CONNECTED - Connection to XX:XX:XX:XX:XX:XX completed (auth) [id=0 id_str=]

^C
iwconfigでチェック。
# iwconfig wlan0

wlan0     IEEE 802.11abg  ESSID:"TestNetworkAP"
          Mode:Managed  Frequency:2.437 GHz  Access Point: XX:XX:XX:XX:XX:XX
          Bit Rate=54 Mb/s   Tx-Power=15 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=70/70  Signal level=-30 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
見た目上、Encryption keyがoffになっていますが、実際はwpa_supplicantが仕事をしているので暗号化されています。


この状態で別窓からdhclientを叩いてIPアドレスが取れればOKです。
#  dhclient -d wlan0

Internet Systems Consortium DHCP Client 4.1.1-P1
Copyright 2004-2010 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/XX:XX:XX:XX:XX:XX
Sending on   LPF/wlan0/XX:XX:XX:XX:XX:XX
Sending on   Socket/fallback
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPACK from 192.168.1.1
bound to 192.168.1.215 -- renewal in 32777 seconds.

^C

設定ファイルに書き込む

以下のように、INTERFACESとDRIVERS行を書き換えます。
# vim /etc/sysconfig/wpa_supplicant

INTERFACES="-i wlan0"
DRIVERS="-D wext"
OTHER_ARGS="-u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid"
WEP側の設定がされないように、ifcfg-wlan0は無効化しておきます。
ESSID行を消し、ONBOOT=noにします。
鍵ファイル(/etc/sysconfig/network-scripts/keys-wlan0)は別に残っていても支障ありません。
#  vim /etc/sysconfig/network-scripts/ifcfg-wlan0


# Intel Wireless 3945ABG (デバイス名などを適当に書いておく)
DEVICE=wlan0
TYPE=Wireless
BOOTPROTO=dhcp
ONBOOT=no
HWADDR=XX:XX:XX:XX:XX:XX    (ifconfig wlan0で調べておく)
IPV6INIT=yes
そして、サービスを起動。
# service wpa_supplicant start
起動時から自動的に繋ぎたい場合には、
# chkconfig wpa_supplicant on

# chkconfig --list wpa_supplicant

wpa_supplicant  0:off   1:off   2:on    3:on    4:on    5:on    6:off
としておくと良いでしょう。

ステルス設定

SSIDをブロードキャストしない設定(ANY接続拒否)のAPに接続するにはもう一工夫必要。
Fedoraであれば、/usr/share/doc/wpa_supplicant-*/wpa_supplicant.confに細かい説明が書いてある。

ここでキーとなるのは、ap_scanとssid_scanというパラメータ。
# vim /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
ap_scan=2

network={
        ssid="TestNetworkAP"
        scan_ssid=1

        key_mgmt=WPA-PSK
        proto=WPA WPA2
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        #psk="wpa_password"
        psk=3eb29c717b649d04f8b15e6678916ac80dbc3c3acddb2c0831dcd066c7417966
}

ap_scanの意味は、
ap_scan=0
ドライバにスキャンを任せる。有線のIEEE 802.1X認証で使う場合などに使用する。
ap_scan=1
wpa_supplicantがスキャンとAP選択を行う。
ap_scan=2
ap_scan=0と似ているが、特定のセキュリティ設定が必要なAP向けの設定。key_mgmt, pairwise, group, protoなどのある特定の組合せでアソシエーションに失敗しても、別の方法でretryする。

scan_ssidの意味は、
scan_ssid=0
APスキャン時にSSIDを通知しない
scan_ssid=1
APスキャン時にSSIDを通知する(ステルスAPを発見するために必要)
ということらしい。

ちなみに/usr/share/doc/wpa_supplicant-*/wpa_supplicant.confには、WPA2-EAP等での接続方法についても書いてある。

参考文献