第4回で USB WiFi ドングル (wlan1) を独立 AP として設定しました。今回はもう片方の オンボード WiFi (wlan0) を家または現場のルーターに接続してインターネット出口として使う設定を扱います。
実は第3回の Raspberry Pi Imager 設定で 既にほぼ完了しています。Imager で SSID とパスワードを指定した時点で、Pi は自動的に wlan0 でその WiFi に接続する設定を持っています。この回では以下を整理します。
- 現状の接続を確認する
wlan0の IP を DHCP のままにするか、静的 IP に固定するか- 現場に持ち込んで別 SSID に切替えるときの手順
- キャプティブポータル型 (ビル無料 WiFi 等) の扱い
- インターネット共有の設定 (ESP からもインターネットに出せる化、任意)
第4回の作業で wlan0 の設定を触った覚えがなくても、それは正解です。今回、はじめて wlan0 に手を入れます。
現状確認 — 今すでに繋がっているか
Pi の SSH セッション (または Terminal) で以下を実行します。
nmcli device status
以下のような出力が期待値です。
DEVICE TYPE STATE CONNECTION
wlan0 wifi connected netplan-wlan0-XXXX
lo loopback connected (externally) lo
p2p-dev-wlan0 wifi-p2p disconnected --
eth0 ethernet unavailable --
wlan1 wifi unmanaged --
確認ポイント:
wlan0がconnectedになっている → 家の WiFi に接続済みwlan1がunmanagedになっている → 第4回の設定が効いている

wlan0 が disconnected の場合は、Imager で指定した SSID/パスワードに問題があるか、電波が届いていない可能性があります。後述の「5. 家/現場の WiFi パスワードを変えたとき」で修正します。
インターネット疎通確認:
ping -c 3 -I wlan0 8.8.8.8
3 回とも応答が返れば OK です。

現在の IP アドレスと接続名:
ip -4 addr show wlan0
# inet 192.168.11.200/24 ... の行に IP アドレス
nmcli connection show --active
# NAME UUID TYPE DEVICE
# preconfigured ... wifi wlan0
# (接続名は環境で異なる)

接続名(上の例では netplan-wlan0-XXXX)は後のコマンドで参照するのでメモしてください。この名前は環境によって変わります。preconfigured になっていることもあれば、netplan-wlan0-<SSID> のように SSID が入ることもあります。p2p-dev-wlan0 や eth0 の行は今回使わないので気にしなくて構いません。
1. wlan0 の IP は DHCP のままで良いか、固定した方が良いか
DHCP (現状のまま): ルーターが Pi の IP を自動で決めます。楽ですが、リブートや電源変更で IP が変わる可能性があり、ssh pi@<IP> するたびに IP を調べ直す必要があります。いろいろ試行錯誤が増えたりすると、再起動が増えるとその際IPアドレスが変わることもあります。PC+モニター+キーボードとラズパイ+モニター+キーボードが机の上に置いておくと邪魔っけなので、ラズパイはちょっと別のところに置きたくなります。
静的 IP (固定): Pi の IP をルーターのサブネット内で固定します。ssh pi@192.168.11.200 のようにいつも同じ IP でアクセスできて、管理が楽になります。
この回では静的 IP にします。次回以降に作る Flask サーバーのアクセス URL を固定できるので、ブラウザのお気に入り登録や動作確認が楽になるためです。
ただし、これは暫定措置です。第12回で Tailscale (VPN) を導入すると、ssh pi@<ホスト名> がどこからでも通るようになり、LAN 側の IP が何番でも困らなくなります。そうなったら むしろ DHCP に戻したほうが便利です。現場のルーターが変わっても、ホテルの WiFi でも、設定を触らずそのまま繋がるからです。第12回でその手順も扱います。
別解: ルーター側の DHCP 予約 (MAC アドレスで固定 IP を割当てる) 機能を使う方法もあります。この場合 Pi 側は DHCP のままで、ルーター側だけで管理します。家庭用ルーターの管理画面で操作しやすい方法です。どちらでも構いません。
2. wlan0 を静的 IP に固定する
以下は Pi 側で静的 IP を設定する手順です。ルーター側 DHCP 予約で済ませる方はスキップして構いません。
2.1 現状の情報を確認
# 接続名
CONN_NAME=$(nmcli -t -f NAME,DEVICE connection show --active | grep ':wlan0$' | cut -d: -f1)
echo "接続名: $CONN_NAME"
# 現在の IP
CURRENT_IP=$(ip -4 addr show wlan0 | awk '/inet /{print $2}' | head -1)
echo "現在の IP: $CURRENT_IP"
# ゲートウェイ (ルーターの IP)
GATEWAY=$(ip route show default | awk '{print $3}' | head -1)
echo "ゲートウェイ: $GATEWAY"
出力例:
接続名: preconfigured
現在の IP: 192.168.11.200/24
ゲートウェイ: 192.168.11.1

