Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

ラズパイとスマホ(PC)と直接繋ぐ方法として、Wi-Fiを使ったアクセスポイント化があります。ここでは、単にラズパイとスマホ(iPhone)を直接繋いで操作する方法をご紹介します。

Wi-Fiをアクセスポイント化しても、有線LANケーブルを自宅のルーターに繋げば、ラズパイはネットに繋がったまま、Wi-Fiでラズパイと直接通信することもできます。

有名なisc-dhcp-serverを使っても一応はできたのですけど、どうもエラーに出くわすことも多く難儀しました。2022年末にISC DHCPのメンテナンス終了が発表されたことあり、isc-dhcp-serverは使わない手段をご紹介します。

今回の環境

Raspberry Pi 4 メモリー4GBモデル にRaspberry Pi OS lite 64bitをインストールしたmicroSDカードで試しました。 途中、再起動するまでsshで作業もできますが、予めRaspberry Pi 4にキーボードとモニターを接続してトライしてください。

使用したのは、主にhostapdとdnsmasqです。

  • Raspberry Pi 4 メモリー4GBモデル
  • Raspberry Pi OS lite 64bit
  • microSDカード
  • キーボード
  • モニター
  • 接続確認にiPhoneSE
  • 使用アプリ「Terminal#」(無料)

OSは書き込んだmicroSDカードを起動したところから説明します。

イメージ図

イメージ図としては次のように、ラズパイとスマホの直接接続です。

Wi-Fiは繋がっていますか?

Raspberry Pi Imagerで詳細設定して書き込んでも、なんだかうまくいかないことが多いのため確認しておきます。

Raspberry Pi OS liteをRaspberry Pi Imagerの詳細設定でホスト名、ユーザーとパスワード、そしてSSHやWi-Fiを設定してから書き込みましたが、案の定、Wi-Fiのwpa_supplicantは足りていませんでした。パスワードも平文で登録しても暗号化されていますね。

どうやら詳細設定の「常に使う」で保存し次回以降になると、確証はありませんが色々とおかしい気がする。

wpa_supplicant.confは最低限の記述を、念のため確認しておきましょう。

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
	ssid="SSID"
	psk="パスワード"
	key_mgmt=WPA-PSK
}

今回の環境は、key_mgmtがWPA2ですのでこれです。WPA3ならWPA-PSKではなく、SAEとなります。詳しくは次の記事も参考にしてください。

詳しくは過去の記事

最新の状態にしておこう

先ず、通常通りネットに繋がる状態から始めます。

リポジトリのアップデートとフルアップグレードをかけます。おまじないです。

sudo apt update && sudo apt full-upgrade -y

hostapdとdnsmasqのインストール

使うパッケージをインストールします。hostapdとdnsmasqです。

sudo apt install hostapd dnsmasq

あとで再起動すると、アクセスポイント化(AP化)してWi-Fiでは自宅内LANに繋がらなくなります。ちょっと面倒なので、必要なパッケージが分かっていれば、ここでインストールしておきましょう。 例えばApache2とか。 ※元のWi-Fi接続に戻すのは、記事最下段をご覧ください。

hostapdを自動起動できるようにしておきます。

sudo systemctl unmask hostapd && sudo systemctl enable hostapd

有線LAN(eth0)を自宅内ルーターに繋いで利用する際、iptablesを使います。そのツールソフトも一緒にインストールしておきます。

sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent

/etc/dhcpcd.confの設定

dhcpd.confで、wlan0にIPアドレスを固定で振っておきます。今回はルーターに当たるようなアドレスにしておきました。

ややこしいconfファイル名 ここでは1のdhcpcd.confに書き込んでいます。

