📖

Raspberry Pi3A+ WiFiアクセスポイント&ルーター化

2023/03/11に公開

出先でもPCからRaspberry Pi3A+にSSH接続してプログラミングができる様にしたくて調べているとまさに答えがありました。

https://www.mikan-tech.net/entry/raspi-ap-sta-router

ということでほぼほぼトレースさせていただき無事環境を整えられました、ほんとに助かり感謝しかありません。

ので、この記事は自分にとっての備忘録です。

環境

OS

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Raspberry Pi3A+

スペック

$ cat /proc/cpuinfo
processor       : 0
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 2
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 3
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

Hardware        : BCM2835
Revision        : 9020e0
Serial          : 00000000d2a7151d
Model           : Raspberry Pi 3 Model A Plus Rev 1.0

Network

[PC(192.168.1.x)]<-->[(192.168.1.1)Pi3A+(192.168.0.76)]<-->[自宅Wi-Fi(192.168.0.1)]<-->インターネット

PC

IPアドレスは手動入力もしくは自動払い出し(RaspberryPi上のdhcpサーバ)

Raspberry Pi

IPアドレスはPC接続側も自宅Wi-Fi側も静的に設定

自宅Wi-Fi側のネットワーク(wlan0)設定

Raspberry Pi OSを標準的なインストールでWi-Fi設定しました。

AP(アクセスポイント)用仮想WiFiインターフェース(ap)の作成

変更前の設定

$ iw dev
phy#0
        Unnamed/non-netdev interface
                wdev 0x2
                addr [Raspberrypi Wi-FiのMacアドレス]
                type P2P-device
                txpower 31.00 dBm
        Interface wlan0
                ifindex 2
                wdev 0x1
                addr [Raspberrypi Wi-FiのMacアドレス]
                ssid [自宅Wi-FiのSSID]
                type managed
                channel 52 (5260 MHz), width: 80 MHz, center1: 5290 MHz
                txpower 31.00 dBm

ap0という仮想ネットワークを作成、割り当てるMACアドレスは物理ネットワークと同一を設定

$ sudo iw phy phy0 interface add ap0 type __ap
$ sudo ip link set ap0 address [Raspberrypi Wi-FiのMacアドレス]

設定後を確認

iw dev
phy#0
        Interface ap0
                ifindex 3
                wdev 0x3
                addr [Raspberrypi Wi-FiのMacアドレス]
                type AP
                channel 52 (5260 MHz), width: 80 MHz, center1: 5290 MHz
                txpower 31.00 dBm
        Unnamed/non-netdev interface
                wdev 0x2
                addr [Raspberrypi Wi-FiのMacアドレス]
                type P2P-device
                txpower 31.00 dBm
        Interface wlan0
                ifindex 2
                wdev 0x1
                addr [Raspberrypi Wi-FiのMacアドレス]
                ssid [自宅Wi-FiのSSID]
                type managed
                channel 52 (5260 MHz), width: 80 MHz, center1: 5290 MHz
                txpower 31.00 dBm

Interface ap0が無事作成されました

仮想ネットワークの恒久設定

上記のコマンド設定では再起動すると設定が消えてしまうようなので恒久設定するため/etc/udev/rules.d/99-ap0.rulesを作成し設定

$ sudo vi /etc/udev/rules.d/99-ap0.rules
SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="xx:xx:xx:xx:xx:xx", KERNEL=="phy0",RUN+="/sbin/iw phy phy0 interface add ap0 type __ap",RUN+="/bin/ip link set ap0 address xx:xx:xx:xx:xx:xx"

xx:xx:xx:xx:xx:xxはRaspberryPiのMacアドレス

必要パッケージ(hostapdとdnsmasq)のインストール

$ sudo apt install hostapd dnsmasq
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
  libfuse2
