簡単に出来るかもしれないOpenWrtで作るゲストアクセスポイント

2015年4月19日

前回の記事でNwtworkのInterfaces内のブリッジの組み替えと、Wi-Fiのアクセスポイントの設定を解説しました。

今回は応用を利かせて、こんな感じのゲストアクセスポイントを設置します。
private-lan-and-isolate-wireless-network

OpenWrtの概要はウィキペディアに委ねるとして、玄人仕様であったOpenWrtもバージョン8.09以降にLuCIという強力なWebインターフェイスがプリインストールされるようになり、大幅に敷居が下がったようです。日本人のWebであまり触れられていないQoSに関しても解説しているので、少々長めですがよろしくお付き合いください。

前回と合わせて、基本的な設定操作に慣れながらOpenWrtならではの柔軟なカスタマイズを行う方法を解説していきたいと思います。

今回は汎用的なフリースポットにとどめますが、最終的には手持ちのFONルーターからMACアドレスを拝借し、FONのアクセスポイントを汎用Wi-Fiルーターで実現することを目指します。

アクセスポイントを追加する

WHR-HP-G300Nはカタログスペックで「“AES”“TKIP”“WEP”をが同時に使える」との事で、ハードの制限が許す範囲でLuCIからアクセスポイントの設定を追加する事が出来ます。
opernwrt-multsecurity-wifi

画像上に赤くマーキングしているものはBSSIDと言って、Wi-Fi端末に通知されるMACアドレスです。これは最初に登録したものに設定値が使われ、APが追加されると最初の1ケタが変更され最後の1ケタがインクリメント(+1)されていきます。このIDはベンダー各社が取得していてルーターのブランドの判別にも使われます。
wifi-analyzer-for-openwrt

Interface ConfigurationのGeneral Setupでお好みの設定をします。Networkのチェックボックスはゲストを属させたいネットワーク(組み込みたいブリッジ先)にチェックを入れます。
opernwrt-multsecurity-wifi-device-config

設定したアクセスポイントは、Interfaces Overviewから属させたいブリッジへ組み込みます。これでセキュリティ上の問題はあるものの、アクセスポイントとして機能します。
opernwrt-multsecurity-interfaces

ただし、このままではWi-Fiの帯域は使い放題、デバイス間も自由にアクセスできる上に上位ルーターにまでログイン出来てしまいます。接続の確認が出来たら、ひとまず(x)Disableボタンで無効化しておきましょう。

アクセスポイントに制限を課す

不特定多数がアクセスするという事で、ゲストアクセスポイントに適応したい制限をリストアップしてみました。

  1. DNSはローカルを参照させず、外部の公開サーバーを使用する。
  2. 上位ルーターのLANへのアクセス禁止
  3. ルーターへのログイン禁止(port 80,22へアクセス禁止)
  4. ローカルアドレス内の相互アクセス禁止。(いわゆるプライバシーセパレーター)
  5. トラフィック制限(通信速度制限)

この決まりを元にルーターを設定していきたいと思います。

ではリストアップした制限事項を実装をしていきましょう。

DNSはローカルを参照させず、外部の公開サーバーを使用する。

これはDHCPの設定で解決できます。

InterfacesのDHCP ServerのAdvanced Settingの赤線の部分を設定するわけですが、丁度exampleにDNSの設定方法が記載されているので同じように設定します。ここではGoogle Public DNSの値を設定しました。
openwrt-lan-dhcp-dns-option

上位ルーターのLANへのアクセス禁止
ルーターへのログイン禁止(port 80,22へアクセス禁止)

FirewallのTraffic Rulesで実現可能です。
3項目だけ追加しました。
openwrt-guest-wifi-security

iptablesでの設定をLuCIで行うわけですが、Addボタンで追加した物はiptables -Aで最後尾に追加した状態と同じになります。openwrt-firewall-add-rules

この為、優先順を制御するためにはポチポチとボタンを押していくことになるので、慣れてきた人はSSHでログインしてコンソールで編集したほうが色々と捗るかと思います。

設定画面は以下の通り、慣れるより慣れかと思うので色々と弄って設定してみると良いでしょう。
openwrt-firewall-iptables-setting

使う人次第という所もありますが、やはりこういうUIでは柔軟な設定編集が困難です。

コンソールからは/etc/config/firewallを編集します。openwrtにはviエディタが組み込まれているので、これで編集する事になります。触ったことのない人はITmediaのtipsに簡単な解説があるので見ておきましょう。多くの機能を知りたい方はITProの連載等を参考にしましょう。

openwrt-edit-uci-on-console

# 10.12.59.1/24へのアクセスをドロップ
config rule
        option src 'lan'
        option dest 'wan'
        option target 'DROP'
        option proto 'all'
        option dest_ip '10.12.59.1/24'
        option name 'drop wan-lan from guest'
