みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

Raspberry PiをWiFiアクセスポイント化してスタンドアロン運用

2023/6/18 設定ファイル(hostapd.conf)の一部に誤りがあったのを修正しました

Raspberry Piに限らず、今どきのコンピュータはインターネットにつないで使うことが多いです。

でもせっかく小さいRaspberry Piのこと、外で使ったり持ち運んだり、WiFiやLANケーブルのないところで使いたい場合がありますよね😉

そのようにスタンドアロンで使うときでもスマホやパソコンとWiFiでローカル通信するために、 Raspberry PiWiFiアクセスポイントにできます。

すると、スマホやパソコンをおうちのWiFiルーターにつながず、直接Raspberry PiのWiFiアクセスポイントに接続できます。

別でWiFiルーターを用意せずにSSHログインしたり、Raspberry Pi上のローカルWebアプリにアクセスできます。

便利ですね🥰早速やってみましょう。

この記事ではRaspberry Pi OS Lite (CUI版) bullseyeを使用しています。Desktop(GUI)版などNetwork Managerが入っている環境ではこの方法は使えないと思いますのでご注意ください。

※家のWiFiにつなぎながらアクセスポイント機能も同時使用したい場合はこちら↓

www.mikan-tech.net

ネットワーク構成

上の図の通り、Raspberry PiをWiFiアクセスポイントにします。

SSIDMIKAN_NO_WIFIパスワードMIKAN_NO_PASSWORDとします。

また、Raspberry PiのIPアドレス192.168.249.1にしました。

接続しに来るスマホやパソコンにIPアドレスを配布するためにRaspberry PiにDHCPサーバー機能ももたせます。 DHCPで配布するアドレスは192.168.249.50192.168.249.150にしました。 (100台もつなぐことはないので多すぎですが…)

設定方法

ソフトウェアアクセスポイント機能を実現するhostapdと、 DNSフォワーダー&DHCPサーバー機能を持つdnsmasqを使用します。

なお、設定時はRaspberry Piをインターネットに接続する必要があります。 (hostapdとdnsmasqをインストールするため)

WiFi設定を変更してしまうので、LANケーブルでインターネットに接続し、有線LAN経由でSSHでログインするとよいでしょう。

必要なパッケージのインストール

まずはhostapddnsmasqをインストールしましょう。

$ sudo apt install hostapd dnsmasq

これだけでインストールできます。簡単ですね。

DHCPサーバーの設定(dnsmasq)

dnsmasqの設定ファイル/etc/dnsmasq.confを編集します。 例えばvimで編集するには次のようにします。

$ sudo vim /etc/dnsmasq.conf

ファイルの最後に以下の行を追加します。

interface=wlan0
dhcp-range=192.168.249.50,192.168.249.150,255.255.255.0,12h

これで、無線LAN(wlan0)でdnsmasqのDHCPサーバー機能が有効になります。

有線LAN(eth0)には影響しませんのでご安心ください。

DHCPクライアントの設定(dhcpcd)

続いて、自分自身のIPアドレスを固定するために、/etc/dhcpcd.confを編集します。 このファイルはDHCPクライアント機能の設定ファイルです。

$ sudo vim /etc/dhcpcd.conf

ファイルの最後に以下の2行を追加しましょう。

interface wlan0
static ip_address=192.168.249.1/24

これで、無線LAN側のIPアドレスが192.168.249.1に固定されます。

また、有線LAN(eth0)はこれまで通りDHCPが使えます。

hostapdの設定

続いて、hostapdの設定を行います。設定ファイルは自動では生成されないようです。 自分で/etc/hostapd/hostapd.confというファイルを作成しましょう。例えばvimだと、次のコマンドです。

$ sudo vim /etc/hostapd/hostapd.conf

ファイルの内容は次のようにします。

ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=wlan0
driver=nl80211
ssid=MIKAN_NO_WIFI
hw_mode=g
country_code=JP
channel=11
ieee80211d=1
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_passphrase=MIKAN_NO_PASSWORD
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

hw_mode=gとしていますが、これは2.4GHz帯のIEEE802.11gの通信方式を指定しています。 channel=11で11chを使っていますが、1~13chが使えます(Raspberry Piでは14chは使えないみたい?)。

また、hw_mode=aとすると、5GHz帯のIEEE802.11aが使えますが、法規制上レーダーとの干渉を防ぐための機能を有効にする必要があるなど 設定を見直す必要があります。なお、hw_modeを変えた場合はchannelも5GHz帯のものに合わせて変える必要があります。

ssidの行とwpa_passphraseの行は自分のSSIDやパスワードにあわせて変えてください。

hostapdはaptでインストールしても自動では有効になりません。 以下のコマンドで起動時に自動でhostapdが立ち上がるように設定しましょう。

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

おめでとうございます。これで設定が完了です!

WiFiの有効化

