Linuxでワイヤレス・アクセスポイントを構築する

カスタム・ソリューションで自由・柔軟なシステム構築が可能に・・ついでに勉強の機会にも

独自の管理ソフトウェアを書いたり変更したりできるようになるのが目標なら、ワイヤレス・アクセスポイントをカスタム構築するのがお勧めです。ソフトウェア的、ハードウェア的に考慮すべき問題点を含めて、Linuxでワイヤレス・ブリッジを構築する上での課題について見て行きましょう。

Peter Seebach, Writer, Freelance

Author photoPeter Seebachは、たしかこの辺にFileメニューがあったはずだと思っています。Peterはコンピューターを使い始めてすぐに、プログラミングを始めましたが、いまだにGUIを目新しく感じています。



2003年 7月 22日

この記事では、Linuxで実行するワイヤレス・アクセスポイントを構築していく過程を、順を追って説明していきます。ただし全コードを説明したり、細かな中間段階や、ハードウェアの詳細すべてを説明したりはしません。そこまでしていると一冊本が書けるほどになってしまいますし、その本が出るころには内容も古くなってしまいかねないからです。目標は、実際作業を進めようとすると、どんなところで悩むものなのか、どんな落とし穴があり得るのかという点です。ここではブリッジとして動作するアクセスポイントを構築します。ごく単純なもので、ワイヤレス・ネットワークとローカルのイーサーネットとの間でパケットを転送するものです。これでワイヤレス機器を簡単にブートしたり、既存のネットワークに接続したりすることが(新たな設定も、特別なルーティングも無しに)できるようになります。

なぜそんなことをするのか?

「できることだったら、試してみたら?」と言う方が適当なのかもしれません。店頭に並んでいるものを買い込んだ方が、カスタムで作るよりはずっと安いのは明らかです。私が費やした数時間は別にして、この記事を書くために買い込んだ諸々は400ドルにもなります。それでも自分独自のワイヤレス・アクセスポイントを構築することには2つの理由があるからです。

1番目の理由は柔軟性とカスタム化が容易だと言うことです。ファイアー・ウォールが欲しいですか?簡単です。カスタム・ルーティングは?NATは?どれも簡単に設定できます。カスタムでWebベースの設定ですか?CGIスクリプトで30分もあれば出来ます。お好みならトラフィックのグラフも追加できます。店頭に並んでいるようなものではウィンドウズ専用設定になっているかも知れず、ssh を追加したり設定を変えたり出来ないかもしれません。それにWebサーバーでwebログを走らせたりも出来ないかもしれません。もし何か問題があっても「ファームウェア・アップグレード」を待つしかなく、しかもそのアップグレードは自分が困っている問題を解決してくれるとは限らないのです。

2番目の理由は、多分1番目の理由よりも実は説得力があるのでは、と思っているのですが、面白いと言うことです。組み込みのLinuxシステムを走らせる上で突き当たるような問題を学ぶには、自分で作ってみるのが良いのです。これをホビーイストのテスト・プロジェクトと思っておき、なにかすごいアプリでも考えついたら一儲けできるかも、とでも思ってみれば良いのではないでしょうか。


動作環境

私がこのプロジェクトに使ったのはSoekris net4521組み込みシステムです。CPUは133Mhz 486クラスのプロセッサで、十分すぎるほどのパワーがあります。OSはコンパクト・フラッシュ(CF)カードに格納されています。ワイヤレス・アダプターが必要だったので、Intersil Prism 2チップセット使用の、安いLinkSys WPC11を使っています。同等品でも問題なく動くはずです。

全体をちゃんと動かすには、CFカードのフォーマットや設定用に、これとは「別の」Linux ボックスも必要になります。ラップトップが最高ですが、Linuxで動くCFリーダーがあれば、ラップトップでなくてもUSBポート付きのマシンなら何でも動くはずです。

ソフトウェアについては、既存品でほとんどそのままで動くものがあります。または古いインストールCDのセットで、初めからひたすら書くという手もあります。この記事では、私はPebble Linuxで始めました。そのままでも私が思っていることをするのに近いことが可能な、小さなディストリビューションだからです。それでも、設定では楽しめましたし、カスタムのフィーチャーもちょっと追加する羽目になってしまいました。ここから先は、読者がLinuxを使う上での基本的な経験、ファイルをエディットしたり、コマンドを走らせたり、簡単なネットワークの設定をしたりという経験があると言う前提でお話しします。読者にそうした経験が無いのでしたら、お隣でおなじみのLinuxハッカーに安いピザでもご馳走すれば、このプロジェクトに手を貸してくれるでしょう。ピザにエクストラ・チーズでも追加してやれば、どういう動作をしているかまで説明してくれることでしょう。

