OpenWRTでWired likeなWiFiNWを作ってみた。
2015/11/29
NTT ソフトウェアイノベーションセンタ
水越大貴(m-masataka)
自己紹介
•m-masataka (水越大貴)
•所属 NTT SIC
• 元々分散処理
•無線LAN関係のOSSを触る
• OpenWRT
• Hostapd
本日お話しすること
•無線LAN関係のOSSについて調べました。
•OpenWRTを使用して、コントローラブルな無線LAN
環境を自作しました。
動機
• 無線LANの管理は難しい
 認証設定
 APの管理
 接続端末の制限
 SSID設定
 チャネル割り当て
初期設定
 電波状況
 ユーザ端末
 利用状況
環境変化への対応
一元的に、かつ、動的に無
線周りの設定変更がしたい。
ケース1
• 電波干渉の影響で、通信できないユーザを一時的に他の
アンテナへ退避させたい。
Wi-Fi AP Wi-Fi AP 干渉源
通信障害発生
ケース2
• 接続端末の優先度を変更したい。
今はこの人だけ優先させたい!
一般ユーザ
Wi-Fi AP
Wi-Fi AP
やりたいこと
Wi-Fi コントローラ
Wi-Fi APWi-Fi AP
 アンテナ情報
 端末情報
 電波状況
:
:
情報収集
•Wi-Fiコントローラから、Wi-Fiアクセスポイントのアンテナ
周りの情報収集&設定変更ができるようにします。
やりたいこと
Wi-Fi コントローラ
Wi-Fi APWi-Fi AP
 アンテナ情報
 端末情報
 電波状況
:
:
情報収集
•Wi-Fiコントローラから、Wi-Fiアクセスポイントのアンテナ
周りの情報収集&設定変更ができるようにします。
•これをOSSで作ります。
OpenWRTとは
•組み込みデバイス向けのLinux Distribution
• 特にルータやアクセスポイントといった機器に対して多く対応
• コンシューマ向けの無線LANルータのファームウェアを置き換えることが
可能
•特徴
• 複数のチップセットに対応
• 拡張性が高い(コンパイル作業が簡単)
• ファイルサイズが軽量
ash uClibc BusyBox Lua opkg
なぜOpenWRT?
• 多機能
• 組み込みデバイス向けのアプリ開発がとにかく簡単
なぜOpenWRT?
•OpenWRT
• ルータ向け
•LEDE
• Linux Embedded Development Environment
• 組込みシステムのためのLinux Distr
• 組込みシステムの開発環境を提供
→ Buildroot を使ってmakeするだけでアプリ
もkernel moduleも開発できる。
やりたいこと
Wi-Fi コントローラ
Wi-Fi APWi-Fi AP
 アンテナ情報
 端末情報
 電波状況
