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


はじめに

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

概要

hostapdにて内臓のwlan0をアクセスポイントにし、vlanインタフェースにブリッジさせます。
残念ながらRaspberryPi3に内蔵しているWi-Fiモジュールは1つのSSIDしか出せないのでVLAN ID付きのみブリッジさせてます。

環境構成

  • ハードウェア: 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に書けばいいですがわかりやすくするため分けてます。

/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にしました。

/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がありますが使わなくても大丈夫です。

/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インタフェースと、ブリッジインタフェースが作成っされてるか、
ブリッジにリンクされてるか確認してください。

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
ブリッジリンク確認
$ 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には書いてません。
この2つのインタフェースにIPをふるとタグなしのeth0自体に固定IPで振れなくなったからです。
必要であればdhcpcd.confに書けば固定IPが設定ができます。
自動設定する場合はmanualのところをdhcpにしてください。

Raspberry Pi 4を使用する場合 (2020/11/8更新)

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

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

Raspberry Pi 4を使用する場合2 (2020/11/21更新)

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

参考文献