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

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

ラズパイでメッシュWiFiネットワークを構築する(3) Bridge NODEの準備

◯やりたいこと

(2)で準備したゲートウェイに引き続き、(1)の要領で準備した2台目のラズパイへメッシュネット上で動作するブリッジノードをインストールします。

◯やったこと

4. Bridge NODE(BR)の作成

ここで準備するブリッジノードは wlan0側がメッシュネット上に接続されているNODEの一つで eth0側に接続される非メッシュデバイスとのパケット中継を担当します。wlan0・eth0どちら側も見た目は同じメッシュネットワーク上にあるように見えます。ブリッジを家の隅っこに持っていったとしてもあちこちの NODEがバケツリレーでパケットを転送してくれるので、eth0と PCを LANケーブルで接続するとPCは普通にメッシュネット上にあるように動作します。IPアドレスもメッシュ上のDHCPサーバー(ゲートウェイ)からキチンと 192.168.199.xxxのアドレスを取得します。当然メッシュネット上にある各NODEとのやりとりも普通にできます。WiFiドングルを追加すれば eth0の代わりに WiFiでの機器接続も可能になります。


4-1. ラズパイの準備

ラズパイ 4B+が入手困難なのでゲートウェイと同じく在庫品の 3B+を引っ張り出してきてブリッジを構成します。ブリッジノードは設定が終わって再起動するとホームネット側からは見る事ができなくなりますので気合を入れて一発動作を狙っていきます。まあ最悪 eth0に PCを接続し直せばホームネット上で操作したのと同様な操作をする事は可能なのですが、iPadからリモートでWindowsにログインしている私の環境では非常に手間がかかる処理になりますのでできればやらずに済ませたいところです。

(1)の要領でセットアップしたラズパイは順調に起動すれば wlan0がホーム側ネットに接続して起動しますので、ターミナルソフトから sshでログインしておきます。

4-2. batctl ツールのインストール

ゲートウェイの設定 3-2と同じ処理です。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

sudo brctl addbr br0
sudo brctl addif br0 eth0 bat0

# Tell batman-adv this is a gateway client
sudo batctl gw_mode client

# Activates batman-adv interfaces
sudo ifconfig wlan0 up
sudo ifconfig bat0 up

# Restart DHCP now bridge and mesh network are up
sudo dhclient -r br0
sudo dhclient br0

ちなみにブリッジノードの IPアドレスを固定化したい場合は最下行2行の代わりに

sudo ifconfig br0 192.168.199.xxx

としておけば固定IPで起動します。
ここでも忘れずにスクリプトを実行可能な状態にしておきます。

chmod +x ~/start-batman-adv.sh

4-3. wlan0のネットワーク定義の設定

ゲートウェイ設定 3-3と全く同じ内容でファイル設定をします。

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

4-4. batman-advモジュールのロード

echo 'batman-adv' | sudo tee --append /etc/modules

4-5. wlan0,eth0,bat0をDHCPプロセスの管理から外す

ブリッジノードではwlan0に加え eth0, bat0もDHPCの管理下から除外します。

echo 'denyinterfaces wlan0 eth0 bat0' | sudo tee --append /etc/dhcpcd.conf

4-6. 起動時実行スクリプトの定義

ここもゲートウェイ設定 3-6と同様の設定を行います。

sudo nano /etc/rc.local

ファイル内の exit 0 の前に

/home/pi/start-batman-adv.sh &

の1行を挿入しておきます。

4-7. ブリッジユーティリティのインストール

ここからはブリッジノード専用のインストールになります。まずはブリッジユーティリティのインストールから行います。

sudo apt-get install -y bridge-utils

4-8. eth0の設定

wlan0側(メッシュ側)でリレーしてきたパケットを橋渡し(ブリッジ)する eth0の設定を行います。この設定を行うとイーサネットポートをホットプラグ(自由に抜き差し)できるようになります。設定ファイルに以下の内容を定義します。

sudo nano /etc/network/interfaces.d/eth0

・ファイル内容

auto eth0
allow-hotplug eth0
iface eth0 inet manual

4-9. ブリッジノードへのログイン

以上で設定が完了しましたので再起動します。再起動するとブリッジはメッシュネット上に移動してしまいますのでホームネット側から直接操作することができなくなります。ブリッジへWindowsマシンを直接 LAN接続できる場合は直接操作が可能なのですが、ここではゲートウェイにホームネット側から sshで一度ログインしさらにゲートウェイ上からメッシュネット側のブリッジに sshでログインする方法を取ります。要は sshの2段接続です。

ホームネット側からゲートウェイにログインし、

ssh pi@192.168.1.xxx 

DHCPサーバーのアドレスリース記録を見てブリッジの IPアドレスを確認します。

cat /var/lib/misc/dnsmasq.leases

そのアドレスに sshでログインします。

ssh pi@192.168.199.xxx

4-10. インターフェースの動作状況確認

ブリッジにログインできたら最初にインターフェースの動作状況を確認します。

ifconfig

次のように表示されれば正常に動作しています。

bat0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1468
            inet6 fe80::e838:85ff:fe06:8265  prefixlen 64  scopeid 0x20<link>
            ether ea:38:85:06:82:65  txqueuelen 1000  (Ethernet)
            RX packets 16589  bytes 9220389 (8.7 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 14460  bytes 1905164 (1.8 MiB)
            TX errors 0  dropped 19 overruns 0  carrier 0  collisions 0

    br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1468
            inet 192.168.199.34  netmask 255.255.255.0  broadcast 192.168.199.255
            inet6 fe80::4e41:fc4e:b18c:ffd0  prefixlen 64  scopeid 0x20<link>
            ether b8:27:eb:e8:18:b0  txqueuelen 1000  (Ethernet)
            RX packets 3261  bytes 213663 (208.6 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1053  bytes 208548 (203.6 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet6 fe80::ba27:ebff:fee8:18b0  prefixlen 64  scopeid 0x20<link>
            ether b8:27:eb:e8:18:b0  txqueuelen 1000  (Ethernet)
            RX packets 15714  bytes 2010018 (1.9 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 16090  bytes 9413607 (8.9 MiB)
            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  (Local Loopback)
            RX packets 3  bytes 360 (360.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 3  bytes 360 (360.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet6 fe80::ba27:ebff:febd:4de5  prefixlen 64  scopeid 0x20<link>
            ether b8:27:eb:bd:4d:e5  txqueuelen 1000  (Ethernet)
            RX packets 65722  bytes 11991421 (11.4 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 39946  bytes 4886290 (4.6 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

チェック点
・br0にメッシュネットワーク内の IPアドレスが割り振られている
・bat0,eth0,wlan0には IPアドレスが割り振られていない

続いてブリッジインターフェースの詳細を表示して

sudo brctl show

bat0と eth0がブリッジしている事を確認します。

bridge name bridge id       STP enabled interfaces
br0     8000.b827ebe818b0   no      bat0
                                    eth0

ブリッジのインターフェースがメッシュネットワークに参加できているかを確認するには

sudo batctl if
wlan0: active

でwlan0がメッシュに参加している事がわかりますし、

sudo batctl n

で自分から見える近くのメッシュノードが表示されます。

[B.A.T.M.A.N. adv 2021.3, MainIF/MAC: wlan0/b8:27:eb:04:3e:57 (bat0/ba:d1:69:83:e4:2f BATMAN_IV)]
IF             Neighbor              last-seen
        wlan0     b8:27:eb:33:d4:ad    0.920s

〜 続く 〜