batman-advを使った安全な無線メッシュネットワーク(WPA2-PSK編)
はじめに
アドホックネットワークや無線メッシュネットワークを扱うウェブ上の記事は学術的な理論について解説したものが多く,具体的な構築・実装方法について解説された記事はあまり見当たりません. また,構築方法を解説するエントリが見つかっても, そこで構築されるネットワークの多くは,セキュリティに関する機能を持たないものであることが多いと感じます.
研究で無線メッシュネットワークをいろいろいじっていたので ,セキュリティ機能を有する無線メッシュネットワークの構築方法を解説したいと思います. メッシュネットワークのルーティングにはbatman-advを使いました.
(比較的)安全な無線メッシュネットワークとは?
本エントリでは,「安全な無線メッシュネットワーク」として,以下の機能を持つ無線メッシュネットワークを想定します.
- 利用者端末の認証機能
- メッシュノードの認証機能
- 無線通信区間の暗号化
ここで,通信区間を暗号化する方法として,2つの方式が考えられます.
- エンドツーエンドの暗号化:各メッシュノード↔ゲートウェイ(無線メッシュネットワークと外部ネットワークの接続点)間で鍵を共有して暗号化する方法.
- ホップバイホップの暗号化:各メッシュノード↔隣接ノード間で鍵を共有して暗号化する方法.
本エントリでは,後者の方法を用いて通信区間を暗号化することを考えたいと思います.
利用者端末やメッシュノードを認証する方法としては,IEEE 802.1X方式も考えられますが, (面倒なので)お手軽なWPA2-PSK方式を用います.
WPA2-PSKでは,認証する側とされる側で共有鍵を事前に設定しておき,その鍵をもとにして, 通信が暗号化されることになります.
メッシュノードの作成
用意するもの
メッシュノードとして,以下の要件を満たす計算機を用意します.
- Linux(kernel 2.6.38~)が動作すること.これ以降は,Debian系のディストリビューションを想定してメッシュノードの作成方法を解説します.
- 無線NICを2つ以上有すること. 利用者端末用のAPとなる場合,ゲートウェイとなる場合については,それぞれ追加のNICが必要です.
無線NICが足りない場合は適宜USBの無線NICを足してください. 例:http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm2/
ソフトウェアのインストールとbatman-advのロード
用意した計算機にOSをインストールした後,以下のソフトウェアをapt-getなどを用いてインストールします.
- hostapd:アクセスポイントとなるソフトウェア.サプリカントから接続を受けます.また,今回はWPA2-PSKで利用者とメッシュノードを認証します.
- wpa_supplicant:サプリカントとなるソフトウェア.APに接続します.
- bridge-utils:仮想ブリッジソフトウェア
- batctl:batman-advのコマンドラインから設定するツール
# modprobe batman-adv
起動時に自動で読み込まれるように
/etc/modules
にbatman-adv
と書き込んでおくと良いでしょう.
ネットワークの設定
Debianでは,/etc/network/interfacesに設定を書き込みます. また,以下に示すノードの種類に応じてネットワークに関する設定を行います.
- 普通のノード: 無線メッシュネットワークを構成するだけのノード
- 利用者端末用AP: 無線メッシュネットワークを構成する機能を持ち,メッシュルーティング機能を持たない端末から接続されるAP
- ゲートウェイノード: 無線メッシュネットワークを構成する機能を持ち,外部ネットワークとの接続点となるノード
ノードごとに/etc/network/interfacesを以下に記載します.
普通のノード
普通のノードでは,bat0にIPアドレスを割り当て,bat0におけるルーティングをbatman-advが制御します. イメージ的にはbat0がL2のスイッチになるといった感じでしょうか.
NICの構成図
bat0 (<- IPアドレス) / \ wlan0 wlan1
/etc/network/interfaces
auto lo iface lo inet loopback auto bat0 iface bat0 inet dhcp auto wlan0 iface wlan0 inet manual pre-up /sbin/ifconfig wlan0 mtu 1532 pre-up /usr/sbin/batctl if add wlan0 pre-up /sbin/wpa_supplicant -B -iwlan0 -Dnl80211 -c /etc/wpa_supplicant/wpa_supplicant.conf auto wlan1 iface wlan1 inet manual pre-up /sbin/ifconfig wlan1 mtu 1532 pre-up /usr/sbin/batctl if add wlan1
- wlan0: サプリカントとなるインターフェース
- wlan1: AP(メッシュノード用)となるインターフェース
- bat0: メッシュルーティング用の仮想ブリッジ
利用者端末用AP
/etc/network/interfacesの末尾に仮想ブリッジbr0用の設定を追加します. このタイプのノードでは,利用者用のAPとなるwlan2が加わり,bat0とwlan2がbr0にブリッジされます. /etc/network/interfacesにwlan2の記載はありませんが,後述するhostapd.confの設定(利用者端末用)で登場します.
NICの構成図
br0 (<- IPアドレス) / \ bat0 wlan2 / \ wlan0 wlan1
/etc/network/interfacesに追加する部分
auto br0 iface br0 inet dhcp bridge_ports bat0
ゲートウェイノード
/etc/network/interfacesにイーサネットeth0と仮想ブリッジbr0用の設定を追加しときます.
NICの構成図
br0 (<- IPアドレス) / \ bat0 eth0 / \ wlan0 wlan1
/etc/network/interfacesに追加する部分
auto eth0 iface eth0 inet manual auto br0 iface br0 inet dhcp bridge_ports bat0 eth0
hostapd.confの設定(メッシュノード用)
メッシュノード用のAPの設定です.
interface=wlan1 #APとなるインターフェース driver=nl80211 ctrl_interface_group=0 hw_mode=g ssid= MESHSSID wpa_passphrase=XXXXXXXX #パスフレーズ wpa=2 channel=11 wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP logger_syslog_level=3
hostapd.confの設定(利用者端末用)
利用者端末用のAPの設定です.
interface=wlan2 bridge=br0 #ここを追加 driver=nl80211 ctrl_interface_group=0 hw_mode=g ssid= SSID #ここを変更 wpa_passphrase=YYYYYYYY wpa=2 channel=7 #チャンネルも変えたほうがよい wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP logger_syslog_level=3
wpa_supplicant.confの設定
network={ ssid="MESHSSID" psk= XXXXXXX #パスフレーズ }
構築
- ゲートウェイノードをLANに接続する.
hostapd /etc/hostapd/hostapd.conf
などでhostapdを起動- 他のメッシュノードを(起動して)接続させる.
- これをくりかえす.
2では,自動起動設定にしておいても良いでしょう. 利用者端末のAPも2と同様の方法で起動させます.
まとめ
WPA2-PSK方式にもとづく利用者端末,メッシュノードの認証機能,無線通信区間の暗号化機能を持つ無線メッシュネットワークシステムをbatman-advを用いて構築する方法を解説しました.802.11sや他のルーティングプロトコルも試してみたいです....
参考文献
IEEE Xplore Abstract - Experiences from security research using a Wireless Mesh Network testbed