Raspberry Pi＋hostapdでのアクセスポイント化

# はじめに
RaspberryPiを利用してWiFiアクセスポイントを作成しました。
アクセスポイントは他にもあったのですがVLANタグが付けられないため、余らせてたRaspberryPiをアクセスポイントにしてVLANタグを付きでネットワークに繋げられないかと考えて設定しました。

#概要
hostapdにて内臓のwlan0をアクセスポイントにし、vlanインタフェースにブリッジさせます。
残念ながらRaspberryPi3に内蔵しているWi-Fiモジュールは１つのSSIDしか出せないのでVLAN ID付きのみブリッジさせてます。
![概要図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648907/fc4493d2-ad0d-3829-a79a-b44c23fd6c6f.png)

# 環境構成
* ハードウェア: Rapsberry Pi3 Model B
* OS: Raspbian 10

# 手順
* Raspbianインストール (ここは省略します)
* パッケージインストール
* vlan設定
* ブリッジ設定
* アクセスポイント(hostapd)設定

#パッケージインストール
**hostapd**をインストールします。
なくても大丈夫ですがブリッジ状態の確認のため**bridge-utils**も入れます。

※bridge-utilsで設定してもvlanインタフェースと上手くリンクできません。

```
$ sudo apt-get install hostapd bridge-utils
```

# vlan設定
/etc/network/interfaces.d/vlan を作成し以下のように記載します。
インタフェース名は**eth0.(vlan ID)**になります。

※**vlan**というファイルは作らなくてもinterfacesに書けばいいですがわかりやすくするため分けてます。

```ruby:/etc/network/interfaces.d/vlan
auto eth0.20
iface eth0.20 inet manual
        vlan-raw-device eth0
```
### 解説
**auto eth0.20**
boot時にインタフェース(eth0.20)を自動でアップします。
**iface eth0.20 inet manual**
IPアドレスの設定を手動にします。
今回はVLAN20側にIPアドレスを振られないようにするため手動にします。
**vlan-raw-device eth0**
元になるインタフェース(eth0)を指定します。

# ブリッジ設定
/etc/network/interfaces.d/bridge を作成し以下のように記載します。
ブリッジインタフェース名は**br0**にしました。

```ruby:/etc/network/interfaces.d/bridge
auto br0
iface br0 inet manual
bridge_ports eth0.20 wlan0
bridge_stp off
```
### 解説
***bridge_ports eth0.20 wlan0***
eth0.20インタフェースとwlan0インタフェースをリンクさせます。
***bridge_stp off***
アクセスポイントであれば不要なのでSTPを切ります。

#アクセスポイント(hostapd)設定
/etc/hostapd/hostapd.confを作成し以下のように記載します。

※このファイルはデフォルトで作られていません。サンプル設定ファイルは**/usr/share/doc/hostapd/examples/hostapd.conf**がありますが使わなくても大丈夫です。

```ruby:/etc/hostapd/hostapd.conf
interface=wlan0
bridge=br0
driver=nl80211
ssid=Test_AccessPoint
hw_mode=g
channel=9
wmm_enabled=1
country_code=JP
ht_capab=[HT40][SHORT-GI-20][SHORT-GI-40]
macaddr_acl=0
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=Test_Password
rsn_pairwise=CCMP
logger_syslog=-1
```
###解説
重要なところだけ解説します。
必要に応じてサンプルファイルやマニュアルを参照してください。

**interface=wlan0**
アクセスポイントにするインタフェース(wlan0)を指定します。
**bridge=br0**
ブリッジインタフェース(br0)を指定します。
これを指定しないとwlan0がブリッジに所属してくれません。
**ssid=Test_AccessPint**
SSIDを指定します。
環境に合わせて_Test_AccessPoint_を変えてください。
**ht_capab=[HT40][SHORT-GI-20][SHORT-GI-40]**
使用するフラグリストです。
必要に応じてiwで確認しサポートするフラグを記載してください。
**wpa_passphrase=Test_Password**
パスワードを設定します。
環境に合わせて_Test_password_を変更してください。
**logger_syslog=-1**
syslogに全部のログを吐き出します。

#後処理
hostapdの自動起動を有効化します。
デフォルトでマスクされてるのでマスクの解除もします。

```
sudo systemctl unmask hostapd.service
sudo systemctl enable hostapd.service
```

ここまで終わったら再起動してください。

```
sudo systemctl reboot -i
```

再起動後はvlanインタフェースと、ブリッジインタフェースが作成っされてるか、
ブリッジにリンクされてるか確認してください。

```ruby:vlan,ブリッジインタフェースの確認
$ ip link
:
:
4: eth0.20@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP mode DEFAULT group default qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
```

```ruby:ブリッジリンク確認
$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.b827eb0af375       no              eth0.20
                                                        wlan0
```
#おまけ
###複数SSID
iwコマンドで出せるSSIDの数を確認できます。
Raspberry Pi3の内蔵モジュールはこのような結果で出てきます。

```
$ iw phy0 info | grep AP
                 * AP
                 * AP: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
                 * AP: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
                 * #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
```
4行目の**#{ AP } <= 1**となっているので1つのSSIDしか出せません。

### ブリッジ、VLANインタフェースのIPアドレス設定
今回は**manual**にし**dhcpcd.conf**には書いてません。
この２つのインタフェースにIPをふるとタグなしの**eth0**自体に固定IPで振れなくなったからです。
必要であればdhcpcd.confに書けば固定IPが設定ができます。
自動設定する場合は**manual**のところを**dhcp**にしてください。

### Raspberry Pi 4を使用する場合 (2020/11/8更新)
Raspberry Pi 4になるとRFkill機能が働いてwlan0インタフェースがアップしないことがあります。
RFkillはWi-FiやBT等ワイヤレスデバイスを使用していないと判断されたときにデバイスをブロックし消費電力を抑える機能です。
これが動くことでwlan0インタフェースがアップしないためブリッジができなくなります。
以下のようにブロックを解除することでインタフェースがアップ状態にでき使用できるようになります。

```ruby:状態確認
$ sudo rfkill list
0: phy0: Wireless LAN
        Soft blocked: blocked    ←ソフト側でブロック状態になっています。
        Hard blocked: no
1: hci0: Bluetooth
        Soft blocked: no
        Hard blocked: no
```
```ruby:設定
$ sudo rfkill unblock wifi
```

### Raspberry Pi 4を使用する場合2 (2020/11/21更新)
ステーション数に制限があり、４～５台くらいしか接続できないようです。
2.4GHz帯を使用した場合なので5GHz帯を使用した場合は検証していません。
iwコマンドの出力で最大接続数を調べる方法や、Raspberry Pi 4での接続数上限を知っている方がいたら教えて下さい。。。

#参考文献

* [RasPiをVLAN毎にSSIDを分けるAPにする(hostapd) — かないノート](http://www.hogetan.net/note/network/hostapd.html)
* [hostapd.conf 覚書](https://qiita.com/JhonnyBravo/items/5df2d9b2fcb142b6a67c)