このプロジェクトでは802.11bを使いました。アップル・オリジナルのAirportネットワークで使われ、また一番広く使われているワイヤレスのスタンダードです。理論的な帯域幅は11Mbps、まあ遅いイーサーネットよりはちょっと早いくらい、実際の帯域幅は安物のブロードバンド並みというところでしょう。受信範囲は変動しますが、普通は裏庭(アメリカでの裏庭)とか隣のアパートには十分届きます。


プロジェクト・プラン

この計画はいくつかのフェーズから成り、各フェーズの終わりでは明確にテストができ、結果も確認できます。各フェーズはいろいろいじっても1時間以内でできるはずです。

そのフェーズは

  • 初期設定: 組み込みシステムがブートし、ログイン・プロンプトが出るようになります。
  • ネットワーク設定: ネットワークが動くようになり、マシンがアクセスポイントとして実際に使えるようになります。
  • 微調整: マシン機能の改造・変更への、長い道のりの始まりです。

初期設定

組み込みシステムを入手します。私はSoekris Net4521を使いましたが、他のシステム、Technologic TS-5500などでも同じようなものでしょう。どうにもならなければ、古いラップトップと言う手もあります。とりあえず大事なのはPCMCIAスロットと、そこに入るディスクです。ディスクは他のマシンから持ってきたもので、フォーマット・再設定して構わないものとします。組み込みシステムでは普通、CFディスクをプライマリ・ドライブとして使います。

ホストシステムも必要になります。Linuxが走るラップトップか、CFドライブをサポートしているデスクトップです。私はちょっとひねくれているので、USBのCFドライブがついて組み込みシステムが既にインストールされたものを使いましたが、どれでも大して変わりません。

私は128MBのCFカードを使いました。大きすぎると思うかもしれません。実際大きすぎるのですが、空きスペースがあるのはいつも便利なものです。問題のディストリビューション(Pebble Linux)は、64MBのカードでも十分収まります。空きのスペースは後でおまけを入れるのに使いましょう。

ハードウェアの用意ができたら、ホストシステムをブートします。128MBのCFカードが入ったカードリーダーを差し込むと、sdaとして見えるはずです。これを次のコマンドでテストしてみてください。

fdisk /dev/sda

プロンプトが出るはずです。

さて、ディスク・パーティションをかけます。パーティション・テーブルを見るにはキーボードでpキーを押します。このカードが今まで使われたことがないものだったら、DOSパーティションが一つだけ見えるはずです。dキーを押し、プロンプトが出たらパーティション番号を入力してそのパーティションを消します。nコマンドで新しいパーティションを切ります。デフォルトの範囲で構わないはずです。aキーを入力してパーティションをアクティブにし、プロンプトが出たらパーティション番号を入力します。ここでwキーを押します。Linuxの単一パーティションで、ドライブがパーティションできました。

ラップトップでPCMCIA-to-CFアダプターを使っている場合には、そのカードは多分sdではなく、hdドライバを使って現れると思います。構いません。適当な名前をつけます。

次にディスクをフォーマットします。コマンドはmke2fs /dev/sda1です。フォーマットができたらマウントします。

さてPebbleのディストリビューションを解凍します。Pebbleのインストーラーは、解凍は別のディスク上で行い、その後新しいディスクにコピーされると想定しています。インストールしようとしているターゲットのマシンに運悪く別のディスクが無い場合には、インストーラーを編集する必要があります。まず圧縮されたパッケージをドライブに解凍し、そのドライブ上でローカルにスクリプトを更新します。推奨されているディスク以外のディスクを使用している場合には、そのドライブに対する新しいlilo.confファイルを作る必要があります。hdcのlilo.confファイルをコピーし、デバイス名を置き換えます。手でやってしまうつもりなら、liloを走らせ、sshホストキーを作り、ルート・パスワードを設定します。多分その他にも何か、カーネルのモジュールを設定する必要があるでしょう。いじることになりそうなセットが/etc/modules.*に用意されています。例えば/etc/modules.net4521はSoekris Net4521のシステムで使うモジュールのセットです。

ここで注意しなければいけないのは、インストールしようとしているディスクが、ターゲットとしているシステムで想定しているディスクとは違うと言う点です。用意されているliloコンフィグレーションファイルにはこれが反映されています。ディスクは指定されていますが次に「bios 0x80」を指定していて、そのディスクが新しいシステムのプライマリー・ディスクだとliloに対して警告しています。同じように新しいfstabでは、確実に正しいディスクを指すようしておく必要があります。普通の組込システムではそれは/dev/hda1であり、/dev/sda1ではありません。最後に、inittabで正しくコンソール・ポートを設定しておく必要があります。Soekrisのシステムではデフォルトのコンソール・スピードは19200kbps で、Pebble Linuxデフォルトの9600ではありません。