2.2 静的 IP 化
いま割当てられている IP を、そのまま固定します。
sudo nmcli connection modify "$CONN_NAME" \
ipv4.method manual \
ipv4.addresses "$CURRENT_IP" \
ipv4.gateway "$GATEWAY" \
ipv4.dns "$GATEWAY,8.8.8.8"
# 適用
sudo nmcli connection down "$CONN_NAME"
sudo nmcli connection up "$CONN_NAME"

connection down の瞬間、SSH が 1〜2 秒切れる可能性があります。切れたら同じ IP で再接続してください。
2.3 再起動して固定 IP が保持されるか確認
sudo reboot
再起動後に SSH で入り直して:
ip -4 addr show wlan0
前回と同じ IP が付いていれば静的化完了です。

3. wlan0 と wlan1 の役割の切り分けを再確認
ここまでの手順で、Pi は以下の状態になっています。
| インターフェース | 用途 | IP アドレス例 | 誰が管理 |
|---|---|---|---|
wlan0 (オンボード) | インターネット出口 | 192.168.11.200/24 | NetworkManager |
wlan1 (USB ドングル) | ESP 用独立 AP | 192.168.4.1/24 | hostapd + dnsmasq + systemd unit |
wlan0は クライアントとして家/現場のルーターに繋ぐwlan1は アクセスポイントとして ESP からの接続を受ける- 2 つは完全に別セグメントで、混線しません
- Pi 内部では
wlan1側 (ESP から) の HTTP POST を Flask (第8回) が受け、wlan0側 (家 LAN から) のブラウザで見に来る、という流れになります
Windows PC (家 LAN 側) から見えるのは wlan0 の IP 192.168.11.200 だけです。wlan1 の 192.168.4.1 は ESP 専用の内部アドレスで、Windows から直接アクセスすることはありません。
4. インターネット共有 (IP フォワーディング) は必要か
「ESP からもインターネットに出したい」場合は、Pi にルーターのような役目 (wlan1 → wlan0 へのパケット転送) を追加する必要があります。
本連載の範囲では不要です。ESP は温度データを Pi 内の Flask サーバー (192.168.4.1:5000) に POST するだけで、外部インターネットに出る用途はありません。
必要になる場合の例:
- ESP から NTP サーバー (時刻同期) に直接アクセスさせたい
- ESP からクラウドサービス (AWS IoT 等) に直接データを送りたい
- ESP のファームウェア OTA アップデートを外部サーバーから取りたい
必要な方は以下を実行します。
# IP フォワーディング有効化
sudo sysctl -w net.ipv4.ip_forward=1
# 永続化
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ip-forward.conf
# NAT 設定 (wlan1 のトラフィックを wlan0 経由で送出)
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables ルールの永続化
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
補足: Trixie (Debian 13) の iptables コマンドは、内部的には nftables に翻訳されて動いています (iptables-nft)。上のコマンドはそのまま通りますが、確認するときは sudo nft list ruleset の方が実態を正確に見られます。
本連載ではこれ以降扱いません。上記の設定を入れなくても、ESP → Pi → ブラウザという主目的は完全に動作します。
5. 家/現場の WiFi パスワードを変えたときの再設定
家のルーターを新調した、パスワードを変えた、別の SSID に変わった、という場合の再接続手順です。
5.1 現在の接続を削除
CONN_NAME=$(nmcli -t -f NAME,DEVICE connection show --active | grep ':wlan0$' | cut -d: -f1)
sudo nmcli connection delete "$CONN_NAME"
5.2 新しい SSID に接続
sudo nmcli device wifi connect "新しいSSID" \
password "新しいパスワード" \
ifname wlan0 \
name "home-wifi"
sudo nmcli connection modify "home-wifi" connection.autoconnect yes
5.3 再度静的 IP 化
新しいネットワークでも静的 IP で運用したい場合は §2.2 の手順を再実行します。ゲートウェイと IP が変わっている点に注意してください。
6. 現場に持ち込むときの運用
Pi を現場 (ビル管理業務先など) に持ち込む場合、wlan0 の接続先を現場の WiFi に切替える必要があります。
6.1 事前準備 (自宅もしくは事務所で)
現場の WiFi 情報 (SSID とパスワード) を事前に確認しておきます。そのうえで、自宅にいるうちに現場の SSID を「登録だけ」しておくことができます。
ここで注意が必要です。nmcli device wifi connect はいま電波が見えている AP にしか使えません。自宅から現場の SSID を登録する用途には使えないので、代わりに connection add を使います。
sudo nmcli connection add type wifi ifname wlan0 con-name "site-wifi" ssid "現場のSSID" wifi-sec.key-mgmt wpa-psk wifi-sec.psk "現場のパスワード" connection.autoconnect yes
この長いコマンドは、途中で改行せず 1 行のまま貼り付けてください。行末に \ を置いて見やすく折り返す書き方もありますが、貼り付けの経路によっては \ の直後に半角スペースが紛れ込みます。そうなるとバックスラッシュはそのスペースを打ち消すだけになり、改行がコマンドの区切りとして扱われて、引数の対応がずれます。
ずれた結果、パスワードの部分が空のまま渡ると、こういうエラーが出ます。
Error: Failed to add 'site-wifi' connection: 802-11-wireless-security.psk: property is invalid
これは「WPA のパスフレーズとして受け付けられない値だ」という意味です。NetworkManager が受け付けるのは 8〜63 文字の文字列か、ちょうど 64 文字の 16 進数のどちらかだけです。空文字や 7 文字以下だとこのエラーになります。パスワード自体は正しいのに出た場合は、まず貼り付けのずれを疑ってください。
1 行が長くて扱いにくい場合は、2 段階に分けられます。こちらの方が、どこで失敗したか分かりやすいのでお勧めです。
# 1) セキュリティ設定なしで枠だけ作る
sudo nmcli connection add type wifi ifname wlan0 con-name "site-wifi" ssid "現場のSSID"
# 2) 後からセキュリティを設定する
sudo nmcli connection modify "site-wifi" wifi-sec.key-mgmt wpa-psk
sudo nmcli connection modify "site-wifi" wifi-sec.psk "現場のパスワード"
sudo nmcli connection modify "site-wifi" connection.autoconnect yes
con-name は Pi の中だけで使う管理用の名前なので何でも構いません(例では site-wifi)。実際に電波が飛んでいる SSID を入れるのは ssid の側です。ここを取り違えると、いつまで経っても繋がりません。
これで「接続はしないが、設定だけ登録された」状態になります。現場で電源を入れると、その SSID の電波を見つけ次第、自動的に接続します。
自宅と現場の両方を登録しておけば、Pi は電波が届く方に自動接続します。登録済みの接続は以下で確認できます。
nmcli connection show

