内蔵のWifiモジュール単体で、RaspberryPiのWANへのアクセス、クライアントからRaspberryPi APへの両接続を同時に実現する。
RaspberryPi3では5GHzが使えないため、ネット情報そのままだとうまく動作しない場合が多い。&最新OSだとNetworkManagerを使用しているため過去の知見が使えない。
このページで分かること
ap0 仮想インターフェースの作成とudevによる永続化、hostapd / dnsmasq / dhcpcd の役割分担・ Raspberry Pi 3 model B
5GHzが使えない理由と代替機種
Raspberry Pi 3 Model B の内蔵WiFiは Broadcom BCM43438(2.4GHz専用、IEEE 802.11n まで)。このため本ページでは hw_mode=g(2.4GHz)で設定する。5GHzのAPが必要なら Raspberry Pi 3 Model B+ 以降(BCM43455、ac対応)か、5GHz対応のUSB WiFiドングルを併用する。B+ 以降でも内蔵無線で「クライアント+AP」の同時運用はできる。
また Raspberry Pi OS は Bullseye まで dhcpcd、Bookworm 以降は NetworkManager が標準になる。本ページの dhcpcd.conf / dnsmasq.conf の記述は Bullseye 前提。Bookworm でそのまま流すと二重管理になり動作しないので注意する。
RaspberryPi Imagerなどで通常の方法でWifiアクセスポイントに接続できるようにする。
現状を確認。
$ iw dev
phy#0
Unnamed/non-netdev interface
wdev 0x2
addr XX:XX:XX:XX:XX:XX
type P2P-device
txpower 31.00 dBm
Interface wlan0
ifindex 3
wdev 0x1
addr YY:YY:YY:YY:YY:YY
ssid ルーターのSSID
type managed
channel 116 (5580 MHz), width: 80 MHz, center1: 5610 MHz
txpower 31.00 dBm
上記wlan0のMACアドレスYY:YY:YY:YY:YY:YY、もしくは任意のMACアドレスを使って下記コマンドを実行。
$ sudo iw phy phy0 interface add ap0 type __ap
$ sudo ip link set ap0 address de:a6:32:a8:e0:24
再度現状を確認。
$ iw dev
phy#0
Unnamed/non-netdev interface
wdev 0x3
addr XX:XX:XX:XX:XX:XX
type P2P-device
txpower 31.00 dBm
Interface ap0
ifindex 4
wdev 0x2
addr YY:YY:YY:YY:YY:YY
type AP
channel 7 (2442 MHz), width: 20 MHz, center1: 2442 MHz
txpower 31.00 dBm
Interface wlan0
ifindex 3
wdev 0x1
addr YY:YY:YY:YY:YY:YY
ssid ルーターのSSID
type managed
channel 7 (2442 MHz), width: 20 MHz, center1: 2442 MHz
txpower 31.00 dBm
type APのInterface ap0が追加される。
このままではap0は一時的で再起動すると消える。udevで永続化する。
$ sudo nano /etc/udev/rules.d/99-ap0.rules
SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="b8:27:eb:2b:99:1b", KERNEL=="phy0",RUN+="/sbin/iw phy phy0 interface add ap0 type __ap",RUN+="/bin/ip link set ap0 address b8:27:eb:2b:99:1b"
MACアドレスは上記で設定した値と同じもの。
$ sudo apt install hostapd dnsmasq
$ sudo nano /etc/dnsmasq.conf
interface=ap0
dhcp-range=192.168.10.10,192.168.10.100,255.255.255.0,12h
クライアントに192.168.10.10 - 192.168.10.100のIPを割り当てる。
$ sudo nano /etc/dhcpcd.conf
アクセスポイントのIPを明示的に指定。
interface ap0
static ip_address=192.168.10.1/24
nohook wpa_supplicant
$ sudo nano /etc/hostapd/hostapd.conf
2.4GHz
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=ap0
driver=nl80211
ssid= 希望する任意のSSID
hw_mode=g
country_code=JP
channel=11
ieee80211d=1
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_passphrase=希望する任意のパスワード
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
5GHz
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=ap0
driver=nl80211
ssid= 希望する任意のSSID
hw_mode=a
country_code=JP
channel=36
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=AardvarkBadgerHedgehog
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
$ sudo systemctl unmask hostapd.service
$ sudo systemctl enable hostapd.service
$ sudo systemctl restart dhcpcd.service
$ sudo systemctl restart hostapd.service
$ sudo systemctl restart dnsmasq.service
**起動確認とトラブルアプローチ**
- `sudo systemctl status hostapd` で active (running) を確認する。失敗しているなら `journalctl -u hostapd -e` で原因を見る。
- 1) wlan0 のMACアドレス 2) `/etc/udev/rules.d/99-ap0.rules` 内のMACアドレス 3) ap0 に設定したMACアドレス の3箇所が一致していないと、udev は ap0 を作成しても再起動後に消える。
- クライアントがAPに繋がらない・繋がってもすぐ切れる場合は `sudo iw dev wlan0 get power_save` で off になっているか確認する。接続直後に切れるのは省電力が原因のことが多い。
- 既存LANで dnsmasq が動いている環境は `interface=ap0` を明示しないと全インターフェースにIPを配ってしまう。本ページの設定の通り interface 指定を入れる。
- AP配下には 192.168.10.10〜100 が配られる。ルーター側(192.168.x.x 等)と被るIP帯をAP側に使うと、クライアントがどちらのゲートウェイへ向かうか混乱するため、別の帯(本例では192.168.10.0/24)にする。
$ sudo sysctl -w net.ipv4.ip_forward=1
再起動後も有効化する。
$ sudo nano /etc/sysctl.d/routed-ap.conf
net.ipv4.ip_forward=1
$ sudo apt install netfilter-persistent iptables-persistent
$ sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE
$ sudo netfilter-persistent save
iwconfig wlan0 power off
sudo vi /etc/rc.local
iwconfig wlan0 power off
もしくは
$ sudo iw dev wlan0 set power_save off
$ iw dev wlan0 get power_save
sudo nano /etc/dhcpcd.exit-hook
[ -n ${disable_pm} ] || return 0
if [ “${interface}” = “wlan0” ]; then
case ${reason} in
CARRIER | NOCARRIER) iwconfig ${interface} power off ;;
STOP | STOPPED) iwconfig ${interface} power on ;;
esac
fi
Q. Raspberry Pi 3 で5GHzのAPは作れない?
A. 内蔵WiFi(BCM43438)は2.4GHz専用なので作れない。5GHzを使いたい場合は Pi 3 Model B+ 以降か、対応USBドングルを追加する。本ページの5GHz設定例はB+以上で hw_mode=a を有効にする形になる。
Q. 再起動するとAP(ap0)が消える。
A. udevルールが効いていない可能性が高い。/etc/udev/rules.d/99-ap0.rules のMACアドレスが ip link で確認した wlan0 のMACと一致しているか見直す。ルール作成後は sudo udevadm control --reload-rules を実行する。
Q. スマホから接続できるのにネットに繋がらない。
A. IPフォワードとマスカレードの両方が必要。sudo sysctl -w net.ipv4.ip_forward=1 を実行し、sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE を設定して sudo netfilter-persistent save で保存する。設定漏れだとAPには繋がるが外へ出られない。
Q. Bookworm 以降でも同じ手順で動く?
A. 動かないことが多い。Bookworm は NetworkManager 標準で、dhcpcd.conf の記述が反映されない。nmcli でAP用の接続を作るか、Raspberry Pi OS Lite(Bullseye)を入れ直す。
※ 本ページのAmazonリンクにはアフィリエイトタグ(toobf6-22)が付いている。
🤖 このページにはAIエージェント(ノア)による編集・加筆が含まれます。内容の正確性は保証できないため、重要な判断は一次情報でご確認ください。