動機
RasPi4にArch Linux for ARM入れてNAT組んでとかやっていたが,アップデートかませてから動かなくなった.おそらくSDカードの寿命.
せっかくなのでRaspberry Pi純正OSのRaspberry Pi OSにて同様の動作をする環境を作りたかった.
目標の構成としてはNATの上流側がWi-Fi環境であり下流が優先LANである.
逆に設定するのが通常であると考えられるが,私は家のDHCPによるIP自動払い出しのWi-Fiにしか接続できない環境にあり,一方で自室内に自分専用のネットワークを組みたいという欲望からこのようなことが必要になる.
作業環境
既に有線回線側の接続予定のローカルネットワークは組まれていてその中には外部との接続を可能にするためのNATが組まれたPCがあり,DHCPサーバよりルーティングも可能になっている状況にある.
すなわち今回の作業で得たい環境はすでに別機器によって再現されている環境にある.
SDカードへのRaspberry Pi OSのインストール
Raspberry Pi Imagerを用いてRaspberry Pi OS Lite(64bit)をSDカードに焼きこむ.
この際ssh設定とユーザー名&パスワード設定を必ずチェックボックスを入れて設定する.
Raspberry Piの起動
SDカードをRaspberry Piに差し込み,有線LANを接続する.Raspberry PiにはPoE hatが接続されており,接続先のスイッチもPoE出力のある物なので自動的に起動する.
DHCPの払い出しにより自動的にIPアドレスが割り振られ,sshで接続できるようになっているはずである.sshでRaspberry Piに接続する.
systemd-networkd
まず有線側を固定IPとして設定する.
$ sudo vim /etc/systemd/network/20-wired.network
[Match]
Name=eth0
[Network]
Address=10.0.2.5
[DHCPv4]
RouteMetric=20
次に無線側をDHCPとして設定する.
$ sudo vim /etc/systemd/network/25-wireless.network
[Match]
Name=wlan0
[Network]
DHCP=yes
IgnoreCarrierLoss=3s
[DHCPv4]
RouteMetric=10
systemd-networkdの自動起動とdhcpcdの自動起動停止
$ sudo systemctl disable dhcpcd
$ sudo systemctl enable systemd-networkd
再起動
$ sudo reboot
ここまでできていれば再起動後も同様にssh接続できるはず.
再度ssh接続した後,ルーティングは自動的に設定されないため
$ sudo ip route add default via $ROUTING_ADDR dev eth0
ここで$ROUTING_ADDRはデフォゲのアドレス.一時的なもの.
Wi-Fi側の接続
iwdを用いる
$ sudo apt install iwd
$ sudo systemctl disable wpa_supplicant.service
$ rfkill unblock wifi
$ reboot
$ sudo systemctl start iwd
$ sudo systemctl enable iwd
$ sudo iwctl
[iwd] station wlan0 connect SSID
ここでWi-Fiパスワードをうち,その後quitでiwdの対話から抜ければWi-Fi側(今回の場合は上流)にも接続できる.
ipフォワーディング
$ sudo vim /etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
iptablesによるNAT関係
$ sudo apt install iptables
$ sudo apt install iptables-persistent
$ sudo systemctl enable iptables
$ sudo systemctl start iptables
$ sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o wlan0 -j MASQUERADE
$ sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
$ vim test.sh
#!/bin/bash
iptables-save > /etc/iptables/rules.v4
$ sudo chmod a+x test.sh
$ bash ./test.sh
$ sudo reboot
DHCPサーバ
$ sudo apt install sci-dhcp-server
DHCPサーバの設定
設定内容は割愛
同一LAN内で動作しているdhcpサーバを落として
$ sudo systemctl enable sci-dhcp-server
$ sudo systemctl start sci-dhcp-server
今回の学び
iptablesの設定ファイルはArch Linuxでは/etc/iptables/iptables.rulesであるが,Raspberry Pi OSでは/etc/iptables/rules.v4となる.
また,aptではiptablesのみでは動かない,iptables-persistentも同時に入れる.
pacman上でのパッケージdhcpdはapt上ではisc-dhcp-server,同様にsystemdにて起動するサービスもisc-dhcp-server.service