⚠️ 注意: 静的 IP はプロファイルごとの設定です
§2 で静的 IP を設定したのは、そのとき繋がっていた 1 つのプロファイルに対してだけです。ここで新しく登録した site-wifi は ipv4.method が初期値の auto(DHCP)のままなので、現場でこちらに繋がると IP が変わります。
私はこれで一度混乱しました。自宅で 192.168.11.200 に固定したはずなのに、別の SSID に繋いだら 192.168.11.23 になっていたのです。設定が消えたわけではなく、静的 IP の設定が入っていない別のプロファイルが使われていただけでした。同じルーターの 2.4GHz と 5GHz は別 SSID なので、これだけでも起こります。
どのプロファイルがどうなっているかは、以下で一覧できます。
# いまアクティブなプロファイル
nmcli -t -f NAME,DEVICE connection show --active | grep ':wlan0$'
# 各プロファイルの ipv4.method (manual = 静的、auto = DHCP)
nmcli -t -f NAME connection show | while read n; do
echo "$n : $(nmcli -g ipv4.method connection show "$n" 2>/dev/null)"
done
現場側でも固定したいなら、現場のネットワークに繋がった状態で §2.2 を実行してください。「現場では DHCP でいい」ならそのままで構いません。むしろ第12回で Tailscale を入れると、LAN 側の IP が何番でも困らなくなります。
6.2 現場でモニタ+キーボードを繋ぐ
現場で SSH に入れない状況になったら、Desktop 版の強みが活きます。第3回で用意した HDMI ケーブルと USB キーボードを持参して Pi に繋ぎ、右上の WiFi アイコンから直接接続先を選び直せます。
第3回で VNC を有効にしてある場合、Pi と同じ LAN に繋がっている PC があれば、モニタを繋がなくても VNC Viewer からデスクトップを操作できます。ただし WiFi の接続先そのものが分からなくなっている状況では VNC も届かないので、最後の砦としてモニタとキーボードは持って行ってください。
Lite 版 (第3回参照) を選んでしまうとこの逃げ道が使えません。「Desktop 版推奨」の理由の 1 つです。
6.3 キャプティブポータル型 (ビル無料 WiFi 等) の扱い
商業ビルの無料 WiFi は、初回接続時に ブラウザで「同意する」ボタンを押さないと外部に出られないタイプ (キャプティブポータル型) が多いです。この場合は以下の運用が必要になります。
- Pi にモニタを繋ぎ、Chromium で適当な HTTP サイト (
http://example.comなど) にアクセス - 認証画面にリダイレクトされるので「同意」ボタンをクリック
- 以後インターネットに出られる
注意: キャプティブポータル型は Pi の再起動、または一定時間経過で再度「同意」を求められることがあります。継続運用したい場合はモバイルルーターの持込みなど別解を検討してください。自動化は Selenium 等で可能ですが、本シリーズの範囲外です。
7. トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
nmcli device status で wlan0 が disconnected | SSID かパスワード間違い | §5 で削除 → 再接続 |
ping -c 3 8.8.8.8 が全部タイムアウト | 家/現場ルーターが外に出せていない | ルーター側のインターネット接続を確認、他機器で試す |
| 静的 IP 化後に接続できない | サブネット外の IP を指定した | §2.1 で今の IP を確認して同じサブネットの値を使う |
| リブート後 IP が変わってしまう | ipv4.method manual の設定が抜けた | §2.2 を再実行 |
| 静的 IP にしたのに IP が変わっている | 別の接続プロファイルが有効になっている。静的 IP はプロファイル単位の設定で、他のプロファイルには引き継がれない | nmcli connection show --active でどのプロファイルが使われているか確認。必要ならそのプロファイルで §2.2 を実行 |
wlan0 と wlan1 が入れ替わる | 起動タイミングによるインターフェース名の揺れ | 下の補足を参照 |
802-11-wireless-security.psk: property is invalid | パスフレーズが 8〜63 文字(または 64 桁の 16 進数)になっていない。行末 \ の後ろにスペースが混入して引数がずれた可能性が高い | §6.1 の通り 1 行で実行するか、connection add と connection modify の 2 段階に分ける |
| 登録したのに現場で繋がらない | con-name と ssid を取り違えている | nmcli -f name,802-11-wireless.ssid connection show "site-wifi" で実際の SSID を確認 |
| SSH は繋がるがブラウザで Flask (第8回) が見えない | ファイアウォール or ポート未 listen | 第8回で扱う切り分けフローに従う |
「wlan0 と wlan1 が入れ替わる」問題について: Pi の起動タイミングによって、稀に USB ドングルが wlan0、オンボード WiFi が wlan1 として認識されることがあります。この状態では第4回の設定が全部逆に効いて AP が立ち上がりません。
ただし 筆者の環境 (Trixie 6.12.75 + 8821au-20210708) では、この入れ替わりは一度も発生していません。過度に心配する必要はありません。
もし発生した場合、根本的な対策は udev で MAC アドレスごとにインターフェース名を固定することです。/etc/udev/rules.d/ にルールファイルを置いて、ドングルの MAC には必ず wlan1 を割当てる、という設定にします。運用回避としては「USB ドングルは電源を入れる前に必ず挿しておく」だけでもかなり防げます。
この時点でできていること (第3〜5回のまとめ)
- Pi が Raspberry Pi OS Trixie Desktop で動作している
- Windows PC から SSH でログインできる
- Pi が 2 系統の WiFi を持っている:
wlan0= 家/現場ルーターへのクライアント接続 (インターネット出口)、wlan1= ESP 用独立 AP (192.168.4.1) - 電源を入れるだけで両 WiFi が自動接続される
- スマホから ESP 用 AP に接続して DHCP でアドレス割当まで動く
まだできていないこと:
- ESP から Pi の AP に接続してデータを送る (第6回)
- Pi 側で Flask サーバーを立ててデータを受ける (第8回)
- ブラウザでグラフを見る (第9回)
AI との会話例
nmcli(Network Manager Command Line Interface) の操作は暗記しにくいので、AI に手順を組み立ててもらうのが効率的です。
Raspberry Pi Trixie で、オンボード WiFi (wlan0) を家のルーターに接続、現在は DHCP で 192.168.11.150 が割当てられている。この IP を同じ値のまま静的化する nmcli コマンドを教えて。接続名は
preconfigured、ゲートウェイは 192.168.11.1。
「現状の値」と「目的の状態」を明示して聞くと、そのまま貼り付け可能なコマンドが返ってきます。
逆に、こちらが値を示さずに「静的 IP にしたい」とだけ聞くと、AI は一般論のテンプレートを返してきます。そのまま貼ると自分の環境と噛み合わず、繋がらなくなりチャットの回数が増えます。
次回予告
第6回は ESP 側に戻ります。第2回まで作った XIAO ESP32-C3 (または ESP-WROOM-02) を、今回作った Pi の AP (192.168.4.1) に接続して、温度データを HTTP POST で送るスケッチを書き込みます。ESP と Pi が初めて繋がる回です。


コメント