はじめに
では、NetworkManager を使って Raspberry Pi をアクセスポイントとして動作させる方法を紹介しました。
調べてみた感じ、NetworkManager を使わずに hostapd や dnsmasq を用いて Raspberry Pi をアクセスポイントとして動作させる方法もあったので、そっちについてもまとめようと思います。
環境
- ハードウェア:
Raspberry Pi 5 - OS:
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
前提
まず、ワイヤレス通信ができるようになっている必要があります。
$ nmcli radio wifi
の結果が disabled だった場合、Raspberry Pi のワイヤレス通信に関する国の設定ができていないので、以下のコマンドで設定します。
$ sudo raspi-config nonint do_wifi_country JP
次に、今回は NetworkManager を使わずに、RaspberryPi をアクセスポイントにしたいので、対象のネットワークインターフェースを NetworkManager の管理から外します。
※ 今回の例では、対象のワイヤレス通信用のネットワークインターフェースを wlan0 とします。
$ nmcli device status
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected Wired connection 1
lo loopback connected (externally) lo
wlan0 wifi disconnected --
$ sudo nmcli device set wlan0 managed no
$ nmcli device status
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected Wired connection 1
lo loopback connected (externally) lo
wlan0 wifi unmanaged --
reboot した際に元に戻ってしまうのが嫌であれば設定ファイルに記述しておきます。
[keyfile]
unmanaged-devices=interface-name:wlan0
$ sudo systemctl restart NetworkManager
$ nmcli device status
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected Wired connection 1
lo loopback connected (externally) lo
wlan0 wifi unmanaged --
設定
hostapd の設定をする
まず、Raspberry Pi をアクセスポイント化するために hostapd の設定をします。
hostapd is a user space daemon for access point and authentication servers.
に書かれているとおり、主にアクセスポイントとして動かすためのデーモンプロセスを制御したり、認証周りの設定をするためのパッケージです。
$ sudo apt update && sudo apt install -y hostapd
以下の設定ファイルは、日本で動かすために最小限のものになります。(※ ssid, password に関しては適当に仮置きしています。)
ほかにもかなりたくさんのオプションがありますが、/usr/share/doc/hostapd/examples/hostapd.conf に用意されている example が参考になります。
interface=wlan0
driver=nl80211
ssid=my-ap
country_code=JP
# Operation mode (a = IEEE 802.11a (5 GHz), b = IEEE 802.11b (2.4 GHz),
# g = IEEE 802.11g (2.4 GHz), ad = IEEE 802.11ad (60 GHz); a/g options are used
# with IEEE 802.11n (HT), too, to specify band). For IEEE 802.11ac (VHT), this
hw_mode=g
channel=1
# 0 = accept unless in deny list
# 1 = deny unless in accept list
# 2 = use external RADIUS server (accept/deny lists are searched first)
macaddr_acl=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=password
初期状態だとユニットがマスクされていて、/dev/null へのシンボリックリンクになっているので、外して起動します。
$ sudo systemctl unmask hostapd.service
$ sudo systemctl start hostapd.service
dnsmasq
hostapd には、DHCP server としての機能が備わっていないので、dnsmasq を使います。
$ sudo apt update && sudo apt install -y dnsmasq
今回はプライベートネットワーク内のみでの通信を想定しているため、DNS server の IP アドレスやゲートウェイの設定はせずに、動的に割り当てる IP アドレスの範囲のみを指定しています。
構築するサブネットの IP アドレスの範囲は一旦なんでもいいので、5つしか割り当てることができないプライベートネットワークなってしまいますが、192.168.10.1/24 ~ 192.168.10.5/24 として、wlan0 には 192.168.10.1/24 を割り当てることにします。
最後の 12h は IP アドレスのリース時間です。
interface=wlan0
dhcp-range=192.168.10.1,192.168.10.5,12h
$ sudo systemctl restart dnsmasq.service
固定IPを割り当てる
上に記載した通り wlan0 には固定で 192.168.10.1/24 を割り当てます。
ここは NetworkManager を使って固定 IP を割り当てればいいのかなと思っていたのですが、
色々と競合をしてしまうようだったので、networkd を使って設定しました。
[Match]
Name=wlan0
[Network]
Address=192.168.10.1/24
$ sudo systemctl restart systemd-networkd
再起動後に wlan0 に対して 192.168.10.1/24 が割り当たっていることを確認できます。
$ ip addr show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
inet 192.168.10.1/24 brd 192.168.10.255 scope global wlan0
valid_lft forever preferred_lft forever
inet6 fe80::2ecf:67ff:fe01:b232/64 scope link
valid_lft forever preferred_lft forever
確認
ここまでの設定が完了すると、Raspberyy Pi をアクセスポイントとして動かすことができるようになります。
他の Rasbperry Pi から探して繋いでみます。
$ nmcli device wifi
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
XX:XX:XX:XX:XX:XX my-ap Infra 1 65 Mbit/s 55 ▂▄__ WPA2
$ sudo nmcli device wifi connect my-ap --ask
Password: ••••••••
Device 'wlan0' successfully activated with '151da5ed-e15c-41f7-a211-77360de6bdb5'.
うまく繋がったので、Wi-Fi のクライアントとして動作する、この Rasbperry Pi のネットワークインターフェースに、先ほどの範囲からIPアドレスが割り当てられているかを見てみます。
$ ip addr show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
inet 192.168.10.4/24 brd 192.168.10.255 scope global dynamic noprefixroute wlan0
valid_lft 43063sec preferred_lft 43063sec
inet6 fe80::4338:8831:af35:282c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
問題なく 192.168.10.4/24 が割り当てられています。
最後に、アクセスポイントに対して問題なく通信ができるかを ping して確認しておきます。
$ ping -c 3 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=8.31 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=6.30 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=8.01 ms
--- 192.168.10.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 6.304/7.540/8.308/0.882 ms