Raspberry Pi 3 Model B+ をルーターにする

# はじめに
この記事は「[自宅サーバー構築記録](https://qiita.com/hatayan1126/items/dcf70c26d518d07f4e47)」の一部です。

今回は Raspberry Pi 3 Model B+ を無線AP化して、iptables という Linux の Firewall を使って子供たちのインターネット接続を制御しようという試みです。


# 構成図
![hty-sv01-hostapd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108371/447c6ec9-33b8-dfd0-520c-f42378c2e0fe.png)


# やったこと

## Raspberry Pi 3 Model B+ を無線AP化する

hostapd をインストール

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo apt install hostapd -y
pi@raspberrypi:~ $
```

hostapdの設定
とりあえず最低限の設定

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo cat /etc/hostapd/hostapd.conf
##### hostapd configuration file ##############################################
interface=wlan0
bridge=br1
　：
##### IEEE 802.11 related configuration #######################################
ssid=**********
country_code=JP
channel=5 ← チャンネルは既存のWifiと重複しないように
　：
##### WPA/IEEE 802.11i configuration ##########################################
wpa=2
wpa_passphrase=**********
　：
pi@raspberrypi:~ $
```

hostapd を起動。

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo systemctl start hostapd
Failed to start hostapd.service: Unit hostapd.service is masked.
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo systemctl umask hostapd
Unknown operation umask.
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo systemctl start hostapd
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo systemctl enable hostapd
pi@raspberrypi:~ $
```

無線LANインターフェース(wlan0)をブリッジ接続する
有線LANインターフェース(eth0)のブリッジは「[Raspberry Pi 3 Model B+ に lxc/lxd でコンテナ環境を構築した件](https://qiita.com/hatayan1126/items/804c76ed44ed539395c7)」で作成済み

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo vi /etc/network/interfaces
　：
auto br1
iface br1 inet manual
    bridge_ports wlan0
    bridge_stp off
　：
pi@raspberrypi:~ $
```

DHCPを無効化し固定IPを割り当てる
/etc/network/interfaces に記述しても動作するが /etc/dhcpcd.conf に記述するように注意書きがしてあるのでそれに従って設定する。
参考：「[Raspbian jessie で bridge する備忘録](https://www.labohyt.net/blog/server/post-881/)」

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo vi /etc/dhcpcd.conf
　：
denyinterfaces eth0 wlan0
　：
interface br1
static ip_address=192.168.133.12/24
　：
pi@raspberrypi:~ $
```

再起動して確認

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo reboot
pi@raspberrypi:~ $

pi@raspberrypi:~ $
pi@raspberrypi:~ $ ip add show wlan0
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br1 state UP group default qlen 1000
    link/ether b8:27:eb:f5:4e:d8 brd ff:ff:ff:ff:ff:ff
pi@raspberrypi:~ $
pi@raspberrypi:~ $ ip add show br1
5: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether b8:27:eb:f5:4e:d8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.133.12/24 brd 192.168.13.255 scope global br1
       valid_lft forever preferred_lft forever
    inet6 fe80::1404:2bff:fe4b:3a85/64 scope link
       valid_lft forever preferred_lft forever
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.b827eba01b8d       no              eth0
br1             8000.b827ebf54ed8       no              wlan0
pi@raspberrypi:~ $
```

## LXCコンテナを作る

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc launch images:ubuntu/16.04 firewall
pi@raspberrypi:~ $
```

コンテナにアタッチして iptables と iptables-persistent をインストール
iptables は firewall 本体
iptables-persistent は firewall の設定を保存するために必要

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc exec firewall  /bin/bash
root@firewall:~#
root@firewall:~# apt install iptables iptables-persistent
root@firewall:~#
root@firewall:~#
root@firewall:~# ls -al /etc/iptables/
total 12
drwxr-xr-x  2 root root 4096 May 22 07:14 .
drwxr-xr-x 69 root root 4096 May 22 07:14 ..
-rw-r--r--  1 root root  187 May 22 07:14 rules.v4
root@firewall:~#
root@firewall:~#
root@firewall:~# cat /etc/iptables/rules.v4
# Generated by iptables-save v1.6.0 on Wed May 22 07:14:08 2019
*filter
:INPUT ACCEPT [6:1964]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3:197]
COMMIT
# Completed on Wed May 22 07:14:08 2019
root@firewall:~#
root@firewall:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
root@firewall:~#
root@firewall:~# exit
pi@raspberrypi:~ $
```