Raspberry Pi4B で イーサネットコンバータ

やりたいこと

WiFi非対応デバイスがいくつかある。
それらを少し離れたところに置きたいけれど、有線LANは面倒なので無線LANで接続したい。
下図のようなイメージ。

構成

本体:Raspberry Pi4B
OS:Ubuntu Server 24.04(22とか20でも大丈夫なはず)
    ※Raspberry Pi OS だとかなり面倒くさい。Ubuntuでサクッと作った方が吉

インストールするソフトウェア:parprouted

これだけでOK。

ただし、ルータからDHCPでIPを割り当ててもらう必要があるなどの場合は、DHCPのブロードキャストもリレーする必要があるので bcrelay を使うけど…今回は、全デバイスが固定でIPを振られるので使用しない。

ラズパイのネットワーク設定( eth0とwlan0 )

最初にIPv4のパケットフォワードを有効にする。
編集するファイル:/etc/sysctl.conf

編集個所は1行だけで、下記のコメント(#)を外すだけ。
(もし、値が1ではなく0だったら1に書き換える。多分1になってると思うけど)

#net.ipv4.ip_forward=1

続いて、以下ファイルを作成して、ラズパイのネットワーク設定を行う。
尚、Ubuntuインストール直後にある 50-cloud-init.yam はファイル末尾に .bak でも付けてリネームしておく。
(Ubuntuのインストールの仕方によってはそもそもファイルがないかもしれない)

/etc/netplan/00-manual-init.yaml

network:
   version: 2
   ethernets:
      eth0:
         dhcp4: false
         addresses: [192.168.10.20/24]
   wifis:
      wlan0:
            dhcp4: false
            access-points:
                "Your SSID":
                  password: "Your Password"
            addresses: [192.168.10.20/24]
            gateway4: 192.168.10.1
            nameservers:
              addresses: [192.168.10.1]
            optional: true

ここで eth0 と wlan0 のIPアドレスが同じになっているけど、間違いではなくそれでOK
(ただし、利用するネットワーク環境に合わせて値は適宜変更のこと)

設定に間違いがなければ下記コマンドで設定を反映。

$ sudo netplan apply

もし、各インターフェースが Down 状態なら、下記コマンドで Up にする。

$ sudo netplan up eth0

これで、ラズパイがWiFiでルータ(またはAP)に接続できるので、一旦、ルータ側のPC等でラズパイにアクセスできるか確認しておくとよい。

parproutedのインストールと設定

下記コマンドでインストール

$ sudo apt install parprouted

parprouted はラズパイが起動したら同時に起動してほしいのでサービスとして登録する。
ついでに設定ファイルも編集しよう。

$ sudo systemctl edit --force --full parprouted

parproutedインストール直後は、設定ファイルには何も書かれていないと思うので、下記をコピペで。

[Unit]
Description=ProxyArpService
 
[Service]
Type=oneshot
RemainAfterExit=yes
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
 
ExecStartPre=/lib/systemd/systemd-networkd-wait-online --interface=wlan0 --time=120
ExecStartPre=/bin/echo 'systemd-networkd-wait-online: wlan0 is online'
ExecStartPre=/sbin/ip link set dev eth0 up
ExecStartPre=/sbin/ip link set wlan0 promisc on
 
#parprouted開始
ExecStart=/usr/sbin/parprouted eth0 wlan0
 
[Install]
WantedBy=multi-user.target

基本的にこのままで問題ないかと。
変更するとしたら –time=120 かな?
60辺りでも全然問題ないと思う。けど、ちょっと長めに見積もっておいた。

ラズパイを再起動して確認

ここまでの設定では、まだイーサネットコンバーターとしては動作していない。
まだ、2つのネットワークインターフェースは独立して動いている。

けどまぁ、確認でラズパイを再起動してみる。

ラズパイが起動したら「 ip a 」を実行してIPアドレスを確認する。
下記はその結果だけどだいぶ端折ってる。

$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet 192.168.10.20/24 brd 192.168.10.255 scope global eth0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet 192.168.10.20/24 brd 192.168.10.255 scope global wlan0

端折ってるけど、大事なのは eth0 と wlan0 が同じIPアドレスになっているということ。

各インターフェースともにDownしていることなく、IPアドレスも割り当てられていたら、下記を実行。

$ sudo systemctl start parprouted.service

特にエラーメッセージが出てこなければOK

一応、parprouted が起動したか確認。

$ sudo systemctl status parprouted.service
● parprouted.service - ProxyArpService
     Loaded: loaded (/etc/systemd/system/parprouted.service; disabled; preset: >
     Active: active (exited) since Sun 2024-09-01 12:11:25 JST; 7s ago
    Process: 1156 ExecStartPre=/lib/systemd/systemd-networkd-wait-online --inte>
    Process: 1158 ExecStartPre=/bin/echo systemd-networkd-wait-online: wlan0 is>
    Process: 1160 ExecStartPre=/sbin/ip link set dev eth0 up (code=exited, stat>
    Process: 1162 ExecStartPre=/sbin/ip link set wlan0 promisc on (code=exited,>
    Process: 1165 ExecStart=/usr/sbin/parprouted eth0 wlan0 (code=exited, statu>
   Main PID: 1165 (code=exited, status=0/SUCCESS)
      Tasks: 4 (limit: 8676)
     Memory: 476.0K (peak: 1.4M)
        CPU: 156ms
     CGroup: /system.slice/parprouted.service
             mq1167 /usr/sbin/parprouted eth0 wlan0

Active になってるし、最後の一行で eth0 と wlan0 を組み合わせた状態で実行できている。

てことで、今度は「ip a」でIPアドレスを確認してみる。

$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet 192.168.10.20/24 brd 192.168.10.255 scope global eth0
3: wlan0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500
    inet 192.168.10.20/24 brd 192.168.10.255 scope global wlan0

IPアドレスが同じになっているし、特に wlan0 では「PROMISC」が追加されているのが確認できればOK

これで、ルータ側の端末から、ラズパイの eth0 にぶら下がっているデバイスにアクセスできるようになる。
逆もまたもちろん可能。

問題なくアクセスが双方向で行えることを確認したら、下記コマンドで parprouted がラズパイ起動と同時に有効になるように設定しておく。

$ sudo systemctl enable parprouted.service

もし、必要時以外はイーサネットコンバーターとして使いたくない場合は、これは実行せず、有効にしたい時だけ systemctl コマンドを実行すればよい。

$ sudo systemctl start parprouted.service
$ sudo systemctl stop parprouted.service

念のため、もう一度、ラズパイを再起動して自動でイーサネットコンバーターとして使える状態になるかを確認しておけば万全。

ということで、以上で設定完了。

余談

まぁ、単なるイーサネットコンバーターという役割しか与えていないので、下記のような構成でも特に問題ない。

本来なら、ラズパイをブリッジで使うのではなく、ルータとして機能させてしまえば、もっといろいろできるのだろうけれど、ラズパイにぶら下げるデバイスが場合によってはルータのある側のネットワークに接続されるときもあるので、セグメントを別の値に変更することが出来ず、ブリッジという手段が必要になった。

けどまぁ、実際作ってみて、これはなかなか便利かもしれない。

Ubuntuなので、他にもいろいろ仕込めるし。

この記事にコメントしてみる