:
:
情報収集
•Wi-Fiコントローラから、Wi-Fiアクセスポイントのアンテナ
周りの情報収集&設定変更ができるようにします。
•これをOSSで作ります。
無線ルータ
OpenWRT 無線機能の構成
Kernel
Space
User
Space
wireless driver
Wireless chipset
hostapd
Wireless Driverの設定、無線LANセキュリティ機能
(WPA,WPA2)の実装を行うアクセスポイントデーモン。
パケットの処理。
無線⇔有線の変換が行われる。ビーコン制御、MPDU等
のpacket aggregation rateのコントロール.
mac80211
cfg80211
OpenWRTをAPIで操作
•Ubus
• OpenWRTの軽量メッセンジャー
ubus
Other
service
Other
service
Wireless
component
Ubus cli Httpd-mod-ubus
Wi-Fi コントローラ
HTTP(S)
設定変更反映
OpenWRTをAPIで操作
•Ubus
• 使い方
# ubus list
dhcp
hostapd.wlan0
hostapd.wlan1
log
network
network.device
network.interface.wan
:
:
# ubus list -v network.interface.wan
'network.interface.wan' @44d8b6fa
"up":{}
"down":{}
"status":{}
"prepare":{}
"dump":{}
:
:
登録されているサービスを表示 Ubusで取得&設定可能な情報を表示
OpenWRTをAPIで操作
•Ubus
• 使い方
# ubus call network.interface.wan down 
{ “network.interface”: { “action”: “ifdown”, “interface” : “wan”}}
Ubus経由での命令
※インターフェースダウン
全体構成
• コントローラ ⇔ ubus ⇔ hostapd ⇔ Wireless Driver ⇔ チップセットの
流れで、無線物理層の情報収集・設定変更を行うことができます。
ubus
wireless driver
hostapd
Wi-Fi コントローラ
HTTP(S)
HTTP(S)
全体構成
• コントローラ ⇔ ubus ⇔ hostapd ⇔ Wireless Driver ⇔ チップセットの
流れで、無線LANの情報収集・設定変更を行うことができます。
ubus
wireless driver
hostapd
Wi-Fi コントローラ
HTTP(S)
HTTP(S)Versionによってはubus連携の機能が無いので
、今回はubus パッチ済のHostapdをMakeします。
環境構築
• 足りないアプリケーションのビルド
TL-WDR4300
N750 Wireless Dual Band Gigabit Router
 Wireless : Atheros AR9340
 SoC: AR9344(MIPS)
 RAM : 128MiB
 Flash size : 8192KiB
環境構築
• 足りないアプリケーションのビルド
TL-WDR4300
N750 Wireless Dual Band Gigabit Router
 Wireless : Atheros AR9340
 SoC: AR9344(MIPS)
 RAM : 128MiB
 Flash size : 8192KiB
組み込みシステムの開発
 コンパイラを動かすには、メモリが足りない。
 OpenWRT Buildrootを使ってクロスコンパイル
OpenWRT buildroot
• Build toolのダウンロード
https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/
• OpenWRT上で動くほとんどのアプリケーションは上記の操作で作成
することが可能です。
• 今回は、自分でカスタマイズしたアプリケーションなど、上記操作で
入手できないものを作成します。
# ./scripts/feeds update -a
# ./scripts/feeds install –a
# make menuconfig
# make
OpenWRT buildroot クロスコンパイル
• Hostapd ver2.6の入手
• クロスコンパイルに使用するディレクトリの設定
• コンパイラを指定して、hostapdのmake
• Build_toolの中にtoolchainが入っているので、その配下のコンパイラを指定
してコンパイルすることで、OpenWRT環境で動くアプリケーションが作成でき
る。
# git clone git://w1.fi/srv/git/hostap.git
# export STAGING_DIR=~/staging_dir/toolchain-mips_34kc_gcc-4.8-
linaro_uClibc-0.9.33.2
# export CC=~/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-
0.9.33.2/bin/mips-openwrt-linux-gcc
# cd hostapd/hostapd/
# make
OpenWRT build tool クロスコンパイル
• 依存ライブラリが無いと怒られる。
• 同じコンパイラを使用して、ライブラリ生成。
• 再コンパイル
ループ
OpenWRT build tool クロスコンパイル
• 依存ライブラリが無いと怒られる。
• 同じコンパイラを使用して、ライブラリ生成。
• 再コンパイル
ループ
OpenWRTでは、殆どのライブラリが予め用意されています
デモ
• TP-Linkの無線LANルータをOpenWRT化
TL-WDR4300
N750 Wireless Dual Band Gigabit Router
 Wireless : Atheros AR9340
 SoC: AR9344(MIPS)
 RAM : 128MiB
 Flash size : 8192KiB
まとめ
• OpenWRTを使ってコントローラブルな無線LAN環境を作りま
した。
• 安い(OSS+家庭用ルータ)
• 機能追加が簡単(OpenWRT Buildroot)
• 今後やってみたいこと
• 無線LANのQoSコントロール
• SDNコントローラとの連携
ありがとうございました。

Open wrtでwired likeなwifinwを作ってみた。