Linuxで無線LANのアクセスポイントを構築(hostapd+madwifi)
Linuxで無線LANのアクセスポイントを構築
無線LANクライアントがいるのでLinuxサーバに無線アダプタPCカードをつけてアクセスポイントを構築することにした。
やりたいこと
こんなことがやりたいこと
- 安いPCカードをつけるだけにしたい。
- WEPは解読されるのでWPA2対応にする。
- ブリッジ接続させて内部のファイルサーバにアクセスさせたい
無線カード選び
無線カードの選定が一番重要となる。当初何も考えずに動作確認ができていたカードを買ったら、Ad-Hocモード(PCとPC接続のみ)かManageモード(いわゆる子機のようなもの)しかできなかった。調べてみるとその2種類が対応しているのが多い。もともとクライアント用なのでそうなのかもしれないが・・。
Linuxで無線カードを認識動作させるには、Linux用に提供されているドライバを使用したりndiswrapperといったドライバマッピングを使用するなど複数のやり方がある。今回は実績が多いmadwifiを使用する。それと、アクセスポイントモードとWPA2を使用するのでhostapdというデーモンを使用することにした。
hostapdはサポートするドライバが以下に限定されている。
- Host AP driver for Prism2/2.5/3
- madwifi (Atheros ar521x)
- Prism54.org (Prism GT/Duette/Indigo)
- BSD net80211 layer (e.g., Atheros driver) (FreeBSD 6-CURRENT)
この中で手に入り安いのはmadwifiとPrismぐらい。これらは無線LANで使用しているチップセットだ。チップセットはgoogleで買おうとしている製品コードで検索すれば情報が見つかるかもしれない。通常メーカページでは公開していなものが多い。
お勧めはmadwifiを使用している物。madwifiは実績が多いらしく情報も豊富にある。
今回はI・OデータのWN-G54/CBLを使用することにした。量販店で2900円くらいで売っている(2008年5月現在)。
無線LANカードの認識
ドライバ(madwifi)のインストール
madwifiカーネルモジュールを作成しインストールする必要がある。madwifiはaptではバイナリパッケージが無くソースになる為、modlue-assistantを使用してmadwifiのコンパイルとインストールを行う。
sudo apt-get install module-assistant madwifi-source
module-assistantでコンパイルとインストール
m-a prepare m-a a-i madwifi
カードの挿入
PCカードを挿入して認識するか確認。以下のメッセージがログに出力された
PCI: Enabling device 0000:01:00.0 (0000 -> 0002) ACPI: PCI Interrupt 0000:01:00.0[A] -> Link [LNKA] -> GSI 11 (level, low) -> IRQ 11 wifi0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps wifi0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps wifi0: H/W encryption support: WEP AES AES_CCM TKIP
ついでlspciで確認する
Ethernet controller: Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01)
AR5212なのでOK
とりあえずWEPでアクセスポイント
稼動確認したいので簡単なWEPを使用します。WEPは1分で解読できてしまうので、この状態で使用し続けることは推奨しません。
wireless-toolsで設定
とりあえず、ユーティリティのインストール
apt-get install wireless-tools
カード挿入時点でモジュールを読み込まれているかもしれないので、モジュールの再読み込み
modprobe -r ath-pci modprobe ath-pci autocreate=ap
madwifiを使用した場合はwifi0というベースデバイスが作成されて、その上に仮想アクセスポイントであるath0が作成される。よって設定はすべてath0に対して行うことになる。上記のmodprobe ath-pci autocreate=apはアクセスポイント(ap)を使用するという意味になる。その他にもsta,wds,adhoc,ahdemo,monitorなどが設定できる。
WEP設定やIPを設定する
iwconfig ath0 essid testap iwconfig ath0 key s:1234567890987 ifconfig ath0 172.16.1.1 netmask 255.255.0.0 up
これで稼動しているはずです。クライアントには動的IPは設定してないので個別に設定します。
クライアント接続
Windowsから試してみました。ワイヤレスのユーティリティで設定したアクセスポイントがあると思うので繋げてみてください。デフォルトではDHCPなので、固定IPで接続してみます。
WPAでアクセスポイント
ここからWPAを使用したアクセスポイントにします。ネットワークもブリッジ化してDHCPで割り振りも行います。DHCPの基本設定はできていることにします。
インストール
いつもので。ブリッジ化しないのならbridge-utilsはいりません。
apt-get install hostapd wpasupplicant bridge-utils
モジュール設定
リブートすると無効になってしまうのでmodprobeで手動で読み込みをしていたath-pciを設定ファイルに定義します。/etc/modprobe.d/madwifiというファイルを新規で作成します。
alias ath0 ath_pci options ath_pci countrycode=392 autocreate=ap
contorycodeってのは明示的に指定した方がいいみたい。カードによっては適当らしい
ネットワークのブリッジ化
Debianでは/etc/network/interfaceにブリッジ設定を記述します。
auto lo
iface lo inet loopback
auto ath0
iface ath0 inet manual
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 172.16.0.2
netmask 255.255.255.0
network 172.16.0.0
broadcast 172.16.0.255
gateway 172.16.0.1
bridge_ports eth0 ath0
pre-up ifup eth0
pre-up ifup ath0
post-down ifdown eth0
post-down ifdown ath0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
当環境ではOpenVPNも使用しているので、両方を使用する場合にはこんな感じ。
auto lo
iface lo inet loopback
auto ath0
iface ath0 inet manual
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 172.16.0.2
netmask 255.255.255.0
network 172.16.0.0
broadcast 172.16.0.255
gateway 172.16.0.1
bridge_ports eth0 tap0 ath0
pre-up ifup eth0
pre-up ifup ath0
pre-up openvpn --mktun --dev tap0
post-down openvpn --rmtun --dev tap0
post-down ifdown eth0
post-down ifdown ath0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
hostapdの設定
hostapdは設定項目も多くかなり細かく設定が可能で、全部把握してないです。なので今回必要な部分だけ設定しました。
interface=ath0 bridge=br0 driver=madwifi ssid=YourSSID wpa=3 wpa_psk=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP
キーが全てAになっているが、これは以下の乱数発生を使用して設定した方がいいだろう。wpa=3はWPA2を使用することになっているWAPがよければwpa=1にする。
perl -e 'for($i=0;$i<64;$i++) { printf "%x", rand(16);};printf "\n";'
また、キーフレーズにしたければ以下のようにする。セキュリティ的には下がるけど。
wpa_passphrase=1234567890
デフォルトではサービスは起動しない設定になっているので、設定変更(/etc/default/hostapd)
RUN_DAEMON="yes" DAEMON_CONF="/etc/hostapd/hostapd.conf" DAEMON_OPTS="-d"
ブリッジにした場合にはパケットをフォワードしなくちゃいけないのでファイルを設定(/etc/sysctl.conf)。iptablesでフィルタリングしているならACCEPTする設定を入れる必要がある。
net.ipv4.conf.default.forwarding=1
これで設定は終了。後はサービスを起動
/etc/init.d/hostapd start
クライアント接続
WindowsXPはデフォルトではWAP2は使用できなく、Windows XP 用の更新プログラム (KB893357)を適用する必要がある。後はワイヤレスウィザードに従って設定すればよいだろう。設定といっても対象のAPを選択してキーを入力するぐらいなので、あえてここでは詳細は説明しない。
エラー対策
2008年5月時点でのstableはetchでhostapdは0.5.5-3.1なのだが、このまま使うと以下のエラーが出力されれる。けど、普通に使う分には問題なかった。気になるのでとりあえず直すことにした。
hostapdioctl[IEEE80211_IOCTL_SETMLME]: Invalid argument
いろいろ探した結果0.5.7に上げるとどうやら、うまくいくとのこと。さっそく試してみた。
ソースダウンロード
以下のサイトから安定版をダウンロード
http://hostap.epitest.fi/hostapd/
現時点は以下だった。
wget http://hostap.epitest.fi/releases/hostapd-0.5.10.tar.gz
コンパイル
コンパイルの前にどうやらコンフィグファイルを作成しなくちゃいけないみたい
cp defconfig .config
環境に合わせて修正するみたいなので、今回はここを修正した。
#CONFIG_DRIVER_HOSTAP=y コメント CONFIG_DRIVER_MADWIFI=y コメントアウト CFLAGS += -I/usr/src/modules/madwifi/
opensslのヘッダとか使うので、追加インスト
apt-get install libssl-dev
後は、makeしてmake installで終了。/usr/local/bin/にhostapdがインストされる。
テスト起動
デバックオプションを有効にしてコマンド起動して、動作をみる
/usr/local/bin/hostapd -dd /etc/hostapd/hostapd.conf
起動スクリプトを修正
自動起動させる為に起動スクリプトを書き換える
DAEMON=/usr/local/bin/hostapd
updateされたら、また修正しないと。