無線LANの基本 - WiFi
法律的な理由のためaptosidはdfsg-freeのソフトウェアだけを提供しています。 non-freeのファームウェアについての詳細はこのリンクをチェックしてください。
無線LANが使えるようにするためには、必要なファームウェアをダウンロードするため数分間、無線でないインターネットに接続する必要があります。
無線でない接続ができない場合はファームウェアをフラッシュドライブなど外部デバイスに保存し、rootとして次のコマンドでインストールします:
#dpkg -i <firmware.deb>
搭載されている無線LANチップのブランドや型番などの知識なしで必要なファームウェアを知るためには次のコマンドを使います。
#fw-detect
次のような出力が表示されます:
#apt-get update #apt-get install <name of firmware> #modprobe -r <modulename> #modprobe <modulename>
Use the apt-get install line that fw-detect command gave you. After that is done, you need to issue some commands in konsole before configuring the device.
別の方法として、fw-detectが表示したapt-getのコマンドを使ってインストールすることもできます。ただファームウェアを使える用にするためにその後コンソールでいくつかコマンドを実行する必要があります。
デバイスを設定するためまずモジュールをインストールします。
コンソールでrootとして:
modprobe -r <モジュール名> modprobe <モジュール名>
<モジュール名>のところにfw-detectが表示したモジュール名を使います。その際コンソールで便利な機能、bashのコマンドコンプリーションが使えます。
<モジュール名>の最初の文字をいくつかタイプしたところでTABキーを押すと、モジュール名の残りが自動的の表示されます。(例: modprobe ipw TABキー)こうすれば綴りの間違いを避けることができます。
modprobeのコマンドは成功の場合どちらも何も表示しません。もし次のプロンプトだけが表示されたらモジュールがちゃんとロードされたということです。
これを確かめるには:
#lsmod | grep <module>
ここでK-Menu - InternetからCeniを実行します、またはコンソールからrootとしてCeniをスタートしてもかまいません。Getting Online - Ceni. 搭載された無線LANデバイスが表示され、設定ができるようになっているはずです。
無線LANをGUIで設定するにはWiFi - roaming WPA-GUIを見てください。
Debianのwpasupplicantの使い方
法律的な理由のためaptosidはdfsg-freeのソフトウェアだけを提供しています。 non-freeのファームウェアについての詳細はこのリンクをチェックしてください。
Debianの wpasupplicantパッケージはネットワークインフラストラクチャーの中核であるifupdownと密接に統合された二つの便利な使い方を提供します。
目次
1. wpa_supplicantドライバのバックエンドを指定する
* サポートされているドライバ
* よく使われ推薦できるドライバ
2. Mode #1: マネージドモード
* 例
* よく使われるオプション一覧
* マネージドモードについての重要事項
* 動作のしくみ
3. Mode #2: ローミングモード
* wpa_supplicant.conf
* /etc/network/interfaces
* wpa_supplicantをwpa_cliやwpa_guiで設定する
* ローミングデーモンをwpa_actionでコントロールする
* ローミングの微細設定
* ログファイル
* 外部のマッピングスクリプト(guessnetなど)を使う
* /etc/network/interfacesと外部マッピング
4. 困ったとき
* 隠れssids
5. 安全についての考察
* 設定ファイルの読み書き許可
1. wpa_supplicantドライバのバックエンドを指定する
デバイスに必要なドライバとして'wpa-drover'を特別に設定しない限り、wextドライババックエンドが使われます。Linuxの2.4カーネルまたは2.6.14以前の2.6カーネルではwpa-driverタイプを指定する必要がありました。
サポートされているドライバ
ドライバ | 説明 |
---|---|
wext | Linux 無線エクステンション (ジェネリック) |
よく使われ推薦できるドライバ
Intel Pro 無線LANアダプター(ipw2100, ipw2200 and ipw3945)はカーネルが2.6.14以前のものでない限りどれも'wext'ドライバーバックエンドを使っています。
Madwifiは'wext'と'madwifi'ドライバーバックエンドの両方が使えます。大抵の場合'wext'を選ぶべきですが、状況によっては'madwifi'のほうがいい場合もあります。
Ndiswrapperはバージョン1.16以降'ndiswrapper'ドライバーバックエンドをサポートしなくなったためよほど古いものを使っている場合をのぞき、'wext'を選ばなければいけません。
interfaces(5)のデバイス設定部でwpa-driverオプションを設定するには次のようにします:
iface eth0 inet dhcp wpa-driver wext . . . . . more options
2. Mode #1: マネージドモード
このモードを使えばwpa_supplicantによって既知の無線LANに接続することができます。この方法は無線ツールのパッケージの使い方に似ています。wpa-supplicantを使って接続する要素一つ一つがwpa-の接頭辞で始まり、この要素によって使われる値が続きます。
Mode #1 の wpa.confファイルの例1.
Mode #1 wpa.conf file - 例 1. ノート: 'wpa-psk'の値は次の条件のいづれかを満たすときだけ有効です: 1. 8文字から63文字までの長さのプレインテキスト(ASCII)文字列であること 2. 64文字の16進数の文字列であること # Connect to access point of ssid 'NETBEER' with an encryption type of # WPA-PSK/WPA2-PSK. It assumes the driver will use the 'wext' driver backend # of wpa_supplicant because no wpa-driver option has been specified. # The passphrase is given as a ASCII (plaintext) string. DHCP is used to # obtain a network address. # iface wlan0 inet dhcp wpa-ssid NETBEER # plaintext passphrase wpa-psk PlainTextSecret # Connect to access point of ssid 'homezone' with an encryption type of # WPA-PSK/WPA2-PSK, using the 'wext' driver backend of wpa_supplicant. # The psk is given as an encoded hexadecimal string. DHCP is used to obtain # a network address. # iface wlan0 inet dhcp wpa-driver wext wpa-ssid homezone # hexadecimal psk is encoded from a plaintext passphrase wpa-psk 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f # Connect to access point of ssid 'HotSpot1' and bssid of '00:1a:2b:3c:4d:5e' # with an encryption type of WPA-PSK/WPA2-PSK, using the the 'madwifi' driver # backend of wpa_supplicant. The passphrase is given as a plaintext string. # A static network address assignment is used. # iface ath0 inet static wpa-driver madwifi wpa-ssid HotSpot1 wpa-bssid 00:1a:2b:3c:4d:5e # plaintext passphrase wpa-psk madhotspot wpa-key-mgmt WPA-PSK wpa-pairwise TKIP CCMP wpa-group TKIP CCMP wpa-proto WPA RSN # static ip settings address 192.168.0.100 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 # User supplied wpa_supplicant.conf is used for eth1. All network information # is contained within the user supplied wpa_supplicant.conf. No wpa-driver type # is specified, so wext is used. DHCP is used to obtain a network address. # iface eth1 inet dhcp wpa-conf /path/to/wpa_supplicant.conf
よく使われるオプション一覧
/etc/network/interfacesの無線LAN設定によく使われる'wpa-'オプションの概略です。'wpa-'のどの接地値が有効になるかについては、あとに続く「マネージドモードについての重要事項」の欄を見てください.
NOTE: ALL values are CASE SeNsItVe
要素 設定値の例 説明 ======= ============= =========== wpa-ssid plaintextstring ネットワークssidの設定 wpa-bssid 00:1a:2b:3c:4d:5e アクセスポイントのbssidの設定 wpa-psk 0123456789...... 前もってシェアするwpaキー. パスフレーズとssidのペアから psk値の生成にはwpa_passphrase(8)を使う wpa-key-mgmt NONE, WPA-PSK, WPA-EAP, 使用できる認証キーマネジメントプロトコル IEEE8021X wpa-group CCMP, TKIP, WEP104, 使用できるwpaのグループ暗号化方法 WEP40 wpa-pairwise CCMP, TKIP, NONE 使用できるペアワイズ暗号化方法 wpa-auth-alg OPEN, SHARED, LEAP 許されているIEEE 802.11認証アルゴリズム wpa-proto WPA, RSN 使用できるプロトコル wpa-identity myplaintextname ネットワーク管理者から与えられたユーザー名 (EAP認証) wpa-password myplaintextpassword パスワード(EAP認証) wpa-scan-ssid 0 or 1 特定のリクエストフレームをつかうssidの走査の オンオフ wpa-ap-scan 0 or 1 or 2 wpa_supplicanの走査ロジックの設定
wpa_cli(8)の機能のすべてが実装されているはずですが、何かかけている場合のバグ報告には感謝します。
マネージドモードについての重要事項
ほとんどの'wpa-'オプションはssidが最低一つは指定されていることを前提にしています。"wpa-ap-scan"と"wpa-preauthenticate"の二つのみがこの条件なしで有効になります。
interfaces(5)ファイルに'wpa-'オプションを設定するだけでwpa_supplicantのデーモンが実行されます。
wpasupplicantのifupdownスクリプトは各オプションの入力タイプが有効であるという推量に基づいて動作します。 例えば、プレインテキストの入力は文字列の前後を引用符で囲tってwpa_cliに送り、それがwpa_supplicantのctrl_interfaceソケットを通してネットワークブロックの入力として送られます。
ifupをコマンドラインから'--verbose'オプションをつけて実行するとwpa_cliを通じてネットワークブロックを形づくるコマンドがすべて表示されます。もし/etc/network/interfacesの'wpa-'オプションの値が""で囲まれて表示されていたら、これはASCIIまたはプレインテキストの文字列であると解釈されたということです。
16進数の文字列であると解釈される入力もあります。(例. wpa-wep-key*など). 一方でwpa-pskオプションの設定値のタイプは単純に16進数に使われない文字が現れるかどうかのチェックによって決められてます.
動作のしくみ
上記のとおり、wpa_supplicantで指定するオプションはどれも'wpa-'ではじまります。それぞれのオプションはwpa_supplicant.conf(5), wpa_supplicant(8) and wpa_cli(8)のmanページに記述されたwpa_supplicantの属性のどれかに関係しています。
wpa_supplicantは事前の設定なしで実行され、wpa_kliは'wpa-'オプションの行の入力にしたがってネットワークを設定します。初めの段階ではwpa_supplicantとwpa_cliは(たとえばiwconfigがessidを接地するような)直接デバイス属性の設定を行うのではなく、デバイスにどのアクセスポイントが望ましいかを伝えるだけです。デバイスが電波を走査してみて、この望ましいアクセスポイントが見つかったらデバイス属性を設定します。
この仕事を行うスクリプトは:
/etc/wpa_supplicant/ifupdown.sh /etc/wpa_supplicant/functions.sh
ifupdown.shはrun-partsによって実行され,このrun-partsはまた逆に'pre-up'、 'pre-down'、 'post-down'の段階でifupdownによって実行されます。
'pre-up'の段階でwpa_supplicantデーモンがスタートし、/etc/network/interfacesの中のデバイス属性を設定する'wpa-'オプションに従がってネットワークを設定するwpa_kliのコマンドがつづきます。
wpa-roamが使われている場合、'post-up'の段階でwpa_cliデーモンがスタートします。
'pre-down'の段階で、wpa_cliデーモンが作動中の場合ストップします。
'post-down'の段階で、wpa_supplicantデーモンがストップします。
3. Mode #2: ローミングモード
このパッケージに控えめで単純なローミングメカニズムも提供されています。/sbin/wpa_actionというスクリプトで一度実行されるとifupdownのコマンドをコントロールします。詳細についてはwpa_action(8)のmanページに詳しく説明されています。
ローミングモードを活用するにはinterfaces(5)を次の例のように設定します:
iface eth1 inet manual wpa-driver wext wpa-roam /path/to/wpa_supplicant.conf
上の例の場合、wpa_supplicantとwpa_cliの二つのデーモンがスタートします。wpa_supplicant.confを用意する必要があります。設定ファイルのサンプルを読むことからスタートするのが良いでしょう:
# copy the template to /etc/wpa_supplicant/ cp /usr/share/doc/wpasupplicant/examples/wpa-roam.conf \ /etc/wpa_supplicant/wpa_supplicant.conf # allow only root to read and write to file chmod 0600 /etc/wpa_supplicant/wpa_supplicant.conf ノート: 実際に使われるwpa_supplicant.confがwpa_cli(wpa_roamデーモン)が使用する ソケットを作るための'ctrl_interface'の場所を指定することが必要です。 上の設定で使われる/usr/share/doc/wpasupplicant/examples/wpa-roam.confは 健全なデフォルトに設定されています。
この設定ファイルを編集し、既知の無線LANすべてのネットワークブロックを加える必要があります。これがどういう意味かわからない場合は今すぐwpa_supplicant.conf(5)のmanページを読みましょう。
一つ一つの無線LANごとに特別の'id_str'オプションを指定できます。シンプルな文字列を使いましょう。この文字列がネットワークプロファイリングの基礎となります。interfaces(5)ファイルに定義されるロジカルインターフェイスに対応します。無線LANに'id_str'があてがわられない場合、wpa_actionはデフォルトのロジカルインターフェイスをfallbackとして使うものと判断します。どのインターフェイスをfallbackをして使うかは'wpa-default-iface'オプションで指定します。
と読んできましたが、いったいこれはどういうこと?と思うでしょうから、wpa_actionのmanページにでてくる一例を使って、実際の働きを見てみましょう。
wpa_supplicant.confの例
wpa_supplicant.conf example: network={ ssid="foo" key_mgmt=NONE # this id_str will notify /sbin/wpa_action to 'ifup uni' id_str="uni" } network={ ssid="bar" psk=123456789... # this id_str will notify /sbin/wpa_action to 'ifup home_static' id_str="home_static" } network={ ssid="" key_mgmt=NONE # no 'id_str' parameter is given, /sbin/wpa_action will 'ifup default' }
/etc/network/interfacesの例
/etc/network/interfaces example: # the roaming interface MUST use the manual inet method # 'allow-hotplug' or 'auto' ensures the daemon starts automatically allow-hotplug eth1 iface eth1 inet manual wpa-driver wext wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf # no id_str, 'default' is used as the fallback mapping target iface default inet dhcp # id_str="uni" iface uni inet dhcp # id_str="home_static" iface home_static inet static address 192.168.0.20 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1
wpa_supplicant.congの'id_str'オプションを読んでwpa_supplicantがネットワークをid_strに対応させ、ifupによってロジカルインターフェイスが起動され、ifdownによって停止されます。
/sbin/wpa_actionのログが /var/log/wpa_action.logに記録されますから、問題点をリポートとするときにはこのファイルを添付してください。
wpa_supplicantをwpa_cliやwpa_guiで設定する
デフォルトのローミング設定では"netdev"というグループのメンバーは(またはcntl_interfaceパラメータのGROUP=で設定されたグループのメンバーは)wpa_supplicantを対話的なプログラムを使って設定することができます。
# the default ctrl_interface option used in the example file # /usr/share/doc/wpasupplicant/examples/wpa-roam.conf ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
対話的にsupplicantを設定するためにコマンドラインのwpa_cliまたはGUIのand wpa_gui(QT)といったプログラムが用意されています。これらのプログラムを使って無線LANに接続、停止、ネットワークブロックの追加、削除、セキュリティ情報の設定などができます。
ローミングデーモンをwpa_actionでコントロールする
一旦ローミングデーモンがスタートしたら、このデーモンがifupdownをコントロールします。つまり、wpa_supplicantに対応するアクセスポイントが見つかるとwpa_cliがifupを実行し、この接続が停止されるか失われるかすると自動的にifdownを実行します。ローミングデーモンの作動中は直接ifupdownのコマンドを使ってははいけません。代わりに/sbin/wpa_actionを使ってデーモンをストップしたり、再ロードしたりします。たとえばeth1デバイスのローミングデーモンをストップするには:
wpa_action eth1 stop
デーモンの作動中にネットワーク設定を変更したいときはデーモンを停止せず、wpa_supplicant.confファイルを新しい設定に編集し、必要な場合は/etc/network/interfacesも新しいネットワーク設定に合うように('id_str'のリンクなどを)編集し、デーモンを次のコマンドで'再ロード'します:
wpa_action eth1 reload
wpa_actionについての技術的詳細はwpa_action(8)のmanページを読んでください。
ローミングの微細設定
既知の無線LANがいくつか重なり合う状況もあるでしょう。どの無線LANに優先的に接続するか,優先度をwpa_cliまたはwpa_guiで手動設定することができます。wpa_supplicant.confの'priority'オプションで設定します。
ログファイル
ローミングデーモンの行動はすべて /var/log/wpa_action.log に記録されます。次の情報が記録されます:
* 日時
* インターフェイス名とアクションイベント名
* 環境変数の値 (WPA_ID, WPA_ID_STR, WPA_CTRL_DIR)
* 実行されたifupdownコマンド
* wpa_cliステータス(WPA-PSKに基づくステータス, networkステータスの表示と違うことがある)
* bssid
* bssid
* ssid
* id
* id_str
* pairwise_cipher
* group_cipher
* key_mgmt
* wpa_state
* IPアドレス
外部のマッピングスクリプト(guessnetなど)を使う
'id_str'によるロジカルインターフェイスの内部マッピングに加えて、wpa_actionは外部のマッピングスクリプトを使うこともできます。マッピングスクリプトは接続するべきロジカルインターフェイスの名前を出力するスクリプトプログラムです。ifupdownのマッピングメカニズム(man interfacesを参照)から呼び出せるスクリプトであればwpa_actionからも呼び出すことができます。
マッピングスクリプトを呼び出すには/etc/network/interfacesファイルの中のフィジカルローミングデバイスを設定する部門に'wpa-mapping-script スクリプトファイル'という書式の行を入れます。(スクリプトファイルはディレクトリの場所を含めた/から始まる完全なパスで記入します。)
'wpa-map'から始まる行の内容はマッピングスクリプトのstdin入力として送られます。ifupdownは一行のwpa-mapしか読み込まないため、ここには安心して何行追加しても問題ありません。一例として:
iface wlan0 inet manual wpa-driver wext wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf wpa-mapping-script guessnet-ifupdown wpa-map0 home wpa-map1 work wpa-map2 school # ... additional wpa-mapX lines as required
デフォルトではアクセスできる無線LANの'id_str'が用意されていないときに限りマッピングスクリプトが使われますが、'id_str'による内部マッピングを完全に無効化して外部スクリプトのみ使いたい場合は'wpa-mapping-script-priority 1'オプションを加えてデフォルトの振る舞いを抑えます。
マッピングスクリプトがインターフェイス名を出力しないときは'wpa-roam-default-ifce'オプションが指定されている場合をのぞき、フォールバックとしてデフォルトのインターフェイスが使われます。
guessnet-ifupdownを外部マッピングスクリプトに使った上級の例を下に示します。
/etc/network/interfacesと外部マッピング
/etc/network/interfaces with external mapping example: allow-hotplug wlan0 iface wlan0 inet manual wpa-driver wext wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf wpa-roam-default-iface default-wparoam wpa-mapping-script guessnet-ifupdown wpa-map default: default-guessnet wpa-map0 home_static wpa-map1 work_static # school can only be chosen via 'id_str' matching iface school inet dhcp # resolvconf dns-nameservers 11.22.33.44 55.66.77.88 iface home_static inet static address 192.168.0.20 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 test peer address 192.168.0.1 mac 00:01:02:03:04:05 iface work_static inet static address 192.168.3.200 netmask 255.255.255.0 network 192.168.3.0 broadcast 192.168.3.255 gateway 192.168.3.1 test peer address 192.168.3.1 mac 00:01:02:03:04:05 iface default-guessnet inet dhcp iface default-wparoam inet dhcp
この例ではwpa_supplicant.confに見つかった無線LANのネットワークの'id_str'オプションがないとき、wpa_actionはguessnetスクリプトを使ってロジカルインターフェイスを選択します。
'wpa-map'の行はguessnetの入力としてマッチングを試すべきロジカルインターフェイスと、該当するインターフェイスが見つからない場合のデフォルトインターフェイスが送られます。各ロジカルインターフェイスの'test'で始まる行は、ロジカルインターフェイスが今実際に接続しているネットワークに該当するかをguesnetが判断するのに使われます。たとえば、guessnetは接続しているネットワークにIPアドレスが192.168.0.1でMACが00:01:02:03:04:05であるデバイスがあったら、'home_static'をロジカルインターフェイスとして選びます。もしテストがすべて失敗した場合は'default-guessnet'インターフェイスが設定されます。
詳しくはguessnet(8)のmanページを見てください。
4. 困ったとき
無線LANへの接続、結合、認証の問題をデバッグするには、`wpa_cli -i <interface>`を別のシェルからスタートして、 まずデバッグメッセージをすべて表示するよう'level 0'コマンドを実行し、次に`ifup --verbose <interface>`を実行してwpa_supplicantをスタートするスクリプトのデバッグメッセージをすべて表示するようにします。
隠れssids
参考までに(Debian bug)#358137を見てください。隠れssidに結合するにはwpa_supplicant.confファイルのグローバル部門に'ap_scan=1'を、ネットワークブロック部門に'scan_ssid=1'を加えます。マネージドモードを使う場合は次のようにします。
iface eth1 inet dhcp wpa-conf managed wpa-ap-scan 1 wpa-scan-ssid 1 # additional options for your setup
#368770によるとWEPによって保護されているネットワークに結合させるのにかなりの時間がかかることがあります。場合によって、設定ファイルに'ap_scan'の行を加えること(または'wpa-ap-scan 2'の行をinterfacesに加えること)によって関係づけをスピードアップできることがあります。
ap_scanの値を2に設定するにはすべてのネットワークについてkey_mgmtのためのセキュリティポリシーや、ペア、グループ、またはプロトネットワークのポリシーが正確に定義されていなくてはなりません。
5. 安全についての考察
設定ファイルの読み書き許可
PSKその他、ネットワーク関連のの秘匿すべき情報を保護するのは重要なことです。そのため、そのような情報を含んだファイルは所有者以外には読めないように設定します。一例:
chmod 0600 /etc/network/interfaces # 実際のwpa_supplicant.confファイルのパスに編集すること chmod 0600 /etc/wpa_supplicant/wpa_supplicant.conf
デフォルトとして/etc/network/interfacesはだれでも読むことができるため,秘密のキーやパスワードを保存するには適していません。