1./etc/dhcpcd.conf(DHCP クライアントデーモン) 2./etc/dhcpd/dhcpd.conf((DHCP デーモン(サーバ))

今回は/etc/直下のdhcpcd.confファイルです。ラズパイでお馴染みの固定IPです。

念のためバックアップを取る。

sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.orig

設定してあるwpa_supplicantを無視する設定です。先に設定してあるWi-Fiの設定はそのままで進めます。

sudo nano /etc/dhcpcd.conf

いくつか設定されていますが、最下行に追記しておきます。

今回はRaspberry Pi 4の固定IPアドレスを192.168.2.1にしました。自分の環境で変更する場合、読み替えてください。

interface wlan0
    static ip_address=192.168.2.1/24
    nohook wpa_supplicant

nohook wpa_supplicantとあるように、先に設定したWi-Fiの設定を回避しています。

■Pi 5は8GBモデルがオススメ

dnsmasqの設定

dnsmasq.confは、既にあるファイルをオリジナルとしてバックアップとして名前を変更します。こうすると、新規に作成することになります。このconfファイルは中身がちょっと長いんですよ。

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo nano /etc/dnsmasq.conf

confの中身は、IPアドレスを払い出す範囲に、2〜20としました。(192.168.2.2,192.168.2.20)

192.168.2.1はラズパイの固定IPアドレスにしたから外して2からとし、一先ず20まで払い出す設定です。もし、最大までなら254になります。255はブロードキャストアドレス(終了IP)だからです。

サブネットマスクは255.255.255.0、リリース時間は24時間の設定です。

interface=wlan0
# DHCP経由で提供されるIPアドレス範囲を予め設定しておく
dhcp-range=192.168.2.2,192.168.2.20,255.255.255.0,24h
# ローカルワイヤレス DNS ドメイン
domain=wlan
# ルーターにするエイリアス
address=/gw.wlan/192.168.2.1
IPアドレス払い出し範囲192.168.2.2〜192.168.2.20
ルーター192.168.2.1(エイリアスはgw.wlan)
サブネットマスク255.255.255.0
リリース期間24時間

ドメインとそのエイリアスは、あると便利ですがなくても構いません。スマホ(PCから)sshする場合、ssh ユーザー名@gw.wlanで可能になります。 最低限はドメインとエイリアスを除いた2行で済みます。(interfaceとdhcp-range)

eth0(有線LAN)の方に自宅のルーターを繋ぐ場合はiptablesで通してあげれば、Raspberry Pi 4はインターネットに繋がるように設定できます。(この記事ではeth0は試していません)

次のコマンドで保存しておきましょう。

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 保存する
sudo netfilter-persistent save

次に、IPv4フォーワーデイングを有効化して残して置く設定をします。 新規にrouted-ap.confを作り、中に有効化の記述をします。

sudo nano /etc/sysctl.d/routed-ap.conf

コマンドでやるよりも、confコマンドに記述して指定の場所に置けば分かりやすい。

# Enable IPv4 routing
net.ipv4.ip_forward=1

hostapdの設定

hostapdは、/etc/hostapd/がPathですが、デフォルトだとifupdown.shファイルしかありません。新規でconfファイルを作った方が面倒がありません。

設定方法を詳しく知りたい方はサンプルファイルをコピーし、書き換える方法も検討してください。サンプルファイルは細かく設定方法が記載されています。

【新規作成の場合】

sudo nano /etc/hostapd.conf

【サンプルファイルをコピーする場合】

cd /etc/hostapd
sudo cp /usr/share/doc/hostapd/examples/hostapd.conf ./

コピーした場合は、必要な項目を探して、無効ならそのまま、有効にするならコメントアウトを外す(#を消す)か、追記することで有効に設定できます。

サンプルが長いんですよ、これも。

書き込む内容の一例。SSID名とパスワードは任意で決めてください。

モードやチャンネル番号は自宅Wi-Fiと干渉しないよう環境により変更してください。ウチは1CHは空いているのでこのままにしました。

interface=wlan0
ssid=jingo-lan # 任意のSSID名

ieee80211d=1
country_code=JP
ieee80211h=1
local_pwr_constraint=3

hw_mode=a
channel=1

macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
ieee80211n=1

wpa=2
wpa_passphrase=任意パスワード
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP

ieee80211h=1を有効にするには、ieee80211d=1も有効にしないとなりません。日本という国指定で5GHz帯を使うなら、h=1は有効にしないとならないためです。ここはセットになりますね。

この設定だとはWPA2、CCMP(AES)暗号化方式のa(5GHz)で繋ぐ設定です。少し分かりにくいですが、最低限必要な項目を覚えておくと便利でしょう。

hw_mode=gは明示的に設定したい場合は書き換えてください。Raspberry Pi 4ならaで構いません。

  • a = IEEE 802.11a(5 GHz) (Raspberry Pi 3B+、3A+、4Bならば利用可能)
  • b = IEEE 802.11b(2.4 GHz)
  • g = IEEE 802.11g(2.4 GHz)
  • ad = IEEE 802.11ad(60 GHz)

Raspberry Pi 4であれば、概ねここで挙げた内容と、サンプルの初期設定部分はそのままか書き換えでスマホ(iPhone)と繋がりました。

再起動してアクセスポイント化

先程まではインターネットに繋がっていましたが、このあと再起動すると設定した通りWi-Fiはアクセスポイント(AP)化されるため、ラズパイの有線LANケーブルをルーターに繋いで居ないと外のネットに繋がりません。

スマホ(PC)とRaspberry Pi 4だけで試す人は気を付けましょう。

モニターとキーボードを繋げておけば、コマンドは作業できます。

では、ここまですべて設定できたら再起動をします。

sudo reboot

立ち上がったらipアドレスを調べてみます。(Raspberry Pi 4実機に繋いだキーボードで)

IPアドレスが、固定IPに指定した(192.168.2.1)になってれば成功です。

接続確認をしてみよう

検証するのに、今回はiPhoneのアプリ「Terminal#」を使い、sshでログインしてみます。

スマホやPCのWi-Fi一覧に設定した「SSID名」が表示されていますか?

APに接続ができたら、アプリTerminal#で指定した「192.168.2.1」へ接続してみます。

おっ、接続できた!

これでスマホとRaspberry Pi 4が直接繋がったことになります。

コマンドを入力すれば分かるでしょう。ip auname -aなど簡単なコマンドで確かめられます。

もしもApache2などを予めインストールしておけば、次のようにスマホやPCのWebブラウザからアクセスできることが分かります。

アクセスポイント化をやめて戻す方法

Wi-Fiによってラズパイとピアツーピアの接続になっているので、インターネットに繋がっていません。追加でインストールしたい場合や、そもそもアクセスポイント化をやめたい場合、次を実行します。

sudo systemctl stop dnsmasq
sudo systemctl stop hostapd

このままだと、自動起動されてしまうため、サービスをdisableにします。

sudo systemctl disable dnsmasq
sudo systemctl disable hostapd

スクリプトファイル(sh)でも作っておけば、コマンド回数を減らせます。

簡単に試してみました。

sudo nano ~/stop_ap.sh
#!/bin/sh
sudo systemctl stop dnsmasq
sudo systemctl stop hostapd
sleep 5
sudo systemctl disable dnsmasq
sudo systemctl disable hostapd

実行権限を与えます。

cd ~/
sudo chmod +x stop_ap.sh

実行はsudo ./stop_ap.sh

再び有効にするshファイルは、逆にstartとenableで記述します。

#!/bin/sh

sudo systemctl start dnsmasq
sudo systemctl start hostapd
sleep 5
sudo systemctl enable dnsmasq
sudo systemctl enable hostapd

こちらも実行権限を付け忘れずに実行してください。

再起動しないでWi-Fiの設定変更を有効にするコマンド

stop_ap.shを実行後に/etc/dhcpcd.confで記述した固定IPアドレス(今回3行)をコメントアウトし、デーモンリロードすれば再び元のWi-Fi設定で繋がります。

sudo nano /etc/dhcpcd.conf
#interface wlan0
#    static ip_address=192.168.2.1/24
#    nohook wpa_supplicant
sudo systemctl daemon-reload

以前にあったコマンドがbullseyeで機能しない?

sudo wpa_cli -i wlan0 reconfigure
sudo dhclient -r wlan0
sudo ifconfig wlan0 down
sudo ifconfig wlan0 up
sudo dhclient -v wlan0

こちらのコマンドはお手軽ですね。(bullseyeで確認済み)

ラズパイと直接接続の使い道

ラズパイをアクセスポイント化する使い方として、ローカルWi-Fiにも繋がず、ラズパイとWi-Fi経由でピアツーピアになるため、ちょうどクロスケーブルで繋いだような形になります。

ケーブルがない分だけ取り回しが楽で設置にも困りません。

ラズパイの中だけで動かす仕組みを、スマホやPCから遠隔操作する完クローズドな環境を構築してみてください。外部に繋がらないからセキュリティは高いですね。

最終的には有線LANケーブルを繋ぎ、ラズパイはそのままインターネットに接続させることで使い道が広がります。

以上、今回はRaspberry Pi 4の64bit環境と、記事執筆時点で最新のOS(bullseye)バージョンで試してみました。

今回は通信に使ったのはdhcpでしたが、Raspberry Pi OSにも新しく搭載されたNetworkManagerでも試してみました。他のLinuxディストリビューションもNetworkManagerが主流ですからね。

設定は手数が少ない

過去にトライした記事はこちら。

Raspberry Pi 3A+をWi-Fiルーター化させWordPressデモ機としても使う

投稿が見つかりません。