これが全部できあがると、ターゲットとするシステムでなにごとも無くCFカードからブートできるはずです。ログイン・プロンプトが出たらログインしてざっと見てみます。Pebble Linuxには有益なスクリプトがいくつか用意されており、ルートファイルシステムをリード・オンリー、リード/ライトいずれかでマウントし直せるようになっています。デフォルトはリード・オンリーで、何度も電源を入れ直す羽目になるようなシステムには適切と言えます。

DHCPネットワークにつながっていれば、既にシステムのプライマリー・イーサーネット・ポートにIPアドレスが割り振られているはずです。(私はSoekris Net4521でケーブルをeth0に接続しました。)これで次のステップでの仕事が少し楽になります。

ネットワーク設定

アクセスポイントに関して本当に欲しいのは、簡単(単純な)なブリッジです。あるネットワークからのパケットが他のネットワークに現れるようになる、なにも特別なものではないのです。「我らが装置(ここで作ろうとしているアクセスポイント)」はルーターでもなければDHCPサーバーでも何でもありません。ただのブリッジです。もちろんDHCPサーバーとして設定したり、他のいろいろな用途にも設定はできますが、ブリッジとして使うのが簡単なのです。ブリッジは単にケーブルから入ってきたパケットを無線路に送り出し、逆に無線路からのパケットをケーブルに送り出します。こうすることでワイヤレス・デバイスは、物理的なネットワークに単にくっついているだけのもの、と見えるようになるのです。

Pebble LinuxはDebianを基にしています。ということは/etc/network/interfacesをいじらなければいけないと言うことです。Googleでちょっと探してみれば適当に使えるサンプルのコマンド・セットが見つかるはずです。

リスト1. ブリッジを構築する
   iface br0 inet dhcp
     bridge_ports eth0 wlan0
     pre-up ifconfig eth0 0.0.0.0 up
     pre-up ifconfig wlan0 0.0.0.0 up
     pre-up iwconfig wlan0 mode master
     pre-up brctl addbr br0
     pre-up brctl addif eth0
     pre-up brctl addif wlan0
     post-down ifconfig eth0 0.0.0.0 down
     post-down ifconfig wlan0 0.0.0.0 down
     post-down brctl delif br0 eth0
     post-down brctl delif br0 wlan0
     post-down brctl delbr br0

ちょっと尻込みしたくなるかもしれませんが、そんなに怖いものではありません。インターフェースそのものはブリッジ(br0)であり、設定にdhcpを使い、eth0(1番目のイーサーネット)とwlan0(我らのワイヤレスカード)の間をブリッジします。インターフェースが現れる前(pre-up)に走るべきコマンド一式があり、インターフェースが終わった後(post-down)に走るべき別のコマンド一式があると言うことです。

ここではブリッジでつなげる2つのインターフェースを取り上げます。我らのワイヤレスカードを「マスター」モード(これをアクセスポイントにします)にし、次にブリッジ・インターフェースを作り、2つのインターフェースをこのブリッジ・インターフェースに付加します。それができるとdhcp 修飾子により、「我らが装置」は自分でIPアドレスを取得するようになりますが、実はそれはオプションなのです。ブリッジはパケットをインターフェースからインターフェースに加工無く転送するものなので、自分専用のIPアドレスを持つ必要はありません。ただ、IPアドレスがあれば、それをネットワークからアクセスできるようになります。安全性からはちょっと心配ですが、デモに使うには面白いと思います。

インターフェースを閉じるときにはイーサーネット・ポートを閉じ、ブリッジからそのイーサーネット・ポートを除き、そしてブリッジ・インターフェースを除きます。イーサーネット・ポート追加する前にブリッジ・インターフェースを生成する必要があったのです。ですからブリッジ・インターフェースを削除する前にイーサーネット・ポートを除きます。

この手順はインターフェースが何か他の機構によって設定されることは無い、というのが前提です。ですからwlan0とかeth0に関する他の行は注釈行にしてしまいたいと思います。ただし、ワイヤレス・カードにESSID(ベース・ステーション名)を設定するのに/etc/pcmcia/hostap_cs.confを使います。これはbr0のpre-upスクリプトで行えます。但し、私の使ったカードではEESIDとWEPキーを同時期に設定すると、しばらくの間カードがハングしてしまいます。(どのWEPキーかって?すぐ後で説明します)

