Raspberry Piで無線LANイーサネットコンバータ兼簡易ルータを作る

# TL;DR
- Raspberry Piの無線LAN（wlan0）と有線LAN（eth0）を使ってルータを構築します．
- wlan0をWAN側として上流の無線APと接続し，eth0をLAN側として配下のPCらにIPアドレスを配布します．
    - イメージ的にはルータ機能付きの無線LAN中継機です．

# 構築環境

- **無線AP**：DHCPによるアドレス配布が行われる既存の無線APを想定しています．
- **Raspberry Pi**：無線APとWiFi接続しDHCPサーバからアドレスを取得しています（wlan0）．LAN側（eth0）で`192.168.21.0/24`のIPセグメントを設定し，LAN配下のPCにDHCPでアドレスを配布しています．ゲートウェイとして機能させ，LAN側（eth0）から受け取ったリクエストをWAN側（wlan0）にフォワードします．
- **PC**：イーサネットでRaspberry Piと接続し，DHCPによるIPアドレスを取得しています．

![2020-09-15_blockdiag (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405311/99f21c70-1c67-890c-cb3f-66b22f2bccdf.png)

Raspberry Piは，Raspberry Pi 2を利用しています．無線LAN接続のためにUSB無線アダプタを利用していますが，後継機ならば標準搭載なので必要ありません．2はイーサネット接続が100BASE-Tなので，可能ならば最新の4をおすすめします．OSはRaspbian Liteをインストールしています．

# 構築

Raspberry Piの初期セットアップは省略します．具体的にはsshdとか初期ユーザとかです．
本稿では`vim`を使っていますが，なんでもいいです．

既に記載されていますが，無線LAN側をwlan0，有線LAN側をeth0に設定しています（デフォルト）．

## 無線設定（wlan0）

`wpa_supplicant`を使って無線接続設定を行います．SSIDはテキトーに検索するなりしてください．

```sh
sudo iw dev wlan0 scan | grep SSID
```

以下のコマンドで`wpa_supplicant.conf`にネットワーク設定を追記します．

```sh
sudo sh -c 'wpa_passphrase <SSID> <Passphrase> >> /etc/wpa_supplicant/wpa_supplicant.conf'
```

生パスワードがコメントアウトで記載されているため，確認後に削除することをおすすめします．

```config:/etc/wpa_supplicant/wpa_supplicant.conf
network={
        ssid="SSID"
        #psk="Passphrase" # 消す
        psk=xxxxxxxxxxx
}
```

wpa_supplicantで無線APに接続してください．systemd経由で起動できる気がします．特段設定せずに繋がったので，環境によるかもしれません．APからDHCPでIPアドレスが取得できていればよいです．

```
sudo systemctl start wpa_supplicant.service
sudo systemctl enable wpa_supplicant.service
```

## 有線設定（eth0）

eth0側でIPセグメントを設定します．
Raspberry Piには`192.168.21.1`を割り当てています．

```conf:/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.21.1/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=0.0.0.0
static domain_name_servers=0.0.0.0
```

## IPマスカレード設定

LAN側（eth0）からのパケットをWAN側（wlan0）に流すよう設定します．設定後は反映のために一度再起動してください．
ここでは簡易的に設定していますが，本番利用の際にはセキュリティ等を考慮した適切な設定を検討してください．

```config:/etc/rc.local
# 追記する
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

exit 0
```

## DHCPサーバのインストールと設定

DHCPサーバを構築します．以下のソフトウェアをインストールします．

```sh
sudo apt install -y isc-dhcp-server dnsmasq
```

コンフィグを設定します．不要な設定をコメントアウトし，必要な設定のコメントアウトを外します．
その後，DHCP配布するアドレスの設定をしてください．今回は`192.168.21.2`から`192.168.21.99`までの範囲でアドレスを配布します．

```config:/etc/dhcp/dhcpd.conf
#option domain-name "example.org"; #コメントアウトする
#option domain-name-servers ns1.example.org, ns2.example.org; #コメントアウトする

authoritative; #コメントアウトを外す

# 追記する
subnet 192.168.21.0 netmask 255.255.255.0 {
        range 192.168.21.2 192.168.21.99;
        option routers 192.168.21.1;
        option domain-name-servers 192.168.21.1;
        option broadcast-address 192.168.21.255;
        ignore declines;
}
```

インターフェースと紐づけます．LAN側（eth0）のインターフェースを記載してください．

```config:/etc/default/isc-dhcp-server
INTERFACESv4="eth0"
#INTERFACESv6=""
```

DHCPサーバを起動してください．eth0側がリンクアップしていないと起動に失敗する気がします．この時点でRaspberry PiとPCを接続しておくとよいです．

```sh
sudo systemctl start isc-dhcp-server.service
sudo systemctl enable isc-dhcp-server.service
```

LAN配下のPCにアドレスが割り振られて，インターネット接続可能なら成功です．お疲れ様でした．

# 参考
- [Raspberry Pi 3 を イーサネットコンバータにする](https://qiita.com/fstyle/items/dee9271bb8e17a005b31)
- [ラズパイを無線LANイーサネットコンバータ化する方法](https://qiita.com/winuim/items/8c39aa92f7c905e55b92)
- [ラズパイ(RaspberryPi3)をDHCPサーバーにしてみた](https://qiita.com/homines22/items/cccd711c9a77680d1e2c)