言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

メッシュネットワーク B.A.T.M.A.N. を試す

まず、BATMAN がどのような物かについて簡単にご説明します。BATMAN とは、パソコンに付いている無線 LAN インタフェースだけを使い、無線ルータ無しで大きなネットワークを作る仕組みです。無線 LAN インタフェースには、元々アドホックモードという、隣の端末と直接通信する仕組みがあるのですが、直接電波が届く狭い範囲でしか使う事が出来ません。BATMAN を使うと、直接電波が届かなくても、中間地点に端末があればバケツリレー式にデータを運び、遠い距離の端末同士が通信出来るようになります。これをメッシュネットワークと呼びます。

BATMAN は既存のネットワーク上に仮想的にネットワークを構築します。メッシュネットワークがどんなに複雑でもユーザーからは一つの LAN ネットワークのように見えます。BATMAN 自体はそれ以上の複雑なサービスを提供していませんが、既存の DHCPDNS がそのまま使え、ゲートウェイを通してインターネット接続する事も出来ます。

この設計は、必要最低限の所だけに絞り、既存のシステムと組み合わす事の出来る大変優れたデザインですが、実際これを災害時に使おうとするとまだまだ足りない点が沢山ある事に気がつくと思います。例えば DHCPDNS には集中管理されたサーバが必要になるので、ネットワークが分断された状況では既存のサービスは使えません。BATMANIPv6 アドレスさえ分かれば端末がどんな繋がり方をしていてもパケットを届ける機能がありまが、しかしその上で動作するサービスも分散ネットワークで動作するようにデザインしないと、サービスを探したり個人を特定してメッセージを送る事が出来ません。この辺りを今後調べたいと思います。

残りは退屈な作業ログです。Ubuntu 11.04 で B.A.T.M.A.N. を試します。

インストール

sudo apt-get install batctl

質問には y と答える。エラーが出るけど無視して下さい(次の Ubuntu では直っているらしい)。

ifconfig で無線ネットワークデバイスの名前を調べておく(wlan0 や eth1 等)、以下 eth1 で説明します。

BATMAN の起動

batman-adv カーネルモジュールの読み込み。

sudo modprobe batman-adv

GUI のネットワークマネージャを停止。マシンによって停止しないと手動設定が動かない時がある。

sudo service network-manager stop

アドホックネットワーク設定。昨日 http://d.hatena.ne.jp/propella/20110522/p1 とだいたい同じ

ifconfig eth1 down # 念のため停止
ifconfig eth1 mtu 1524 # batman 自体が 24 バイト使うので調整するらしい。
iwconfig eth1 mode ad-hoc essid batman # batman という SSID のアドホックネットワークを作成

BATMAN ネットワークの設定。

sudo batctl if add eth1 # eth1 上に batman ネットワークを作成
sudo ifconfig eth1 up # アドホックネットワーク起動
sudo ifconfig bat0 up # batman ネットワーク起動

これをネットワークに参加するマシンごとに行います。

BATMAN の実験

ifconfig でどんなネットワークが出来たのか見てみます。

eth1      Link encap:Ethernet  HWaddr 00:04:23:50:ba:b5  
          inet6 addr: fe80::204:23ff:fe50:bab5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1524  Metric:1
          RX packets:11700 errors:24 dropped:24 overruns:0 frame:0
          TX packets:9920 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1506134 (1.5 MB)  TX bytes:559575 (559.5 KB)
          Interrupt:11 Base address:0x6000 Memory:c0200000-c0200fff 

bat0      Link encap:Ethernet  HWaddr ca:90:2a:c8:b7:c1  
          inet6 addr: fe80::c890:2aff:fec8:b7c1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72 errors:0 dropped:0 overruns:0 frame:0
          TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:11305 (11.3 KB)  TX bytes:11542 (11.5 KB)

まず最初の eth1 が、最初から備わっているアドホックネットワークです。BATMAN は既存のネットワーク上に仮想的にメッシュネットワークを構築します。BATMAN は単にメッシュのルーティングだけを行い、ネットワークの物理層は問わないので、無線 LAN じゃなくても有線でも Bluetooth でも何でも使えます。

BATMAN が起動すると、仮装インタフェース bat0 を作成し、IPv6 アドレスを割り当てます。出来上がったメッシュネットワークは、ユーザーから見ると一つの LAN のように見えます。パソコンをケーブルでハブに繋いだだけのような状態です。これだけではドメイン名も IPv4 アドレスも無いのでなかなかどう使うのか想像しづらいですが、例えば例のマシンに外から BATMAN ネットワークを使ってログインするには以下のようにします(IPv6 アドレスに ssh するにはインタフェース名を指定する必要があります)。

ssh fe80::c890:2aff:fec8:b7c1%bat0

私のアパートは小さくて Linux マシンも二台しかないので意味のある実験が出来ませんが、お家が広くて三台の Linux マシンを持っている人は是非自分でも試してみて下さい。