2023/6/18 設定ファイル(hostapd.conf)の一部に誤りがあったのを修正しました
Raspberry Piに限らず、今どきのコンピュータはインターネットにつないで使うことが多いです。
でもせっかく小さいRaspberry Piのこと、外で使ったり持ち運んだり、WiFiやLANケーブルのないところで使いたい場合がありますよね😉
そのようにスタンドアロンで使うときでもスマホやパソコンとWiFiでローカル通信するために、 Raspberry PiをWiFiアクセスポイントにできます。
すると、スマホやパソコンをおうちのWiFiルーターにつながず、直接Raspberry PiのWiFiアクセスポイントに接続できます。
別でWiFiルーターを用意せずにSSHログインしたり、Raspberry Pi上のローカルWebアプリにアクセスできます。
便利ですね🥰早速やってみましょう。
この記事ではRaspberry Pi OS Lite (CUI版) bullseyeを使用しています。Desktop(GUI)版などNetwork Managerが入っている環境ではこの方法は使えないと思いますのでご注意ください。
※家のWiFiにつなぎながらアクセスポイント機能も同時使用したい場合はこちら↓
ネットワーク構成
上の図の通り、Raspberry PiをWiFiアクセスポイントにします。
SSIDはMIKAN_NO_WIFI
、パスワードはMIKAN_NO_PASSWORD
とします。
また、Raspberry PiのIPアドレスは192.168.249.1
にしました。
接続しに来るスマホやパソコンにIPアドレスを配布するためにRaspberry PiにDHCPサーバー機能ももたせます。
DHCPで配布するアドレスは192.168.249.50
~192.168.249.150
にしました。
(100台もつなぐことはないので多すぎですが…)
設定方法
ソフトウェアアクセスポイント機能を実現するhostapdと、 DNSフォワーダー&DHCPサーバー機能を持つdnsmasqを使用します。
なお、設定時はRaspberry Piをインターネットに接続する必要があります。 (hostapdとdnsmasqをインストールするため)
WiFi設定を変更してしまうので、LANケーブルでインターネットに接続し、有線LAN経由でSSHでログインするとよいでしょう。
必要なパッケージのインストール
まずはhostapdとdnsmasqをインストールしましょう。
$ 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を使いましょう。
家のWiFiにつなぎながらアクセスポイント機能も有効にする、「アクセスポイント+クライアント機能同時使用(AP+STA)」の場合はこちら。