家のルーター内のDHCP化 - Network ▲factory top


はじめに 2025 Jun 24

家のルーターに、有線やWiFiにより接続されたラズパイやアルディーノあるいはPCは、 お互いにコマンドや情報のやり取りを行いますが、 それにはお互いの IP アドレスを知っている必要があります。

一番簡単な方法は、ルーターの設定機能を使い、 それぞれのデバイスに固定 IP アドレスを予め割り振っておくことです。 うちのラズパイやアルディーノもこの方法でこれまで稼働してきました。

今回、より自由度の高いシステムを目指し、 固定 IP アドレスを止め、DHCP(Dynamic Host Configuration Protocol~ ネットワークに接続されたデバイスに自動的に IP アドレス等が割り当てられる規約) に変更しました。 (元々はDHCPがデフォルトなので「戻した」ですね) 本ページはその時のメモです。

尚、私はこの辺りに詳しいわけではないので、 Google Gemini との対話をベースに進めました。

 

ラズパイのみ固定アドレスにして他をDHCP化 2025 Jun 24-25

アクセスの方向としては 司令塔のラズパイに周辺デバイスがアクセスするのが主です。 また、周辺デバイスがアクセスするタイミングで、 既にDHCPにより周辺デバイスには IP アドレスが割り振られており、 アクセス時に自分のアドレスをラズパイに伝えることでラズパイは周辺を把握出来ます。 そこで、まずラズパイのみラズパイ側の設定で固定 IP アドレスにして、 他をDHCPにする構成を検討しました。

一般に固定 IP アドレスはルーターが与えるものですが、 デバイス側が勝手に自分の IP アドレスを決めて運用することも可能のようです。 ただし、ルーターはデバイスが勝手に決めたIPアドレスを知らないので、 アドレスが衝突しないようにする必要があります。 例えば、多くのDHCPサーバーは小さい数字から割り当てていく傾向があるので サブネットの最後の方のIPアドレス(例: 10.186.34.250など)を選ぶと 衝突のリスクを減らせます。

ラズパイを1度DHCPでルーターに接続し、$ip addr コマンドなどで、 割り当てられた IP アドレスとサブネットマスクを確認します。 その情報を元にラズパイの /etc/dhcpcd.conf に以下を追加設定します。

/etc/dhcpcd.conf
# added
interface wlan0
static ip_address=10.186.34.128/24           # 固定IPアドレス/subnet mask
static routers=10.186.34.1                   # router IPアドレス gateway
static domain_name_servers=10.186.34.220     # PCを参照
#static domain_name_servers=8.8.8.8          # Google DNS server

設定後
リブートし $ sudo reboot
確認します $ ip addr show wlan0
この状態でラズパイだけ自分で決めた固定 IP アドレスとなっています。

さて、ルーターのサブネットが変わらなければ、 これで、ラズパイは固定IP、他はDHCPで運用出来ます。 サブネットが変わった時の影響箇所、すなわち要修正箇所は以下となります。
  1. 上記の /ets/dhcpcd.conf → ただし Tera Term/ VNC 等が使えず大変面倒になる
  2. ラズパイの www/html/index.htm → web server への XMLHttpRequest 先URL
  3. siteyamakatsu.jp/plink.htm(非公開 Bookmark)→ ラズパイのURL
  4. アルディーノ→light.ino→ラズパイのURL → この修正も大変面倒な作業

 

サブネットが頻繁に変わることが分かり全てDHCP化 2025 Jun 25 - jul 3

ルーターがスマホの tethering だったりすると、 更新時とか、再起動時とか、外出から帰った時とか、 頻繁にサブネットが変わることが分かりました。 その度に上記の修正はしていられないので、 ラズパイもDHCPにしないと運用出来ないことが分かりました。

ラズパイもDHCP接続にすると、 IP アドレスが分からずコードが書けなくなります。 そこで Name Server を導入し、 http://192.168.1.10 などの IP アドレスでアクセスするのではなく、 http://raspberrypi.local/ のように名前で呼び出せるようにします。

Name sever の導入
ラズパイの上記の /ets/dhcpcd.conf は止め、追加部分は削除。

Avahi を使う → https://qiita.com/ren510dev/items/e5ee1417949b1dbadc70 参照 サーバー名を確認 $ cat /etc/hostname サーバー名は "raspberrypi" 周辺からは raspberrypi.local でアクセス出来る 初回 ($ sudo apt-get update) $ sudo apt-get install avahi-daemon $ sudo apt-get install avahi-autoipd $ sudo find /etc/ -name "avahi*" ← 確認&登録済み 試し起動 $ sudo /etc/init.d/avahi-daemon restart 以上で Tera Term/ VNC 含め URL=raspberrypi.local でアクセス出来ました。
ラズパイの www/html/index.htm→web server への XMLHttpRequest 先URLの部分は var ScriptUrl = window.location.origin + "/cgi-bin/cgi-python.py"; に変更。
siteyamakatsu.jp/plink.htm(非公開 Bookmark)→ラズパイのURL
PCでは raspberrypi.local で問題はなし。 Google Gemini 曰く Appleの「Bonjour Print Services」をインストールすると使えるようになる iTunesをインストールすると導入される そうです。
ただしスマホでは Name Server がサポート出来ない。 Google Gemini 曰く Androidのテザリング環境でmDNSが機能しないのは、多くの方が直面する問題です だそうです。 ※要対策
アルディーノ→light.ino→ラズパイのURL 部分は、以下の Multicast DNS で const char* host_name = "raspberrypi.local"; WiFiClient client; client.connect(host_name, port);

 

Raspi IP address watcher 2024 Sep 2,3

上記の※要対策として、 ラズパイの IP アドレスが変ったら、 新しいアドレスをリンクの形式でGmailすることで、 Bookmark 代わりとすることにしました。 最初は、従来から走っている audio_corner_server.py に機能追加しようと思いましたが、 この機能は独立したアプリとして作れますね。

1時間毎に自分の IP アドレスを調べ(ポーリンして)以前のアドレスから 変っていたらGmailを送信するアプリ Raspi IP address watcher → www/src/ip_address_watcher.py を作ります。

Google Gemini より - Gmailを送信するための事前準備
Gmailメール送信には、セキュリティの理由から、 通常のパスワードではなく「アプリ パスワード」を使うそうで、 それを作成します。

  1. 2段階認証が有効であることを確認
  2. アプリ パスワードの作成
    Googleアカウントの管理ページで「セキュリティ」を選択、、 Gemini の情報は古いようで、以下を参考にしました → https://myaccount.google.com/apppasswords
    アプリ名 = raspi_mail
    パスワード = .bashrc に記述
コードはこちら GitHub

これで、 ラズパイの IP アドレスが変わると、下の様なGmailが届きます。
リンクをクリックするとラズパイの(リモコン)サイトが表示されます。