Raspberry Pi 3 で無線ルータを作る話。brcmfmac な wifi の capability を見てみる。
valid interface combinations:
* #{ managed } <= 1, #{ P2P-device } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 2
* #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
total <= 4, #channels <= 1
AP と managed 両方起動させられそう。試してみるとできる。rc.local
に次のように追記して netdev を用意する。
iw dev wlan0 interface add ap0 type __ap
実は wpa_supplicant
の mode=2
というのがあり、これで AP を作れる。/etc/network/interfaces
への書き方は /usr/share/doc/wpasupplicant/README.Debian.gz
に書いてある(Webにはあまり情報が出ていない)。具体的にはこんなファイルになる。
allow-hotplug ap0
iface ap0 inet manual
wpa-ssid rpi3masq
wpa-mode 2
wpa-key-mgmt WPA-PSK
wpa-psk "some preshared key"
static IPv4 addess を使うけれども、raspbian の歴史的経緯により dhcpcd.conf にアドレスを書く(さもないと IPv4 link local address も割り当てられて面倒を引き起こす)。dhcpcd は file include の仕掛けがないようなので、既存のファイルに追記する。
interface ap0
static ip_address 192.168.87.1/24
net.ipv4.ip_forward=1
dnsmasq
を追加する。
dhcp-range=192.168.87.20,192.168.87.200,24
dhcp-option=option:router,192.168.87.1
iptables-persistent
パッケージを追加する。
iptables -A FORWARD -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o ap0 -j REJECT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
netfilter-persistent save
無線の周波数を国の割り当てに合わせておきましょう。/etc/default/crda
で REGDOMAIN=JP
を入れます。
最後にシステムを再起動させて、masquerade が動作することを確認する。
雑談(1)
hostapd で ap0 を制御する方式も試してみたけれど、結論から言うと、うまく動作させられなかった。具体的には kernel module が stack trace を吐き出して、association をうまく処理できなかった様子(未調査)。
brcmfmac: brcmf_update_bss_info: wl dtim_assoc failed (-52)
wpa_supplicant で構成した場合も、wlan0 を associate したまま ap0 を disable_network させるとかやると、同じバグを踏む様子。
雑談(2)
話の発端はこのスライド。ESP8266が特定のdhcpdからアドレスを取得できない問題への解決法のひとつ、という内容。内容自体は「そんなこともあるのか」という話だったけれど、raspi 3にUSB wifi dongleを追加していたのが、どうにも引っかかった。追加無しでできないのかと。というわけで、今回の記事。