ネット環境のない部屋にてラズパイによるデータ取得をする場合、データの回収にこまることがある。これまではそのためだけに無線ホスト(簡単には無線ルーター)をおいて、ラズパイをそこに無線または有線でつないで、別の無線端末(スマホとか)からホスト経由でsshとかウェブインターフェースで接続し、データ回収していた。ラズパイが無線ホストになってくれれば万事解決で話は早いんだけど、これまでラズパイのホスト化には成功していなかった。
今回久しぶりにトライしたところ、無事に構築できた。オマケとしてラズパイ自体をルーターとしてつかうことも可能となったので記録しておく。
やることは
- dhcpcdを設定して無線LAN(wlan0)をstaticアドレスにする。
- hostapdをインストールしてアクセスポイントにする。
- dnsmasqをインストールしてDHCPサーバを建てる。
- iptablesでポートフォワーディングすることでルーター化する。
最後の部分は今回の目的ではあくまでオマケだ。
設定としては無線ホストのアドレスを192.168.10.1とし、クライアントは192.168.10.11から192.168.10.50までにする。
DNSサーバはgoogleの8.8.8.8を利用。
使用したラズパイはRaspberry Pi 3B+
OSはRaspberry OS (64bitバージョン)Debian Bullseye
まずはdhcpcd
/etc/dhcpcd.confを編集
interface wlan0 static ip_address=192.168.10.1/24
次にhosted
$ sudo apt install hostapd $ sudo cp /usr/share/doc/hostapd/examples/hostapd.conf /etc/hostapd/hostapd.conf
/etc/hostapd/hostapd.confを編集
hw_mode=g channel=6 wpa=2 auth_algs=1 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP ssid=kurotest wpa_passphrase=Hogehoge
かなかな長大なファイルだが、入力した&確認した&コメントを外したのは上記くらいだった。
/etc/default/hostapdを編集
DAEMON_CONF="/etc/hostapd/hostapd.conf"
hostapdを起動
$ sudo systemctl unmask hostapd $ sudo systemctl restart hostapd
DHCPサーバーとしてはisc-dhcp-serverをインストールして使っているページが多かったのだが、うちの環境ではうまく動かなかった。(起動に失敗する)代わりにdnsmasqを使う
$ sudo apt install -y dnsmasq
/etc/dnsmasq.d/wlan0.confを編集
interface = wlan0 dhcp-range = 192.168.10.11, 192.168.10.50, 255.255.255.0, 24h dhcp-option = option:router, 192.168.10.1 dhcp-option = option:dns-server, 8.8.8.8 listen-address = 127.0.0.1 log-queries log-dhcp
$ sudo systemctl restart dnsmasq
ここまででラズパイを無線LANアクセスポイントかつDHCPサーバとして使えるようになったので、他の端末からラズパイに無線で直接つながって、アドレスも自動で配布してもらってアクセスできるようになった。
以下はついでなのでルーターとして有線LANの側とも橋渡ししてもらえるようにしておく。有線側がネットワークにつながっていなくてもDHCPを割り振ってもらえるようにしている都合でブリッジではなくルーターモードだ。
まずは/etc/sysctl.confを編集
net.ipv4.ip_forward=1
ここのコメントを外す。
次に
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
これでつながったはずなのだが、これでは起動するたびに同じコマンドを入れる必要があるため、
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
として
/etc/rc.localの最後の行「exit 0」の前に
iptables-restore < /etc/iptables.ipv4.nat
を入れておく。
以上。
追記
iptablesの設定をrc.localに入れるとどうもhostapdがうまく機能しなくなる。
一旦は外しておく。
外に出ることが必要なときだけコマンドであとから設定してやることにする。あくまでルーター化はおまけなので。