こんな感じ
Internet <=> [Router WifiAP] <~~~> [(wlan0) RPi (eth0)] <=> [Wired LAN Device(有線LAN接続機器)]
概要
- 無線LANしか使えないとこ(部屋)で、有線LAN接続機器をつかいたい
- Windowsでいうところの、インターネット共有、っぽいけど、ラズパイはDHCPサーバにならないで、大元のDHCPサーバからIPもらいます。Subnet分割もされません。
TL;DR
- Raspbian(
2020-02-13-raspbian-buster-lite
)をmicroSDに焼く。 -
zipファイル(
mt08-rpibridge-20200416-1.zip
)をダウンロード、解凍する-
rpibridge.sh
: 設定スクリプト -
ssh
: sshログイン許可する -
wpa_supplicant.conf
: <= SSIDとパスワードを編集する.場所によっては、country=
のとこもwpa_supplicant.confctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=JP network={ ssid="---SSID---" psk="---password---" }
-
- microSDのWindowsからファイルが見えるドライブ(FAT32)に↑の3つをコピーする。
- ラズパイに挿して起動。(設定ファイルにより、Wifiに接続するはず)
- sshにてログイン (デフォルトパスワードは、
raspberry
)ssh pi@raspberrypi.local
- ↓を実行すると必要なものをダウンロード、設定して、再起動する
sudo /boot/rpibridge.sh
- 以上
環境
- Raspberry Pi 4B
(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)で設定される
- IPは、
関連
-
[メモ] 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) 写真とか?
スクリプトの中身
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