経緯
私の部屋の有線LANはbuffaloのwifi中継機から伸びていて、その中継機がよく親機との接続が切れるのでそのたびに再起動する必要があった
毎回再起動するのはヒジョーに面倒だが家にいるときはそれでいい
しかし、外からリモートデスクトップ等でPCに接続することが多々あるので、そういった中継機にアクセスできないときのために自動でつながってくれるバックアップ用の中継機を作った
環境
Computer: Raspberry Pi 3B
OS: Ubuntu 20.04.3 LTS
やったこと
OSのインストールは割愛
wifi, ethernet設定
netplanを使用して以下の用に設定
eth0
- DHCPオフ
- IPアドレス無し
wlan0
- DHCPオフ
- IPアドレス: 192.168.0.252/24
- gateway: 192.168.0.1
- DNS: 8.8.8.8, 8.8.4.4
- 自分の環境のAP設定
$ sudo vim /etc/netplan/99-config.yaml
network:
ethernets:
eth0:
dhcp4: false
dhcp6: false
wifis:
wlan0:
dhcp4: false
addresses: [192.168.0.252/24]
optional: true
gateway4: 192.168.0.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
access-points:
"hogehoge":
password: "SUGOI TUYOI PASSWORD"
version: 2
設定の適用
$ sudo netplan apply
おそらくこの時sshが切断されるので接続し直すなどする
必要なパッケージのインストールと設定
dhcp-helper(DHCPリレー)とparprouted(Proxy ARPブリッジ)のインストール
$ sudo apt install dhcp-helper parprouted
dhcp-helperの設定
wlan0を使用してDHCP Requestをリレーするように設定する
$ sudo vim /etc/default/dhcp-helper
# Option flags used to start dhcp-helper.
#
# You will need at least "-s <DHCP server>" or
# "-b <interface> so that dhcp-helper knows where
# to relay DHCP requests.
#
# See "man 8 dhcp-helper" for more details.
DHCPHELPER_OPTS="-b wlan0"
自動起動するようにsystemctlで設定
$ sudo systemctl enable dhcp-helper
IPフォワードの設定
IPフォワードを有効化する
$ sudo vim /etc/sysctl.conf
28行目あたりに以下の設定があるのでコメントアウトを解除する
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
これで設定は完了したので、適当なIPアドレスをeth0に設定してparprouted wlan0 eth0
を実行すれば一応Wifi-Ethernetの中継を行なってくれる
メインの中継機の状態に応じて自動起動する設定
メインの中継機の状態に応じて中継機能のオンオフを行なうスクリプトの作成
/usr/local/bin
にbackupRepeater.sh
を作成して以下の内容を書き込んだ
#!/bin/sh
# Main Repeater IP Address
RPTR_ADDR="192.168.0.253"
# Ping Check
ping $RPTR_ADDR -c 1 >> /dev/null
if [ $? != 0 ]; then
ip addr flush dev eth0
ip addr add ${RPTR_ADDR}/32 dev eth0
ip link set dev eth0 up
ip link set wlan0 promisc on
parprouted wlan0 eth0
echo "Backup Repeater UP"
else
ip link set wlan0 promisc off
ip link set dev eth0 down
ip addr flush dev eth0
echo "Backup Repeater DOWN"
fi
やっていることとしては以下の通り
- 中継機のIPアドレスに対してpingを飛ばす
- pingの標準出力が0以外(疎通しなかった)の場合
- eth0に設定されているアドレスを全削除
- wlan0に設定したIPアドレス(ここでは
192.168.0.252
)でサブネットマスクが32bitのアドレスをeth0に設定 - eth0をリンクアップ
- wlan0をプロミスキャスモードに設定
- proxy ARPブリッジの起動
- pingの標準出力が0(疎通した)の場合
- wlan0のプロミスキャスモードを解除
- eth0のリンクダウン
- eth0に設定されているアドレスを全削除
crontabで1分に1回実行
$ sudo vim /etc/crontab
/etc/crontab
に以下の内容を追記した
# backup repeater
* * * * * root sh /usr/local/bin/backupRepeater.sh
crontabの再起動
$ sudo systemctl restart cron
動作確認
適当に中継機の電源引っこ抜いて動作確認した結果1分以内にインターネットへの接続がもどってきてるのでヨシ!!
ただ、メインの中継機が戻ってきたとき、起動してから中継機としての機能が使用可能になるのにちょっと時間がかかるのでこっちは若干遅い
あとがき
- 未だ外から家のPCにアクセスしようとして接続できなかったことはないが、今後も無いとは言い切れないのでバックアップができて安心した
- crontabで1分に1回ping飛ばして確認するのはあんまり賢い感じがしないので、いい感じの方法あったら教えて偉い人
- 書き終わって一通り読み返して思った「ケーブルで引っ張ってくるかメッシュwifi使うか強い中継機買えばよくね?」