# ローカルからのルーターへのSSHアクセスをドロップ
config rule
        option name 'drop lan:22 from guest'
        option target 'DROP'
        option src 'lan'
        option proto 'all'
        option dest_ip '192.168.1.1'
        option dest_port '22'
# ローカルからのルーターへのHTTPアクセスをドロップ
config rule
        option src 'lan'
        option name 'drop lan:80 from guest'
        option dest_ip '192.168.1.1'
        option target 'DROP'
        option dest_port '80'
        option proto 'tcp'

上位ルーターに他のネットワークアドレスがある場合は適宜ドロップする設定を追加します。

LuCIで設定できる項目はoverlayの領域に保存されフラッシュに記録されます。上記のように足らない設定をコンソールから追加設定する事が可能です。

最終的に、このファイル群は各コマンドの実行に変換され、ルーターの再起動時にも適応されるようになります。詳しくは公式サイトのThe UCI System – OpenWrt Wikiを参照して下さい。
なお、本サイトでは視認性の観点から、uciコマンドを使うのではなく設定ファイルを直接編集しています。

設定が完了すればゲストWiFiは隔離出来ているので、(x)Disableボタンで無効化したインターフェイスを有効化しましょう。

ローカルアドレス内の相互アクセス禁止。(いわゆるプライバシーセパレーター)

APの設定時に適応できればよかったのですがLuCIには設定項目がありません。SSHでログインして/etc/config/wirelessの該当項目にoption isolate '1’を追記します。Buffalo社が謳うプライバシーセパレーターAP IsolaterまたはClient Isolaterと言います。Wireless configuration – OpenWrt Wikiにオプションの詳細が載っています。
openwrt-add-isolate-etc-config-wireless

トラフィック制限(通信速度制限)

トラフィック制御を行うにはスケジューリングや、トラフィックに関するカーネルモジュールをインストールする必要があります。
これに関してはNetwork Traffic Control – OpenWrt Wikiに詳しいことが書かれていますが、OpenWrtには既にLuCIでQoS(Quality of Service (qos-scripts) configuration – OpenWrt Wiki)を行うモジュールやスクリプトIが用意されているので、それを導入します。

OpenWRTを導入した初期状態のWHR-HP-G300Nには、overlayファイルシステムが960KB確保されており、このうち720KBほどの容量が残っています。
openwrt-system-software-update-lists

この画面では、一般的なlinuxディストリビュージョンの様にパッケージ管理が出来るのですが、初期状態ではパッケージリストが空なのでUpdate Listsボタンをクリックしてリストを取得します。これでキーワードによるパッケージを検索が可能になります。
openwrt-system-software-downloading-openwrt-org-pkglists

例えばトラフィックをコントロールするTCコマンドが欲しい場合、「tc」で検索するとtcpのような物までヒットしてしまうのでDescriptionに着目して「traffic control」で検索します。
openwrt-system-software-find-traffic-control-pkg

あとはInstallをクリックすれば関連モジュールと合わせてインストールが完了します。
openwrt-system-software-tc-command-installed

そして、残り60%、572KBの空き容量が残りました。

QoSの場合、「luci-app-qos(Quality of Service configuration module)」をインストールすれば付随する関連モジュールが全て入り、コンフィグレーションも済ませてくれます。
openwrt-system-software-search-qos

