やりたいこと
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なので、他にもいろいろ仕込めるし。
この記事にコメントしてみる