[メモ] Raspberry Pi 4BでWiFi-Ethブリッジして、有線LAN接続機器を使用する

こんな感じ

```
Internet <=> [Router WifiAP] <~~~> [(wlan0) RPi (eth0)] <=> [Wired LAN Device(有線LAN接続機器)]
```


# 概要
- 無線LANしか使えないとこ(部屋)で、有線LAN接続機器をつかいたい
- Windowsでいうところの、インターネット共有、っぽいけど、ラズパイはDHCPサーバにならないで、大元のDHCPサーバからIPもらいます。Subnet分割もされません。

# TL;DR
1. Raspbian(`2020-02-13-raspbian-buster-lite`)をmicroSDに焼く。
2. [zipファイル(`mt08-rpibridge-20200416-1.zip`)](https://github.com/mt08xx/files/raw/master/mt08-rpibridge-20200416-1.zip)をダウンロード、解凍する
    - `rpibridge.sh` : 設定スクリプト
    - `ssh` : sshログイン許可する
    - `wpa_supplicant.conf` : <= SSIDとパスワードを編集する.場所によっては、`country=`のとこも

        ```bash:wpa_supplicant.conf
        ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
        update_config=1
        country=JP
        network={
                ssid="---SSID---"
                psk="---password---"
        }
        ```
3. microSDのWindowsからファイルが見えるドライブ(FAT32)に↑の３つをコピーする。
4. ラズパイに挿して起動。(設定ファイルにより、Wifiに接続するはず)
5. sshにてログイン (デフォルトパスワードは、`raspberry`)<br>`ssh pi@raspberrypi.local` 
6. ↓を実行すると必要なものをダウンロード、設定して、再起動する<br>`sudo /boot/rpibridge.sh`
7. 以上

# 環境
- Raspberry Pi 4B<br>(3B/3B+/2BにUSB Wifiドングル などでも動くと思いますが、パフォーマンスがよろしくないかと。)
- Raspbian: `2020-02-13-raspbian-buster-lite`

---
- ネット環境
    - DHCPサーバは、RPiでない (例: 無線APルータがDHCPサービスを提供)
    - RPi Wifi(`wlan0`)
        - 無線APに接続、DHCPでIPを取得している(例:192.168.1.5/24)
    - RPi Ethernet(`eth0`)
        - IPは、`wlan0`に割り当てられたものと同じ、ネットマスク /32(例: 192.168.1.5/32)で設定される


# 関連
- [メモ] Raspberry Pi 3で、WiFi-EthブリッジAP
https://qiita.com/mt08/items/8eca5e2535abce9297a4

- Workaround for a wifi bridge on a Raspberry Pi with proxy arp
https://raspberrypi.stackexchange.com/q/88954/79866

# その他 
- 必要にせまられたら
    - (TODO) iperfでのパフォーマンス測定を書く
    - (TODO) 説明を書く 
    - (TODO) 写真とか?


# スクリプトの中身

```bash:rpibridge.sh
#!/usr/bin/env bash

set -e
[ $(id -u) -ne 0 ] && echo "try: sudo $0" >&2 && exit 1


apt-get update && apt-get install -y parprouted dhcp-helper
grep '^denyinterfaces eth0' /etc/dhcpcd.conf || echo denyinterfaces eth0 | tee -a /etc/dhcpcd.conf 
sed -i -e 's/^#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf

systemctl stop dhcp-helper
systemctl enable dhcp-helper
echo DHCPHELPER_OPTS=\"-b wlan0\" | tee /etc/default/dhcp-helper

# Avahi: enable-reflector=yes
sed -i -e 's/^#enable-reflector=no/enable-reflector=yes/' /etc/avahi/avahi-daemon.conf

cat <<'EOF' >/etc/systemd/system/parprouted.service
[Unit]
Description=proxy arp routing service
Documentation=https://qiita.com/mt08/items/00102a6d513194ea5a92
After=dhcpcd.service

[Service]
Type=forking
# Restart until wlan0 gained carrier
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
ExecStartPre=/bin/echo 'parprouted: wlan0 is online'
# clone the dhcp-allocated IP to eth0 so dhcp-helper will relay for the correct subnet
ExecStartPre=/sbin/ip addr flush dev eth0
ExecStartPre=/bin/bash -c '/sbin/ip addr add $(/sbin/ip -4 addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+\/")32 dev eth0'
ExecStartPre=/sbin/ip link set dev eth0 up
ExecStartPre=/sbin/ip link set wlan0 promisc on

#         v minus sign
ExecStart=-/usr/sbin/parprouted eth0 wlan0

ExecStopPost=/sbin/ip link set wlan0 promisc off
ExecStopPost=/sbin/ip link set dev eth0 down
ExecStopPost=/sbin/ip addr flush dev eth0

[Install]
WantedBy=multi-user.target
EOF
systemctl enable parprouted.service

systemctl daemon-reload
reboot
```