Use 'sudo apt autoremove' to remove it.
The following NEW packages will be installed:
  dnsmasq hostapd
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 796 kB of archives.
After this operation, 2,254 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bullseye/main arm64 hostapd arm64 2:2.9.0-21 [764 kB]
Get:2 http://deb.debian.org/debian bullseye/main arm64 dnsmasq all 2.85-1 [32.0 kB]
Fetched 796 kB in 0s (3,544 kB/s)
Selecting previously unselected package hostapd.
(Reading database ... 96822 files and directories currently installed.)
Preparing to unpack .../hostapd_2%3a2.9.0-21_arm64.deb ...
Unpacking hostapd (2:2.9.0-21) ...
Selecting previously unselected package dnsmasq.
Preparing to unpack .../dnsmasq_2.85-1_all.deb ...
Unpacking dnsmasq (2.85-1) ...
Setting up dnsmasq (2.85-1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/dnsmasq.service → /lib/systemd/system/dnsmasq.service.
Setting up hostapd (2:2.9.0-21) ...
Created symlink /etc/systemd/system/multi-user.target.wants/hostapd.service → /lib/systemd/system/hostapd.service.
Job for hostapd.service failed because the control process exited with error code.
See "systemctl status hostapd.service" and "journalctl -xe" for details.
Created symlink /etc/systemd/system/hostapd.service → /dev/null.
Processing triggers for man-db (2.9.4-2) ...

DHCPサーバーの設定(dnsmasq)

/etc/dnsmasq.confに設定追加

$ sudo vi /etc/dnsmasq.conf

アクセスポイント側(ap0)に接続してきたPCに払い出すIPアドレス(192.168.1.100〜192.168.1.110)の範囲を設定※とりあえず10台分

interface=ap0
dhcp-range=192.168.1.100,192.168.1.150,255.255.255.0,12h

アクセスポイント側IPアドレス設定

/etc/dhcpcd.confに設定

sudo vi /etc/dhcpcd.conf

静的なIPアドレス設定を追加

interface ap0
static ip_address=192.168.1.1/24
nohook wpa_supplicant

hostapdの設定

sudo vi /etc/hostapd/hostapd.conf

ファイルの内容

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=[SSIDパスフレーズ]
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

自動起動設定

$ sudo systemctl unmask hostapd.service
$ sudo systemctl enable hostapd.service

PCからの接続確認

設定したサービスを再起動

$ sudo systemctl restart dhcpcd.service
$ sudo systemctl restart hostapd.service
$ sudo systemctl restart dnsmasq.service

クライアント(PC、スマートフォン等)からアクセスポイントに接続

PCやスマートフォンからWi-Fiを検索し/etc/hostapd/hostapd.confで設定したSSIDを選択して接続、IPアドレスはPCの設定で自動にしていた場合は/etc/dnsmasq.confで設定したIPアドレスが払い出されます

無事接続できればアクセスポイント側のWi-Fi(ap0)に設定した192.168.1.1でRaspberry PiにSSH等で接続できます。

本来の目的はここまでで完了ですが、同時にインターネットにもアクセス可能にするためルーティング機能の有効化とIPマスカレード(NAPT)の設定をしました。

IPv4フォワーディングの有効化

$ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

恒久的な設定

routed-ap.confファイルを作成

$ sudo vi /etc/sysctl.d/routed-ap.conf

ファイル内容

net.ipv4.ip_forward=1

IPマスカレード(NAPT)の有効化

$ sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE

$ sudo iptables  -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  192.168.1.0/24      !192.168.1.0/24

恒久的な設定

netfilter-persistent iptables-persistentパッケージを使用することで設定を保存できるようです。

$ sudo apt install netfilter-persistent iptables-persistent
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
  libfuse2
Use 'sudo apt autoremove' to remove it.
The following NEW packages will be installed:
  iptables-persistent netfilter-persistent
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 23.4 kB of archives.
After this operation, 91.1 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bullseye/main arm64 netfilter-persistent all 1.0.15 [11.0 kB]
Get:2 http://deb.debian.org/debian bullseye/main arm64 iptables-persistent all 1.0.15 [12.4 kB]
Fetched 23.4 kB in 0s (109 kB/s)          
Preconfiguring packages ...
Selecting previously unselected package netfilter-persistent.
(Reading database ... 96885 files and directories currently installed.)
Preparing to unpack .../netfilter-persistent_1.0.15_all.deb ...
Unpacking netfilter-persistent (1.0.15) ...
Selecting previously unselected package iptables-persistent.
Preparing to unpack .../iptables-persistent_1.0.15_all.deb ...
Unpacking iptables-persistent (1.0.15) ...
Setting up netfilter-persistent (1.0.15) ...
Created symlink /etc/systemd/system/multi-user.target.wants/netfilter-persistent.service → /lib/systemd/system/netfilter-persistent.service.
Setting up iptables-persistent (1.0.15) ...
update-alternatives: using /lib/systemd/system/netfilter-persistent.service to provide /lib/systemd/system/iptables.service (iptables.service) in auto mode
Processing triggers for man-db (2.9.4-2) ...

念の為手動でも保存

$ sudo netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
$ ls /etc/iptables
rules.v4  rules.v6
$ sudo cat /etc/iptables/rules.v4
# Generated by iptables-save v1.8.7 on Sat Mar 11 14:44:37 2023
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
COMMIT

動作確認

アクセスポイント(Raspberry Pi)に接続した状態でPCでインターネットに接続できれば成功

Discussion