「えだまめ」しているラズパイ

30年ぶりに半田ごて握ってラズパイ勉強中。

ラズパイでメッシュ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ケーブルで接続して起動し、TeratermPuttyなどのターミナルソフトを使って 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

〜 続く 〜

WiFiのチャンネルについて

パッシブ型のアルミケースでラズパイを包み込んでしまうとやはり内臓ワイヤレスLANの電波強度が弱くなるようです。(下図では7ch)


現在稼働しているメッシュネットのブリッジには WiFiドングルを増設しているのですが内臓に比べると電波強度が強く出ています。(図の 1ch)

NODEが場所々々で電波強度を維持しているので、混信を意識し3チャンネルおき5チャンネルで運用してます。ホーム側のWiFiはラズパイでセットできない13チャンネルを設定してチャンネルを有効利用中。さらに混んできたら2チャンネルおき7チャンネルまで増やす予定です。