ラズパイでWiFiルーターを作る

手元に大量にある使うことのなくなったSDカードの有効活用もかねて、今回はRaspberry PiでWiFiルーターを作ってみたいと思います。

今回使用するSDカードは、店頭でも見かけることが少なくなった4GBのSDカードです。単機能のWiFiルーターとして立ち上げるだけならば十分なサイズです。

言多の備忘録にメモしたラズパイの無線ルーター化を参考に hostapd というサービスを使用してWiFiルーターとして使用します。

元記事である公式サイトの Raspberry Pi Documentation には非常に良い資料が集まっています。今回の手順は「Setting up a Routed Wireless Access Point」ほぼそのままとなっています。

ネットワーク構成

今回、構成するネットワークは既存のネットワークに Raspberry Pi をWiFiアクセスポイントとして接続し、新しくセカンダリネットワークを構築できるようにします。

セカンダリネットワークのIP払い出しは Raspberry Pi 内の DHCPサーバから行います。

追加パッケージの導入

アクセスポイントとして、 hostapd をインストールします。

その前に、いつものおまじないから始めます。

pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt upgrade
pi@raspberrypi:~ $ sudo apt install hostapd

hostapd を有効にして、起動時からサービスを開始するように設定します。

pi@raspberrypi:~ $ sudo systemctl unmask hostapd
pi@raspberrypi:~ $ sudo systemctl enable hostapd

セカンダリネットワークにDNSやDHCPを提供するために、 dnsmasq をインストールします。

pi@raspberrypi:~ $ sudo apt install dnsmasq

最後に、netfilter-persistentとそのプラグインiptables-persistentをインストールします。
このユーティリティは、ファイアウォールルールを保存し、Raspberry Pi の起動時に設定を復元するために使用します。

pi@raspberrypi:~ $ sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent

ネットワークルーターの設定

ネットワーク構成図に示したように、今回のアクセスポイントはセカンダリネットワークに192.168.4.0/24を使用する前提とします。そこで、アクセスポイントのIPアドレスに192.168.4.1を設定するために、/etc/dhcpcd.conf に静的IPとして192.168.4.1 を指定します。

pi@raspberrypi:~ $ sudo nano /etc/dhcpcd.conf

設定ファイルの最下行に下記を加えます。

interface wlan0
	static ip_address=192.168.4.1/24
	nohook wpa_supplicant

次に、WiFiで接続されたセカンダリネットワーク (192.168.4.0/24) の機器がインターネットに接続できるように、ルーティングを設定します。

pi@raspberrypi:~ $ sudo nano /etc/sysctl.d/routed-ap.conf

新規作成となる設定ファイルに下記の内容を記述します。

# Enable IPv4 routing
net.ipv4.ip_forward=1

ルーティングを有効にすると、セカンダリネットワーク(192.168.4.0/24)の機器はインターネットに向かうメインルーターに到達できるようになります。

次にIPマスカレードを設定することで、WiFiで接続されたセカンダリネットワーク (192.168.4.0/24) の機器からの通信は、アクセスポイントからの通信として認識されるようになります。

pi@raspberrypi:~ $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

設定した内容を保存します。

pi@raspberrypi:~ $ sudo netfilter-persistent save

続けて、dnsmasq の設定を行います。今回はオリジナルのファイルを保存し、新規のファイルとして /etc/dnsmasq.conf を作成します。

pi@raspberrypi:~ $ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
pi@raspberrypi:~ $ sudo nano /etc/dnsmasq.conf

設定ファイルの内容は下記のみとします。

interface=wlan0 # Listening interface
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
                # Pool of IP addresses served via DHCP
domain=wlan     # Local wireless DNS domain
address=/gw.wlan/192.168.4.1
                # Alias for this router

無線の有効化

現在の無線の状態を確認します。

pi@raspberrypi:~ $ sudo rfkill
ID TYPE      DEVICE      SOFT      HARD
 0 wlan      phy0     blocked unblocked
 1 bluetooth hci0   unblocked unblocked

WiFiがブロック状態なので有効にします。

pi@raspberrypi:~ $ sudo rfkill unblock wlan

アクセスポイントの設定

いよいよ最後にアクセスポイントの設定を行います。今回は5GHz帯の36chを使用します。また、バンド幅には80MHzを設定することで快適なWiFiが利用できるようにします。

pi@raspberrypi:~ $ sudo nano /etc/hostapd/hostapd.conf

/etc/hostapd/hostapd.conf に記述するSSIDと wpa_passphrase は任意に変更してください。ただし、 wpa_passphrase は8~64文字にするようにしてください。

interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
macaddr_acl=0
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
ieee80211d=1
ieee80211h=1
country_code=JP
hw_mode=a
channel=36
ht_capab=[HT40-][HT40+][SHORT-GI-20][SHORT-GI-40]
vht_capab=[SHORT-GI-80]
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42
beacon_int=100
ignore_broadcast_ssid=0
auth_algs=1
wpa=2
ssid=hogehoge_ap_ac
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP

/etc/hostapd/hostapd.conf の記述を終えたら再起動を行います。

pi@raspberrypi:~ $ sudo systemctl reboot

さきほどまで設定した内容はRaspberry Pi が起動すると自動でサービス起動するようになっています。

hostapd が無事に起動しているか確認します。

pi@raspberrypi:~ $ sudo hostapd_cli -i wlan0 status
state=ENABLED
phy=phy0
freq=5180
num_sta_non_erp=0
num_sta_no_short_slot_time=0
num_sta_no_short_preamble=0
olbc=0
num_sta_ht_no_gf=0
num_sta_no_ht=0
num_sta_ht_20_mhz=0
num_sta_ht40_intolerant=0
olbc_ht=0
ht_op_mode=0x0
cac_time_seconds=0
cac_time_left_seconds=N/A
channel=36
secondary_channel=1
ieee80211n=1
ieee80211ac=1
ieee80211ax=0
beacon_int=100
dtim_period=2
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42
vht_oper_centr_freq_seg1_idx=0
vht_caps_info=00000020
rx_vht_mcs_map=fffe
tx_vht_mcs_map=fffe
ht_caps_info=006e
ht_mcs_bitmask=ff000000000000000000
supported_rates=0c 12 18 24 30 48 60 6c
max_txpower=20
bss[0]=wlan0
bssid[0]=xx:xx:xx:xx:xx:xx
ssid[0]=hogehoge_ap_ac
num_sta[0]=0

以上で、Raspberry Pi をアクセスポイントとして利用することができるようになりました。