Raspberry Pi 4B アクセスポイント化＆ルータ化メモ

備忘録。

# 0. 導入
# 0.1. Raspberry Piアクセスポイント化＆ルータ化のメリット
* 外でノートPC、iPad、iPhoneからSSH・VNC接続できるようになる
* モニタが無くても起動確認ができる
* eth・wlan側のIPアドレスを固定化しなくて良い（複数の接続先を頻繁に切り替えて使うような運用、つまり外によく持ち出す場合便利）
* アクセスポイント側のIPアドレスは固定化できるので、SSH・VNC接続時、楽

# 0.2. 前提条件
1. Wi-Fiが有効化されていること
2. 無線LAN接続が既に設定済みであること

# 0.3. システム情報
モデル：Raspberry Pi 4 Model B Rev 1.5
OS：Debian GNU/Linux 11 (bullseye)

```shell_session
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ cat /proc/cpuinfo
processor	: 0
BogoMIPS	: 108.00
Features	: fp asimd evtstrm crc32 cpuid
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 1
BogoMIPS	: 108.00
Features	: fp asimd evtstrm crc32 cpuid
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 2
BogoMIPS	: 108.00
Features	: fp asimd evtstrm crc32 cpuid
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 3
BogoMIPS	: 108.00
Features	: fp asimd evtstrm crc32 cpuid
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

Revision	: d03115
Serial		: 10000000226b1d94
Model		: Raspberry Pi 4 Model B Rev 1.5
```

# 1. アクセスポイント用のインターフェース設定
## 1.1. Macアドレス確認
```shell_session
$ iw dev
phy#0
        Unnamed/non-netdev interface
                wdev 0x2
                addr ba:27:eb:71:2f:5d
                type P2P-device
                txpower 31.00 dBm
        Interface wlan0
                ifindex 3
                wdev 0x1
                addr b8:27:eb:bd:72:22
                ssid Extender-G-80FC
                type managed
                channel 1 (2412 MHz), width: 20 MHz, center1: 2412 MHz
                txpower 31.00 dBm
```

## 1.2. インターフェース追加
```shell_session
$ sudo iw phy phy0 interface add ap0 type __ap
$ sudo ip link set ap0 address b8:27:eb:bd:72:22
```

## 1.3. 設定の永続化
```conf:/etc/udev/rules.d/99-ap0.rules
SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="b8:27:eb:bd:72:22", KERNEL=="phy0", \
  RUN+="/sbin/iw phy phy0 interface add ap0 type __ap", \
  RUN+="/bin/ip link set ap0 address b8:27:eb:bd:72:22"
```

## 1.4. アクセスポイント化に必要なソフトウェアのインストール
```shell_session
$ sudo apt install -y hostapd dnsmasq
```

### 1.4.1. DHCPサーバ設定（dnsmasq）
```conf:/etc/dnsmasq.conf
interface=ap0
dhcp-range=192.168.200.100,192.168.200.150,255.255.255.0,12h
server=192.168.200.1
```

### 1.4.2. DHCPクライアント設定（dhcpcd）
```conf:/etc/dhcpcd.conf
interface ap0
static ip_address=192.168.200.1/24
nohook wpa_supplicant
```

### 1.4.3. アクセスポイント化設定（hostapd）
```conf:/etc/hostapd/hostapd.conf
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=ap0
driver=nl80211
ssid={Your AP SSID}
hw_mode=g
country_code=JP
channel=11
ieee80211d=1
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_passphrase={Your AP password}
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
```

### 1.4.4. 有効化・再起動
```shell_session
$ sudo systemctl unmask hostapd.service
$ sudo systemctl enable hostapd.service
$ sudo systemctl restart dhcpcd.service
$ sudo systemctl restart hostapd.service
$ sudo systemctl restart dnsmasq.service
```

この時点でスマホやタブレット、PCなど無線LAN接続できる端末からアクセスポイントに接続ができる。確認用にApacheなどをインストールして(`sudo apt install -y apache2`)、http://192.168.200.1 でアクセスし確認すると分かりやすい。

# 2. ルータ化設定

```shell_session
$ sudo sysctl -w net.ipv4.ip_forward=1
```

```conf:/etc/sysctl.d/routed-ap.conf
net.ipv4.ip_forward=1
```

## 2.1. IPマスカレードの有効化

```shell_session
$ sudo iptables -t nat -A  POSTROUTING -o wlan0 -j MASQUERADE
```

## 2.2. 設定の永続化
インストールを実行するとTUIで現在設定を保存するか聞かれる。`<Yes>`を選択しEnter。

```shell_session
$ sudo apt install -y netfilter-persistent iptables-persistent
```

```shell_session
$ sudo netfilter-persistent save
$ sudo shutdown -r now
```

# 参考文献
* [Setting up a Routed Wireless Access Point](https://www.raspberrypi.com/documentation/computers/configuration.html#setting-up-a-routed-wireless-access-point)
* [Raspberry Pi WiFiアクセスポイント+クライアント同時使用 - みかんのゆるふわ技術ブログ](https://www.mikan-tech.net/entry/raspi-wifi-ap-sta)
* [Raspberry Pi WiFiアクセスポイント&amp;ルーター化 - みかんのゆるふわ技術ブログ](https://www.mikan-tech.net/entry/raspi-ap-sta-router)
* [Raspberry Pi をWi-Fiアクセスポイント＆ルーター化する - 猫ぱーんち！](https://penkoba.hatenadiary.org/entry/20130806/1375742819)