Installing luci-app-qos (0.11.1-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/luci-app-qos_0.11.1-1_ar71xx.ipk.
Installing qos-scripts (1.2.1-6) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/qos-scripts_1.2.1-6_all.ipk.
Installing tc (3.3.0-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/tc_3.3.0-1_ar71xx.ipk.
Installing kmod-sched-core (3.3.8-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/kmod-sched-core_3.3.8-1_ar71xx.ipk.
Installing kmod-sched-connmark (3.3.8-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/kmod-sched-connmark_3.3.8-1_ar71xx.ipk.
Installing kmod-ipt-conntrack-extra (3.3.8-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/kmod-ipt-conntrack-extra_3.3.8-1_ar71xx.ipk.
Installing kmod-ifb (3.3.8-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/kmod-ifb_3.3.8-1_ar71xx.ipk.
Installing iptables-mod-filter (1.4.10-4) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/iptables-mod-filter_1.4.10-4_ar71xx.ipk.
Installing kmod-ipt-filter (3.3.8-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/kmod-ipt-filter_3.3.8-1_ar71xx.ipk.
Installing kmod-lib-textsearch (3.3.8-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/kmod-lib-textsearch_3.3.8-1_ar71xx.ipk.
Installing iptables-mod-ipopt (1.4.10-4) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/iptables-mod-ipopt_1.4.10-4_ar71xx.ipk.
Installing iptables-mod-conntrack-extra (1.4.10-4) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/iptables-mod-conntrack-extra_1.4.10-4_ar71xx.ipk.
Configuring kmod-sched-core.
Configuring kmod-ipt-conntrack-extra.
Configuring kmod-sched-connmark.
Configuring kmod-lib-textsearch.
Configuring kmod-ipt-filter.
Configuring tc.
Configuring kmod-ifb.
Configuring iptables-mod-filter.
Configuring iptables-mod-ipopt.
Configuring iptables-mod-conntrack-extra.
Configuring qos-scripts.
Configuring luci-app-qos.
Free space: 43% (416.00 KB)

 

Networkメニューに戻ってみると、QoSのタブが追加されています。
openwrt-add-qos-config-on-luci

ここまでで、大よそのカスタマイズ工程が分かったかと思います。この容量の範囲内でパッケージの管理を行い、自分好みのルーターを作り上げていく事になります。

では、最後にQoSの設定を行って今回の締めとしましょう。

初期状態のQoSは以下のように設定されています。
openwrt-qos-defaults

アップロードが128kbps、ダウンロードが1024kbpsに上限設定がされていて、各プロトコルで優先レベルが設定されています。飽くまでサンプル設定ですが、機能を確かめるには十分ですので、このまま話を進めます。

まず、QoS無しの状態でAndroid端末を使って通信速度を計測してみます。計測するにあたり、GooglePlayからSpeedtest.netをインストールしました。

回線は「フレッツ光ネクスト」の「ファミリータイプ」で結果はこんな感じです。ほぼ回線速度限界まで出ている感じです。

download 19.54Mbps upload 31.43Mbps
openwrt-android-speedtest-qos-disable

では、実際にQoSを有効にしてみます。

機能を有効にするにはSystemタブのStartupでサービスのOn/Off、起動や停止が行えるので実際に有効にしてみましょう。
openwrt-system-startup-qos

そして計測結果です。バイト換算次第では一致する値でしょうか…。
openwrt-android-speedtest-qos-enable-d1024-u128

デフォルト設定ではPriority、Express、Normal、Bluk(Low)という4つのClassが設定されていて、最初に示したQoSのスクリーンショットの様に、サービスや送受信のIPレンジにClassを設定(Targetとして関連付けます)して、各通信における速度を制御します。

ただし、デフォルト設定はLuCIで設定できるDownload SpeedUpload Speedを元に、帯域使用率の割合(avgrate)で制御するため、回線が空いていればlowを設定しても最大値に近い速度が出てしまいます。これでは回線速度を絞り込む用途には使用できません。

LuCIからはそれぞれのClassに関する設定は出来ないのでSSHでログインして/etc/config/qosを編集する事で、各レベルに対する細かな設定を行うことが出来ます。

以下にclass lowにリミッターを設定した例を示します。

config classgroup 'Default'
# Defaultクラスグループに4つのクラスがあり、デフォルトは'Normal'であるという記述
        option classes 'Priority Express Normal Bulk'
        option default 'Normal'

config class 'Priority'
        option packetsize '400'
        option maxsize '400'
        option avgrate '10'
        option priority '20'

config class 'Priority_down'
        option packetsize '1000'
        option avgrate '10'

config class 'Express'
        option packetsize '1000'
        option maxsize '800'
        option avgrate '50'
        option priority '10'

config class 'Normal'
        option packetsize '1500'
        option packetdelay '100'
        option avgrate '10'
        option priority '5'

config class 'Normal_down'
        option avgrate '20'

config class 'Bulk'
        option avgrate '1'
        option packetdelay '200'
#
# Blukの設定に上限を追加、帯域の5%まで使ってよい
#
        option limitrate '5'

以下はWikiによる計算式の資料です。

### Params:
#
# maxsize:
#       limits packet size in iptables rule
#
# avgrate: (note: sum(avgrates) ~ 100)
#       rt m1 = avgrate / sum (avgrate) * max_bandwidth
#       rt m2 = avgrate * max_bandwidth / 100
#       ls m1 = rt m1
#
# packetsize & packetdelay: (only works if avgrate is present)
#       rt d = max( packetdelay, 'time required for packetsize to transfer' ) (smaller ps -> smaller d)
#       ls d = rt d
#
# priority:
#       ls m2 = priority / sum (priority) * max_bandwidth
#
# limitrate:
#       ul rate = limitrate * max_bandwidth / 100

それぞれ、ゲストのIPに向けた通信と、ゲストのIPに向かう通信に「low」のClassを適応しました。帯域速度はおおよそ最初に測定した値を設定し、それを分散させます。SSHから設定したものと合わせて、192.168.1.1/24関連のアクセスに対して帯域の5%を解放します。
openwrt-fix-qos-guestwifi

最後にこの設定を行った計測結果です。
openwrt-android-speedtest-qos-enable-limit005per

この程度でも、YouTubeやニコニコチャンネル位は見れるので、速度としては十分ではないでしょうか?。

OpenWrtdnsmasq,fon,openwrt

Posted by redchat