Raspberry Pi 3 を無線 LAN アクセスポイント化する備忘録です.
梅雨時期だからでしょうか.なぜか色々な機材が壊れてその対応でアタフタしているのですが,モバイルバッテリーで動くアクセスポイントが一つ手元にあると便利だよなぁ……ということで,手元に余っていた Raspberry pi model 3 で作ってみることにしました.
なお,作るのは Wifi ルーターではなくて,Wifi コンバーターです.ルーティングとか NAPT はやりません(Wifi ルーターを作る記事はよく見かけますが,コンバーターは見たことない).
ベース OS
素直にいくなら Raspbian だと思いますが,今回は DietPi の最小構成を使います.理由は,
- 経験的ではありますがとても安定して動く.
- 最小構成がとても小さい.
- SDカードを別のPCに刺し,dietpi.txt の該当欄を編集することでネットワークのアドレス等を簡単に設定できる.
からです.なお,最小構成ではなくて,WiFi-HotSpot オプションを選択するという手もありましたが,色々仕様に合わないところが多いので,今回は使いませんでした(これ,無線LANアクセスポイント化と言うより,簡易無線LANアクセスルーター化だと思う).
インストールの詳細については,過去記事
の通りで,さらに,これに加えて,以下のコマンドを最初に追加インストールしました.インストールは単に「apt install ****」ですね.
- エディタ他: vim, less
- ネットワーク系: bmon, iftop, dnsutils, net-tools
有線LANと無線LANのブリッジ
まず,必要なソフトウェアをインストールします.
# apt install bridge-utils
また,無線LANを有効化します./etc/modprobe.d/disable_wifi.conf を全てコメントアウトします.
# vi /etc/modprobe.d/disable_wifi.conf #blacklist brcmutil #blacklist brcmfmac #blacklist cfg80211
なお,dietpi-config → 7: Network Options: Adapters → Onboard Wifi: [On] の様に選ぶことで無線LANを有効にできるはずなのですが,なぜだかうまくいかない.バグなのかもしれません.
さらに,/etc/network/interface を以下の通り変更しました.
# cat /etc/network/interfaces # Location: /etc/network/interfaces # Please modify network settings via: dietpi-config # Or create your own drop-ins in: /etc/network/interfaces.d/ # Drop-in configs source interfaces.d/* # Local auto lo iface lo inet loopback # Ethernet allow-hotplug eth0 iface eth0 inet manual # WiFi allow-hotplug wlan0 iface wlan0 inet manual # wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf # Bridge auto br0 iface br0 inet dhcp bridge_ports eth0 # address 192.168.0.100 # netmask 255.255.255.0 # gateway 192.168.0.1 # dns-nameservers 8.8.8.8 8.8.4.4
また,/etc/sysctl.d/r.conf として以下の内容のファイルを配置しました.これななくても構いませんが,あとでルーティングなんかが必要になったときのためです.
# cat /etc/sysctl.d/r.conf net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 net.ipv6.conf.default.forwarding = 0
なお,設定項目の概要は,
に簡単な説明があります.
再起動して,ブリッジインターフェースにきちんと IP アドレス等が割り当たっていることを確かめます.
# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.100 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::ba20:efff:fee5:eeec prefixlen 64 scopeid 0x20<link> ether b8:27:eb:15:ee:9c txqueuelen 1000 (イーサネット) RX packets 317 bytes 48703 (47.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 171 bytes 21601 (21.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether b8:27:eb:15:ee:9c txqueuelen 1000 (イーサネット) RX packets 317 bytes 48703 (47.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 171 bytes 23349 (22.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (ローカルループバック) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether b8:27:eb:40:bb:c9 txqueuelen 1000 (イーサネット) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # brctl show bridge name bridge id STP enabled interfaces br0 8000.b827eb15ee9c no eth0
問題なく設定できている様です.
Wifi HotSpot 化
hotspot 化のために必要なパッケージを追加します.
# apt install hostapd
また,設定ファイルを以下の内容で /etc/hostapd/hostapd.conf として配置しました.
# cat hostapd.conf interface=wlan0 bridge=br0 driver=nl80211 ssid=DietPi-HotSpot country_code=JP hw_mode=g channel=3 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=dietpihotspot wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP ieee80211n=1
各設定項目の概略は以下を見ればだいたい意味が分かるかと.
アクセスポイントとしてきちんと動くかどうかテストしてみます.
# hostapd -d /etc/hostapd/hostapd.conf
これで,ノートPCなどから,
- SSID: DietPi-HotSpot
- PASSWORD: dietpihotspot
として見えます.試しに接続してみてネットにつながれば動作確認終了です.
自動起動
自動起動させるために systemd の設定ファイルを /etc/systemd/system/hostapd.service として配置します.ただし,なぜだか初期状態だとこのファイルは /dev/null へのシンボリックリンクとなっています.
これはどうも systemd からは「マスク」されたサービスだと認識されるみたいで,まず,以下の様にマスクを解除しなければなりません.
# systemctl unmask hostapd.service
解除後,/etc/systemd/system/hostapd.service を以下の内容で配置します.
# cat /etc/systemd/system/hostapd.service [Unit] Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator After=network.target [Service] ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf [Install] WantedBy=multi-user.target
その後,
# systemctl enable hostapd.service # systemctl start hostapd.service
としてやることで,自動起動するようになります.
速度は最大で 5MByte/s(40Mbyte/s) くらいしか出ませんが,モバイルバッテリーでそれなりの時間動きますし,中身は Linux なので,やろうと思えば色々できるってのが良いところなんじゃないかなと思います.
以上!