ラズパイでメッシュWiFiネットワークを構築する(2) Gateway NODEの準備
◯やりたいこと
(1)で準備したラズパイにホームネットワークとメッシュネットワークをつなぐGatewayをインストールする。
◯やったこと
3. Gateway NODE(GW) の作成
ゲートウェイはホームネット側で言うルーターと同じ事をします。ルーターがインターネットとホームネットをルーティングするように、ゲートウェイはホームネットとメッシュネットをルーティングします。NODEをバケツリレーしてやってきたパケットは NAT変換されホームネット側に渡されます。
NODOがアシストしてきたボール(パケット)を堂安(ゲートウェイ)がゴール(ホームネットへ渡す)するイメージです。ただしメッシュ側からホーム側へのアクセスはインターネットを含めて自由にできるのですがホーム側からメッシュ側へのアクセスはできません。日本側が必ず勝つ設定になっています。もちろん日本チーム同志でのボールのやりとりはオールオーケーですが…。そのためメッシュ側にアクセスするにはゲートウェイのホーム側 IPへ SSHでログインし、そこから2段接続でメッシュ側にアクセスする必要があります。
今回はゲートウェイを以下の通りで設定していきます。
・インターフェース : eth0-ホームネット側、wlan0-メッシュネット側
・ホームネット側アドレス : ホームネットのDHCPからもらう
・メッシュネット側アドレス:192.168.199.1
・メッシュネットワーク:192.168.199.0
・メッシュネットマスク:255.255.255.0
3-1. ラズパイの準備
今回ゲートウェイにはラズパイ 3B+を使用します。できれば新型の 4B+を使用したかったのですが、昨今のラズパイはひどい入手難。仕方がないので引退していた3B、3B+を引っ張り出してきてパッシブ型のアルミケースに入れて利用します。
(1)の要領で作成したラズパイをホームネット側にLANケーブルで接続して起動し、Teratermや Puttyなどのターミナルソフトを使って sshでゲートウェイにログインしておきます。
ssh pi@192.168.1.xxx(ゲートウェイにホームネット側から付与された IPアドレス) password:
3-2. batctl ツールのインストール
最初にbatctl ツールをインストール。
sudo apt-get install -y batctl
インストール後以下の内容で設定ファイルを作成します。
nano ~/start-batman-adv.sh
・ファイル内容
#!/bin/bash # batman-adv interface to use sudo batctl if add wlan0 sudo ifconfig bat0 mtu 1468 # Tell batman-adv this is an internet gateway sudo batctl gw_mode server # Enable port forwarding sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o bat0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i bat0 -o eth0 -j ACCEPT # Activates batman-adv interfaces sudo ifconfig wlan0 up sudo ifconfig bat0 up sudo ifconfig bat0 192.168.199.1/24
最下行のアドレスがゲートウェイのメッシュ側 IPアドレスです。
作成後は忘れずに chmodでファイルに実行権限を付与し実行可能な状態にしておきます。
chmod +x ~/start-batman-adv.sh
3-3. wlan0のネットワーク定義の設定
続いてwlan0インターフェースのネットワーク定義をroot権限で作成していきます。
sudo nano /etc/network/interfaces.d/wlan0
・ファイル内容
auto wlan0 iface wlan0 inet manual wireless-channel 1 wireless-essid call-code-mesh wireless-mode ad-hoc wireless-key 1234567890
大元の記事ではネットワークにセキュリティキーを使用していなかったのでここでは別に追加しています。キーは16進数で10桁などの制限がありますので注意して設定してください。
・wireless-channnel 1〜12チャンネル
・wireless-essid YOUR-SSID
などは任意の値をセットできます。日本ではチャンネルを13まで利用可能なようなのですが、ラズパイでは12までしか設定できないようです。モードはアドホック固定です。このファイル内容はメッシュネットワーク内全てのデバイスで同一である必要があります。
3-4. batman-advモジュールのロード
echo 'batman-adv' | sudo tee --append /etc/modules
3-5. wlan0をDHCPプロセスの管理から外す
echo 'denyinterfaces wlan0' | sudo tee --append /etc/dhcpcd.conf
3-6. 起動時実行スクリプトの定義
起動時にstart-batman-adv.shを実行するため rc.localにスクリプトを定義します。
sudo nano /etc/rc.local
ファイル内の exit 0 の前に
/home/pi/start-batman-adv.sh &
の1行を挿入しておきます。
3-7. DHCPサーバーのインストール
ここからは Gateway専用の設定になります。まずはメッシュ側のDHCPサーバーとして「dnsmasq」をインストールします。
sudo apt install dnsmasq -y
インストール後以下のファイルを開き、
sudo nano /etc/dnsmasq.conf
RollDownキーを使って最下行までスクロールしてそこへ貸し出す IPアドレスの範囲を記述しておきます。
interface=bat0 dhcp-range=192.168.199.2,192.168.199.99,255.255.255.0,12h
最後に iptablesの情報を永続化するためのツールをインストールしておきます。
sudo apt install iptables-persistent -y
ルールを保存するか ip4と ip6で2度聞いてくるのでどちらも「はい」を押してください。
3-8. ゲートウェイの動作確認
ここでいったんリブートします。
sudo reboot
リブートすると wlan0はメッシュネットワーク側での動作に変わりますので以後の操作は eth0(ホームネット側)からログインして操作することになります。
ssh でログイン後以下のコマンドを実行してみて
ifconfig
次の内容が表示されれば正常に動作しています。
bat0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1468 inet 192.168.199.1 netmask 255.255.255.0 broadcast 192.168.199.255 inet6 fe80::f1e8:b920:3a95:cdee prefixlen 64 scopeid 0x20<link> ether b6:fb:9f:de:90:f6 txqueuelen 1000 (イーサネット) RX packets 57 bytes 2394 (2.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1 bytes 110 (110.0 B) TX errors 0 dropped 42 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.82 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::fed7:b320:764f:f01f prefixlen 64 scopeid 0x20<link> inet6 240d:1a:8d4:8500:231a:25e5:4a64:820b prefixlen 64 scopeid 0x0<global> ether b8:27:eb:51:6b:02 txqueuelen 1000 (イーサネット) RX packets 4445 bytes 348477 (340.3 KiB) RX errors 0 dropped 2 overruns 0 frame 0 TX packets 119 bytes 14678 (14.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (ローカルループバック) RX packets 29 bytes 4779 (4.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 29 bytes 4779 (4.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::ba27:ebff:fe04:3e57 prefixlen 64 scopeid 0x20<link> ether b8:27:eb:04:3e:57 txqueuelen 1000 (イーサネット) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 508 bytes 56697 (55.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
チェック点
・eth0がホームネット側から割り当てられたIPアドレス(ここでは192.168.1.82)であること
・bat0が192.168.199.1のアドレスであること
・wlan0にはIPアドレスが割り当てられていないこと
続いて以下のコマンドで、デバイスのワイヤレスインタフェースを確認します。
iwconfig
表示例
lo no wireless extensions. eth0 no wireless extensions. wlan0 IEEE 802.11 ESSID:"call-code-mesh" Mode:Ad-Hoc Frequency:2.412 GHz Cell: FE:9E:13:0E:98:71 Tx-Power=31 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:on bat0 no wireless extensions.
チェック点
・SSIDが「/etc/network/interfaces.d/wlan0」で規定した「call-code-mesh」となっている
・モードはAd-Hoc(アドホック)になっている
続いてwlan0がメッシュネットワークでアクティブになっているか確認します。
sudo batctl if
activeと表示されれば正常に動作しています。
wlan0: active
〜 続く 〜