「auto br0」を/etc/network/interfacesに入れさえすればインターフェースが自動的に設定されると思うかもしれません。残念ながらワイヤレスカードがPCMCIAカードの場合、そのインターフェースは、ネットワーク・インターフェースが普通にブートしたときにはまだ使えるようにはなっていません。ですから後で、ブートのところですることにします。/etc/rc2.dに「S99local.」というファイルを作ります。そのファイルに次のような行を追加します。

#!/bin/sh
ifup --force -v br0

どちらのオプションも実は、オプションなのです。インターフェースは今生きているわけではないので、forceオプションは要らないはずです。-vはコンフィグレーションの間に走っているコマンドを見ることができるように、入れてあります。

では変更を保存してリブートします。すべて順調なら、今しがた作ったワイヤレス・ネットワーク(ネットワークID「test」)に接続でき、DHCPクライアントが走り、DHCPサーバーからDHCPサービスを受けられるはずです。(DHCPサーバーが無ければ、有線ネットワークで使っているnetblockの静的なIPアドレスでも全く構いません。)

もちろんここには重大な欠点があります。WEP(Wired Equivalent Privacy)キーを使っていないと言うことです。理論的にはWEPを使うことでネットワークが安全になるはずですが、現実には侵入者の進入スピードをちょっと遅らせるくらいのものです。不特定で通りがかりの人がネットワークにアクセスしてくることを気にしなければ、WEP無しでも大して問題にはなりません。ただ、もし気になる人がいると困るので、WEPキーを設定したいと思います。これを/etc/network/interfaces にあるbr0の設定のiwconfig行を次のように変えることで行います。

pre-up iwconfig wlan0 mode master key s:blahblahblah1

これはキーを13文字(104ビット)の文字列として規定します。ネットワーク・カードによっては104ビットのキーをサポートしていません。その場合には5文字(40ビット)キーを使います。これをすることでワイヤレス・カードがハングするようなら、/etc/network/interfacesの、ワイヤレス・キーを設定する行の前に「pre-up sleep 5」を追加してみてください。

この時点でWEPを使い、リード・オンリーのファイルシステムを持ったワイヤレス・アクセスポイントができています。ですから切り離し、再接続すると(商業ベースのものほど速くないでしょうが)ファイルを喪失したり破損させたりすることも無く、アクセスポイントとして現れてきます。

微調整

ここからが本当に面白いところです。「我らが装置」はあるゆる用途に使うことができます。その典型的な例はWebサーバーです。報道メディアがよく取り上げるWebサーバーは、ランプがたくさん付いて、うなり声をあげるような巨大な水冷マシンですが、実際には読者もご存知の通り、ディスク・スペースのほんの数メガバイトを使うだけであり、システムにもほとんど負担をかけないものです。このセクションでは、apt-getを使用し、Webサーバーを含めていくつかのパッケージを追加します。その上で新しいローカルWebサーバーでCGIスクリプトを実行させてみます。

では、カレントのパッケージ・リストの入手から始めましょう。/usr/local/sbin/remountrwを実行すると、ローカル・メディアに書き込みアクセスできるようになります。そして、apt-get updateを実行すると、かなりの量のデータがダウンロードされます(これが128MBのCFカードを必要とした理由です)。これでDebianの、このバージョン用のパッケージ・リストを入手することができます。

次はApache Webサーバーをインストールしますが、これには若干の考慮が必要です。つまりログファイル用のスペースを用意し、一時ディスクのリード/ライト・スペースに配置する必要があるということです。まず、/var/log/apacheという名前の新しいディレクトリーを作成します。/var/logは、実際は/rw/var/logへのシンボリック・リンクですので、ログファイルは正しい場所に作成されることになります。次に、apt-get install apacheを実行します。プロンプトが表示され、改行キーを押し、を数回繰り返せばあら不思議!Webサーバーの出来上がりです。早速試してみましょう。「我らが装置」にはなにかしらIPアドレスが割り振られているはずですが、このWebサーバーはそのIPアドレスになっていて、設定はDebianが使用するデフォルトでのApacheの設定になっています。

残念なことに、/rwファイルシステムはリブートの度に破棄されます。次回もログファイルを正しく作成されるようにしたい場合は/rwファイルシステムのテンプレート、つまり/roディレクトリーを変更しなければなりません。/ro/var/logに、apacheというディレクトリーを作成してください。これでリブートすれば、Webサーバーが動いているはずです。私のシステムでは、これで63MBが消費されました。64MBのCFカードに収めるにはちょっと大きすぎるようです。

