Buildrootで小さなAPを作る(後編)

前回はopensshでアクセスできる環境を構築しました。
今回はいよいよhostapdを導入したいと思います。

WiFiデバイスの導入

Buildrootの環境では、WiFiデバイスのロードが有効になっていません。
そこで、デバイスを自動検出するためにmdevを導入します。

    System configuration  --->
    /dev management (Dynamic using devtmpfs only)  --->
(X) Dynamic using devtmpfs + mdev

メニューを選択しただけでは、mdevは自動実行されません。
そこで、/etc/init.d/に起動スクリプトを追加します。
起動スクリプトはサンプルが提供されているのでRoot filesystem overlayにコピーをします。

$ mkdir -p ${ENV_ROOTFS_OVERLAY}/etc/init.d
$ cp package/busybox/S10mdev ${ENV_ROOTFS_OVERLAY}/etc/init.d/
$ chmod +x ${ENV_ROOTFS_OVERLAY}/etc/init.d/S10mdev

次にWiFiデバイスを有効にするために wireless-regdb を導入します。
wireless-regdb はWiFiの電波を出力するために国別に定められた規定情報が格納されています。

導入方法の詳細は wireless-regdbを参考に…となりますが、Buildrootではパッケージで提供されています。

    Target packages  --->
    Networking applications  --->
[*] wireless-regdb

WiFiデバイスを有効にするために必要なもう一つの要素にファームウェアの導入があります。
こちらも、別途手順があるのですがBuildrootではパッケージで簡単に導入が可能です。

    Target packages  --->
    Hardware handling  --->
    Firmware  --->
[*] rpi-wifi-firmware

最後にWiFiデバイスを固定IPで起動するために、/etc/network/interfaces を編集します。
こちらも、Root filesystem overlayにコピーして編集します。

$ mkdir -p ${ENV_ROOTFS_OVERLAY}/etc/network
$ cp output/target/etc/network/interfaces ${ENV_ROOTFS_OVERLAY}/etc/network/interfaces
$ nano ${ENV_ROOTFS_OVERLAY}/etc/network/interfaces

/etc/network/interfacesの内容は固定で192.168.4.1/24を割り当てます。

# interface file auto-generated by buildroot

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
  pre-up /etc/network/nfs_check
  wait-delay 15
  hostname $(hostname)

auto wlan0
iface wlan0 inet static
  address 192.168.4.1
  netmask 255.255.255.0
  network 192.168.4.0
  gateway 192.168.4.1


アプリケーションの追加

APとして起動するために幾つか必要なアプリケーションがあるので、導入していきます。

    Target packages  --->
    Networking applications  --->

まずは、DHCPのサーバーの機能として、dnsmasqを導入します。

[*] dnsmasq
[*]   tftp support
[*]   dhcp support
[ ]   DNSSEC support
[ ]   IDN support
[ ]   conntrack marking support

次に、今回の主役であるhostapdを導入します。

[*] hostapd
[*]   Enable hostap driver
[*]   Enable nl80211 driver
[ ]   Enable wired driver
[*]   Enable ACS
[ ]   Enable EAP
[*]   Enable WPS
[*]   Enable WPA3 support
[ ]   Enable VLAN support

最後に、パケットフィルタリングのためにiptablesを導入します。

[*] iptables
[ ]   bpfc and nfsynproxy
      *** nftables compat needs a toolchain w/ wchar, dynamic library, headers >= 3.12 ***

アプリケーションの設定

これからは先ほどパッケージ導入したアプリケーションの設定を行います。
設定ファイルはRoot filesystem overlay上に構成します。

まずは、dnsmasqの設定を行います。
設定ファイルは/etc/dnsmasq.confです。

$ nano ${ENV_ROOTFS_OVERLAY}/etc/dnsmasq.conf

下記の内容で新規に作成し、192.168.4.2~192.168.4.20までのIPを払い出すようにします。

interface=wlan0 # Listening interface
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
                # Pool of IP addresses served via DHCP
domain=wlan     # Local wireless DNS domain
address=/gw.wlan/192.168.4.1
                # Alias for this router

次にhostapdの設定を行います。
設定ファイルは/etc/hostapd/hostapd.confとしました。

$ mkdir -p ${ENV_ROOTFS_OVERLAY}/etc/hostapd
$ nano ${ENV_ROOTFS_OVERLAY}/etc/hostapd/hostapd.conf

下記の内容で設定し、5GHz帯の36chで80MのAPを起動したかったのですが、残念ながら上手く起動できず今後調査が必要です。

interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
macaddr_acl=0
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
ieee80211d=1
ieee80211h=1
country_code=JP
hw_mode=a
channel=36
ht_capab=[HT40-][HT40+][SHORT-GI-20][SHORT-GI-40]
vht_capab=[SHORT-GI-80]
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42
beacon_int=100
ignore_broadcast_ssid=0
auth_algs=1
wpa=2
ssid=hogehoge_ap_ac
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP

そこで、今回は2.4GHz帯の6chを設定し運用することにします。

interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
macaddr_acl=0
ieee80211n=1
wmm_enabled=1
country_code=JP
hw_mode=g
channel=6
beacon_int=100
ignore_broadcast_ssid=0
auth_algs=1
wpa=2
ssid=hogehoge_ap
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP

次にIPフォワードの設定を行います。
IPフォワードの設定はsystemctlで行うので、/etc/sysctl.d/にスクリプトファイルを配置します。

$ mkdir -p ${ENV_ROOTFS_OVERLAY}/etc/sysctl.d
$ nano ${ENV_ROOTFS_OVERLAY}/etc/sysctl.d/routed-ap.conf

IPフォワードの設定は下記の内容を記述します。

# Enable IPv4 routing
net.ipv4.ip_forward=1

最後に、iptablesの設定とhostapdの起動を自動で行うように/etc/init.d/にスクリプトを準備します。

$ nano ${ENV_ROOTFS_OVERLAY}/etc/init.d/S99rpi3_hostapd
$ chmod +x ${ENV_ROOTFS_OVERLAY}/etc/init.d/S99rpi3_hostapd

iptablesを導入しているので、細かいパケットフィルタリングも可能ですが、今回は動作確認のためにシンプルな設定です。

#! /bin/sh
if [ "$1" == "start" ]; then
	iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
	iptables -A FORWARD -i eth0 -o wlan0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
	iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

	hostapd -B /etc/hostapd/hostapd.conf
fi

ラズパイを再起動し、IPフォワードが動作をしていることを確認します。

# cat /proc/sys/net/ipv4/ip_forward
1

スマホから接続してみます。

無事にAPが起動していることが確認できました。