バックアップ用のWi-Fi-Ethernet中継機をRaspberryPiで作った話

# 経緯

私の部屋の有線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設定

```bash
$ sudo vim /etc/netplan/99-config.yaml
```
```yaml:/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
```
設定の適用

```bash
$ sudo netplan apply
```
おそらくこの時sshが切断されるので接続し直すなどする

## 必要なパッケージのインストールと設定

dhcp-helper(DHCPリレー)とparprouted(Proxy ARPブリッジ)のインストール

```bash
$ sudo apt install dhcp-helper parprouted
```
### dhcp-helperの設定

wlan0を使用してDHCP Requestをリレーするように設定する

```bash
$ sudo vim /etc/default/dhcp-helper
```
```:/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で設定

```bash
$ sudo systemctl enable dhcp-helper
```

### IPフォワードの設定

IPフォワードを有効化する

```bash
$ sudo vim /etc/sysctl.conf
```
28行目あたりに以下の設定があるのでコメントアウトを解除する

```conf:/etc/sysctl.conf
# 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`を作成して以下の内容を書き込んだ

```sh:/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
```

やっていることとしては以下の通り

1. 中継機のIPアドレスに対してpingを飛ばす
1. pingの標準出力が0以外(疎通しなかった)の場合
    1. eth0に設定されているアドレスを全削除
    1. wlan0に設定したIPアドレス(ここでは`192.168.0.252`)でサブネットマスクが32bitのアドレスをeth0に設定
    1. eth0をリンクアップ
    1. wlan0をプロミスキャスモードに設定
    1. proxy ARPブリッジの起動
1. pingの標準出力が0(疎通した)の場合
    1. wlan0のプロミスキャスモードを解除
    1. eth0のリンクダウン
    1. eth0に設定されているアドレスを全削除

### crontabで1分に1回実行

```bash
$ sudo vim /etc/crontab
```

`/etc/crontab`に以下の内容を追記した

```:/etc/crontab
# backup repeater
*  *	* * *	root	sh /usr/local/bin/backupRepeater.sh
```

crontabの再起動

```bash
$ sudo systemctl restart cron
```

# 動作確認

適当に中継機の電源引っこ抜いて動作確認した結果1分以内にインターネットへの接続がもどってきてるのでヨシ！！
ただ、メインの中継機が戻ってきたとき、起動してから中継機としての機能が使用可能になるのにちょっと時間がかかるのでこっちは若干遅い

# あとがき

 - 未だ外から家のPCにアクセスしようとして接続できなかったことはないが、今後も無いとは言い切れないのでバックアップができて安心した
 - crontabで1分に1回ping飛ばして確認するのはあんまり賢い感じがしないので、いい感じの方法あったら教えて偉い人
 - 書き終わって一通り読み返して思った「ケーブルで引っ張ってくるかメッシュwifi使うか強い中継機買えばよくね？」

# 参考文献

 - [RaspberryPi 2B を使って Ethernet Converter を作る](https://qiita.com/hymtig/items/c48279d590f71e8aa16b)
 - [[メモ] Raspberry Pi 4BでWiFi-Ethブリッジして、有線LAN接続機器を使用する](https://qiita.com/mt08/items/00102a6d513194ea5a92)