Raspberry Pi 3 Model B で MVNO 向け Wi-Fi Proxy ルータを作ってみた

■要件
・Raspberry Pi 3 Model B で作る Wi-Fi ルータ
・ただし Uplink は有線 or 別Wi-Fi
 →古い Android なスマホのテザリングを LTE モデム扱いし、Uplink とした。
・通信量を抑えるために Proxy も実装
・自動プロキシ構成スクリプトも実装
・MVNO の Carrier Grade NAT (CGN) / Large Scale NAT (LSN) の仕様に特化した仕様を入れる
・Raspberry Pi 3 Model B の OS は、CentOS 7 とする
・初期設定は極力シンプルに
・出所がはっきりしているものだけで構成

■MVNO の CGN / LSN の仕様って?
どうも一定セッション以上同時に張ると、それ以降の接続を拒否する設定が入っているようだ。
私が使用している IIJmio の場合、1000セッションくらいだろうか。
Wi-Fi ルータでなくても、スマホで大量にウィンドウを開いたときに「アンテナ強度は問題ないのに通信不能」という事象が起きるが、それがこれである。
特に DNS で クエリを発生させすぎると、一瞬で 1000 セッションを超えてしまい、通信エラーが発生する。

■今回作成した Wi-Fi Proxy ルータの特徴
セッション詰まりを防ぐために、外部 Proxy サーバを利用するようにして、外部 Proxy サーバ側に複数のセッションをオフロードするようにした。
※スクリプト上ではコメントアウト化済み
また、Wi-Fi ルータ内部に Proxy サーバを実装することで、コンテンツキャッシュを多少持てるようになり、トラフィック削減を目指した。
なお、外部 Proxy サーバでは、画像圧縮やUTMによるコンテンツチェックなども実装しているが、それはまた別の機会で取り上げる予定。
さらに、リッチな広告が増えすぎているため、うざい広告をDNSレベルでブロックするようにしてみた。

■使ってみての感覚
Webサイトの閲覧とTwitterの利用がほとんどだが、次のような結果だった。
※2週間の平均値
・使用前:300MByte / Day
・使用後:75MByte / Day
大体、75%程度削減できているようだ。
画像圧縮Proxy無しの場合は、次のような結果。
※2週間の平均値
・使用後:120MByte / Day
大体、60%程度削減。
Proxy のキャッシュヒット率などからするとそんなに削減できているようには見えなかったが、ついでに実装した広告ブロックが効いてたようだった。

■使用したもの
・Raspberry Pi 3 Model B
・Mobile Battery (Cheero Power Plus 3)
・microSD 8GB
・WLI-UC-GMN2

■CentOS 7 arm7hl (32bit) のインストールについて
公式のWiki参照
 https://wiki.centos.org/SpecialInterestGroup/AltArch/Arm32/RaspberryPi3

■成果物:ブートストラップ3つ
1:Raspberry Pi 3 Model B の初期設定実施
  ※2017/01/16に作成したもの
2:Wi-Fi Proxy ルータとして設定
  ※このスクリプト実施前に、WLI-UC-GMN2 を取り付ける

【各ブートストラップの概要】
■Raspberry Pi 3 の初期設定を行うブートストラップ
 ※2017/01/16に作成したもの
・スクリプト実行時に、ホストネームを引数にしているか確認
・microSD の全領域まで / パーティションを拡張
・/ と swap パーティションで Block Discard (Trim / UNMAP) 有効化
・root パスワードの設定 ★あえて手動入力
・ホストネームの設定
・タイムゾーンの設定
・キーマップの設定
・localhost を IPv4 のみに限定化
・可能な限り network-latency のチューニングを投入
・ntpd のインストールと設定
・パッケージアップデートの実行
・ifconfig やその他過去の Enterprise Linux で使えた管理コマンドの有効化
・iptables コマンドの有効化
・Wi-Fi 制御用コマンドの有効化
・ローカルリポジトリ作成用パッケージのインストール
・firewalld, iptables, ip6tables の停止
・Raspberry Pi 3 の Wi-Fi モジュールの有効化
・非特権ユーザ (admin) の作成とパスワードの設定 ★あえて手動入力
・SSH経由でパスワード認証を利用した root ログインの拒否設定
・非特権ユーザで RPM ビルド環境の整備
・ローカルリポジトリの作成
・ローカルリポジトリを利用するように設定
・乱数ジェネレータのビルドとインストール
・Wi-Fi の規制範囲設定ツール (crda) のビルドとインストール
 ※必要となる m2crypto がビルドは成功するがテストが失敗するので、テストを無効化してビルドする

■Wi-Fi Proxy ルータとして設定するブートストラップ
・(スクリプト上で)設定置換用見出し
・Wi-Fi Proxy ルータのアップリンク用に、ifcfg-wlan0 を再作成
・Wi-Fi Proxy ルータの AP 用に、ifcfg-wlan1 を作成
・ルータ動作用のため、IP Forward 有効化
・iptables 設定スクリプトの生成と iptables 設定および有効化
・DHCP サーバのインストールと設定
・DNS サーバのインストールと設定
・HTTP サーバのインストールと設定
・Web Proxy ページの実装
・Proxy サーバのインストールと設定
 ※IPv4 優先設定を有効化するために、Squid のリビルドも実施
・Wi-Fi AP サーバ (hostapd) のビルド、インストールと設定
・インターフェース利用状況モニターツール (iftop) のビルド、インストールと設定
・Webmin のインストール
・各種チューニング
 - NTP 関連の修正
 - Raspberry Pi 3 の CPU クロックダウン
 - 自動プロキシ構成スクリプトの作成と設定
 - squid.conf へ多段Proxyテンプレート挿入
 - DNS を使用した広告ブロック用スクリプトの作成と BIND の設定
 - makopicut 作成最新 Kernel アップデートレポジトリの有効化と Kernel アップデート実施
 - ネットワーク周りのチューニング
 - セットアップ後パワーオフ

■特記事項
・スクリプト上に存在する Tethering1 の設定を実施することで、別Wi-FiをUplinkとして設定可能
・Tethering2 の設定もすることで、複数のWi-Fi APをつかむことができるようになる(同時には1つだけ)
・同じ要領で、複数のWi-Fi設定を仕込めば、その数だけ他Wi-Fi APをセットすることができる
・自動プロキシ構成スクリプトを DHCP で読み込めない OS で Proxy を有効化するには、手動でセットする必要がある。

カテゴリー: めも パーマリンク

1 Response to Raspberry Pi 3 Model B で MVNO 向け Wi-Fi Proxy ルータを作ってみた

  1. ピンバック: Raspberry Pi 3 Model B で作った MVNO 向け Wi-Fi Proxy ルータの改修 | まこぴかっと

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です