[メモ] Raspberry Pi 3で、WiFi-EthブリッジAP

# 概要
- 有線へブリッジする、無線アクセスポイントをDockerを使用して作成。
- eth0とwlan0で、ネットのセグメントが同じ。ラズパイで、hostapdでAPをつくるが、DHCPサーバは、ラズパイが行わない。
- [[メモ] Raspberry Pi 3で、Wi-Fi アクセスポイントルータ](https://qiita.com/mt08/items/f2e4f9d3b1ed00849e23) は、NAT動作で、eth0とwlan0ネットのセグメントが違う。ラズパイが、wlan0のアクセスポイントとDHCPサーバを行う。
- 参考にしたところ: > [[HOWTO] Setting up a Raspberry Pi as a wireless bridge](https://www.raspberrypi.org/forums/viewtopic.php?t=231739)


# TL;DR
- Default: SSID=raspberry WPA_PASSPHRASE=passw0rd CHANNEL=11

```bash:コピペ
# 2018-11-13-raspbian-stretch-lite
grep '^denyinterfaces wlan0' /etc/dhcpcd.conf || echo denyinterfaces wlan0 | sudo tee -a /etc/dhcpcd.conf && \
sudo sed -i -e 's/^#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf && \
sudo sh -c 'sysctl -p && systemctl daemon-reload && systemctl restart dhcpcd' && \
curl -fsSL https://get.docker.com | sh 
#
# 一度再起動
sudo reboot
#
#
sudo usermod -aG docker ${USER} && \
sudo docker pull mt08/rpi-wifibridge && \
DHCP_SERVER=$(grep -R "offered" /var/log/* 2>/dev/null | tail -n1 | awk '{print $(NF)}') && \
sudo docker run -d --net host --privileged --rm --name rpi-wifibridge \
   -e DHCP_SERVER=${DHCP_SERVER} \
   mt08/rpi-wifibridge && \
sleep 5 && sudo docker logs rpi-wifibridge && \
ip -4 -br addr show | grep UP && echo DHCP-Server: ${DHCP_SERVER}
```

```shell-session:実行例(rebootのあと)
pi@raspberrypi:~ $ sudo usermod -aG docker ${USER} && \
> sudo docker pull mt08/rpi-wifibridge && \
> DHCP_SERVER=$(grep -R "offered" /var/log/* 2>/dev/null | tail -n1 | awk '{print $(NF)}') && \
> sudo docker run -d --net host --privileged --rm --name rpi-wifibridge \
>    -e DHCP_SERVER=${DHCP_SERVER} \
>    mt08/rpi-wifibridge && \
> sleep 5 && sudo docker logs rpi-wifibridge && \
> ip -4 -br addr show | grep UP && echo DHCP-Server: ${DHCP_SERVER}
Using default tag: latest
latest: Pulling from mt08/rpi-wifibridge
dc95218aa9a9: Pull complete
08105d289242: Pull complete
943cb8ac165f: Pull complete
2bcf02afc443: Pull complete
c6e1574200da: Pull complete
918a9e777733: Pull complete
48951e7a1fc0: Pull complete
Digest: sha256:dbb46454bef8c335747e935804f9d91d33a5f9f1b7e6130b2650f0369014e244
Status: Downloaded newer image for mt08/rpi-wifibridge:latest
3d24fe6c468d2322430261e69dea115b9a1a90cc68f542abe9af08452b570015
set ip_forward to 1
1
Starting HostAP daemon ...
Configuration file: /etc/hostapd.conf
Failed to create interface mon.wlan0: -95 (Operation not supported)
wlan0: Could not connect to kernel driver
Using interface wlan0 with hwaddr b8:27:eb:eb:a3:c9 and ssid "raspberry"
random: Only 15/20 bytes of strong random data available from /dev/random
random: Not enough entropy pool available for secure operations
WPA: Not enough entropy in random pool for secure operations - update keys later when the first station connects
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
eth0             UP             192.168.1.54/24
wlan0            UP             192.168.1.54/32
DHCP-Server: 192.168.1.1
pi@raspberrypi:~ $
```


# 環境
- Raspberry Pi 3B or 3B+
- Raspbian: `2018-11-13-raspbian-stretch-lite`
- Docker
	- `docker push mt08/rpi-wifibridge`
	- Dockerfile他: https://github.com/mt08xx/rpi-wifibridge
- ネット環境
	- DHCPサーバは、RPiでない (例: 無線APルータの有線ポートにRPi接続)
	- RPi Ethernet(eth0)
		- DHCPでIPを取得している(例:192.168.1.5/24)
	- RPi Wifi(`wlan0`)
		- hostapdを動かす
		- ipは、`eth0`に割り当てられたものと同じ、ネットマスク `/32` (例: 192.168.1.5/32)


# 手順

1. Raspbian Lite を焼く
2. 初期設定を適当に済ます
    - hostname
    - aptパッケージ更新
    - パスワード変更
    - タイムゾーンとか、言語設定とか
    - お好みパッケージ導入(例: `sudo apt install haveged byobu -y` )

3. ネット設定関係
	- `/etc/dhcpcd.conf` : `denyinterfaces wlan0`を最後に追記
		
		```bash
		echo denyinterfaces wlan0 | sudo tee -a /etc/dhcpcd.conf
		```
	- `/etc/sysctl.conf` : `net.ipv4.ip_forward=1`のとこのコメント外す。
		
		```bash
		sudo sed -i -e 's/^#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
		```

3. Dockerインストール、再起動

	```bash
	curl -fsSL https://get.docker.com | sh && sudo usermod -aG docker ${USER} && sudo reboot
	```

4. Dockerにて、起動

	```bash
	# イメージ取得
	sudo docker pull mt08/rpi-wifibridge

	# ラズパイのeth0にIPを割り当てたDHCPサーバを探す
	DHCP_SERVER=$(grep -R "offered" /var/log/* 2>/dev/null | tail -n1 | awk '{print $(NF)}')
	echo DHCP SERVER IP: ${DHCP_SERVER}
	```

	```bash
	# コンテナ起動 (デフォルト: SSID=raspberry WPA_PASSPHRASE=passw0rd CHANNEL=11)
	sudo docker run -d --net host --privileged --rm --name rpi-wifibridge \
	   -e DHCP_SERVER=${DHCP_SERVER} \
	   mt08/rpi-wifibridge
	```

	```bash
	# コンテナ起動 (SSIDなどを指定して起動)
	docker run -d --net host --privileged --rm --name rpi-wifibridge \
	  -e SSID=sukina_ssid_name \
	  -e CHANNEL=6 \
	  -e WPA_PASSPHRASE=himitsu123 \
	  -e DHCP_SERVER=${DHCP_SERVER} \
	  mt08/rpi-wifibridge   
	```

# 説明
このあたりを使用
- `parprouted`:
- `dhcp-helper`:
- `bcrelay`:


# その他 / TODO
- 自動起動の設定
- (?) ネット周りの図をかく
- (?) wlan0 - wlan1 のブリッジ