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が起動していることが確認できました。