次は?CGIスクリプトはどうでしょう?/usr/lib/cgi-binに移動してください。スクリプトを作成するのに、ファイルシステムをリード/ライトでマウントする必要があります。では、hello.cgiから始めましょう。

リスト2.Hello wireless world!
   #!/usr/bin/perl -w
   print <<EOH;
   Content-Type: text/plain
   Hello, world!
   EOH

これを保存し、実行可能にして(モード755)、Webサーバーの/cgi-bin/hello.cgiを見てみてください。

他には?その気になれば何でもできます。WebサーバーとPerlがあれば、もうなんでも思いのままです。次はstats.cgiという別のスクリプトを追加してみましょう。

リスト3. 統計を取る
   #!/bin/sh
   cat <<EOF
   Content-Type: text/html
   <HTML><HEAD><TITLE>WAP Stats</TITLE></HEAD>
   <BODY>
   <H2>Stats:</H2>
   <PRE>
   EOF
   ifconfig -a cat <<EOF
   </PRE>
   </BODY>
   </HTML>
   EOF

見よ!トラフィック・レポートが・・・。フォーマットがおかしい?いいじゃないですか。30秒で書いたんですから。

うーん、設定を見直したくなったらどうでしょう?そうしたらfile.cgiを実行します。

リスト4.ちょっとチェック
   #!/bin/sh
   cat <<EOF
   Content-Type: text/plain
   EOF
   cat $1

これをセキュリティ・ホールがあるなどと言うのは、はなはだ的外れです。これは我らがワイヤレス・アクセスポイントが狂気的な柔軟性を示すデモなのです。実際私はシステムのスクリプトを使わず、このスクリプトを使用しましたが、scpを使うよりも簡単でした。

ここまでの例ではあまり細かく説明していません。しかし、CGIプログラミングの詳細を取り上げるのはこの記事の範囲外ですし、重要なのは始めるに当たってのヒントをいくつか挙げることだからです。もちろん実際のデータファイルには何か二次的なストレージが必要かもしれませんが、こんなシステムでもWebログのホストはできますし、もちろんNFSでリモート・ディスクをマウントすることもできるわけです。

使用した組み込みシステム(Soekris Net4521)には、上記設定を終わった時点でメモリは36MB以上、ディスクスペースには約50MBの空きがあります。これだけスペースがあれば結構入りますし、ちょっとしたサービスを色々実行するには十分なCPU時間も残っています。


まとめ

このプロジェクトは読者が最初に想像されていたよりもずっと簡単だと思います。要点としては他の人が作ったシステムの上に構築する、と言う点です。私はPebbleを使いましたが、これはDebianの上にできています。このプロジェクトで一番難しいところは既に出来上がっているのです。例えば、リード・オンリーのファイルシステムからブートするようにシステムを組むには、テストやリブートに結構な手間がかかるものです。読者の中に、ブート中に書き換えられるべきファイルはどれか正確に覚えている人は何人いるでしょう。例えば、/etc/network/ifstateは実際、システムが書き換えます。ログファイルなら簡単に覚えられますが、他のファイルはそう簡単には覚えられません。同じように、Apacheのインストールに際しての最低限の依存性を満足させた上でどうインストールすれば良いかは、Debianのパッケージが処理してくれます。

オープンソースのおかげで、何日もあるいは何週間もかかっていたような作業が、ある日の午後の暇つぶしでできるようになりました。ホビーイストのプロジェクトが現実的なものになったと同時に、良質なプロトタイプ(原型)もできるようになったわけです。読者が何かの組み込みシステムでアクセスポイントを作ってみたいと思うのでしたら、このプロジェクトはソフトウェアの設定をいじり回すのにちょうど良いでしょうし、最初のハードウェア・サンプルができてくるまでに十分いじり回す時間の余裕があるでしょう。

参考文献

  • このプロジェクトでは、カスタムの組み込みシステム(Soekris Net4521)を使用しました。
  • 802.11b Tips, Tricks, and Factsで、O'Reilly社のネットワーク に関する記事をご覧になれます。
  • IEEE 802 LAN/MAN Standards CommitteeのWebページには、関連するプロトコルや規格について、どこよりも詳細に書かれています。
  • 発明志向の方でしたら、TelecomWriting.comでwireful通信、wireless通信、ネットワークの歴史の背景を調べてみてください。
  • developerWorks のLinuxゾーンには、Linux開発に関する情報が豊富にあります。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=231484
ArticleTitle=Linuxでワイヤレス・アクセスポイントを構築する
publish-date=07222003