Raspberry Piのインストール直後はWiFiが無効になっています。 国ごとに電波の規制が異なるので、国コードを設定するまでは電波を出さないためだと思います。 もしまだWiFiの有効化をしていない場合はここで有効にしましょう。

まずは/etc/wpa_supplicant/wpa_supplicant.confを編集します。

$ sudo vim /etc/wpa_supplicant/wpa_supplicant.conf

このファイルに次の行を追加します。

country=JP

ファイルを保存後、次のコマンドでWiFiを有効にします。

$ sudo rfkill unblock wifi

これでWiFiが有効になります。

動作確認の準備

動作確認のときに分かりやすいので、WebサーバーのNginxをインストールします。

ブラウザでアクセスすると、Nginxのデフォルトページが見えます。

$ sudo apt install nginx

再起動

ここまでくれば、さっそく再起動して動作確認しましょう。

$ sudo reboot

動作確認

再起動後はインターネット接続は不要です

再起動すればWiFiアクセスポイントが有効になっているはずです。スマホやパソコンからWiFiアクセスポイントを探してみます。

うまくいけば、このようにWiFiアクセスポイントが見えるはずです👏パスワードを入力すると接続できます。

接続できれば、ブラウザでhttp://192.168.249.1/ または http://raspberrypi.local/ (ホスト名を変更した場合はrapberrypiの部分を設定したホスト名にする)でアクセスできます。

このように、Nginxのデフォルトページが見えました。おめでとうございます!

となるはずでしたが、私の場合なぜかこれがうまくいきませんでした😢 (Raspberry Pi 4 + Raspberry Pi OS Lite (bullseye)で確認)

おまけ:hostapdが途中で止まる?

動かない場合は/var/log/syslogにエラーが出ていないか見てみましょう。

$ less /var/log/syslog

私の場合、特にエラーは出ていなかったのですが、次のようになっていました。

Sep 14 22:14:31 raspberrypi hostapd[491]: Configuration file: /etc/hostapd/hostapd.conf
Sep 14 22:14:31 raspberrypi systemd[1]: Started User Login Management.
Sep 14 22:14:31 raspberrypi dhcpcd-run-hooks[514]: wlan0: starting wpa_supplicant
Sep 14 22:14:31 raspberrypi hostapd[491]: wlan0: interface state UNINITIALIZED->COUNTRY_UPDATE
Sep 14 22:14:31 raspberrypi systemd[1]: Started Access point and authentication server for Wi-Fi and Ethernet.
Sep 14 22:14:31 raspberrypi rpi-eeprom-update[408]: Skipping automatic bootloader upgrade. current 1599135103 >= min 1599135103
Sep 14 22:14:31 raspberrypi kernel: [    6.778650] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready

この時間以降hostapdのログは出ていません。途中まではうまく起動しているように思いますが…。 wlan0がhostapdのあとにリンクアップしているのも気になります。

手動でhostapdを再起動してみました。

$ sudo systemctl restart hostapd.service

すると、次のようなログが出て、iPhoneからアクセスポイントが見えました。

Sep 14 22:18:17 raspberrypi hostapd[810]: Configuration file: /etc/hostapd/hostapd.conf
Sep 14 22:18:17 raspberrypi hostapd[810]: wlan0: interface state UNINITIALIZED->COUNTRY_UPDATE
Sep 14 22:18:17 raspberrypi hostapd[810]: Using interface wlan0 with hwaddr dc:a6:32:a8:e0:24 and ssid "MIKAN_NO_WIFI"
Sep 14 22:18:17 raspberrypi dhcpcd[445]: wlan0: carrier acquired
Sep 14 22:18:17 raspberrypi kernel: [  219.124302] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
Sep 14 22:18:17 raspberrypi hostapd[810]: wlan0: interface state COUNTRY_UPDATE->ENABLED
Sep 14 22:18:17 raspberrypi hostapd[810]: wlan0: AP-ENABLED

/etc/default/hostapdを編集してhostapdの詳しいデバッグログを有効にしてみると、どうもwpa_supplicantより先にhostapdが起動しているのが良くなさそう。その割にエラーにならないのは謎ですが…。

どうするのがスマートなのかよく分かりませんでしたが、とりあえず横着して単純にウェイトを入れてみました。

$ sudo vim /lib/systemd/system/hostapd.service

このファイルのExecStart=の次の行に、以下を追加しました。

ExecStartPre=/bin/sleep 5

これで、hostapdが普通より5秒遅れて起動します😂

私の場合はこれで何回再起動してもアクセスポイントが有効になりました。

もし同じような目に合っている方がいらっしゃれば、参考にしてください。

参考

Raspberry PiはNTPで時刻合わせをするため、スタンドアロン運用すると時計が狂います。 スタンドアロン運用でも時刻を保持するには、以下の記事のようにRTCを使いましょう。

www.mikan-tech.net

家のWiFiにつなぎながらアクセスポイント機能も有効にする、「アクセスポイント+クライアント機能同時使用(AP+STA)」の場合はこちら。

www.mikan-tech.net