mDNS Proxyは、ネットワークセグメントを跨いだmDNS名前解決を実現する分散型プロキシシステムです。 各ネットワークセグメントに配置されたプロキシが互いに通信し、mDNSのホスト情報を交換・マージすることで、別セグメントのデバイスを名前解決できるようにします。
db/: SQLite3データベースファイル(mdns_proxy.sqlite3)が保存されます。log/: ログファイル(mdns_proxy.log)が保存されます。src/: プログラムのソースコード。system.ini: システム全体の設定ファイル。search_hosts.ini: 検索対象となるローカルホスト名(ローカルFQDN)のリスト。
システムを動作させるために、以下の設定ファイルを適切に編集してください。 各環境への導入時、これらは共通の設定ファイルとして使用されます。
システム全体の動作設定やネットワーク設定を定義します。
[system]
# 実行間隔(秒)
interval = 10
# 発信トークン接頭語
token_prefix = mDNSProxy_
# HTTP待ち受けポート
port = 80
# TTL初期値(秒)
ttl = 120
[network]
# 外部mDNSプロキシIPアドレスとポート(カンマ区切りで複数指定可能)
external_proxies = 192.168.1.10:80,192.168.2.10:8080
# Wi-Fi設定(Raspberry Pi Pico用)
wifi_ssid = your_wifi_ssid
wifi_password = your_wifi_password検索対象とするローカルホスト名、またはローカルFQDNのリストを定義します。
.local の記述を省略した場合でも、自動的に .local が補完されて対象になります。
ホスト名の後に = IPアドレス を指定することで、mDNSの検索を行わずに指定した固定IPアドレスを応答させることも可能です。
[hosts]
# 検索対象とするローカルホスト名またはローカルFQDNを記載します
# 例:
# host1 (host1.localとして扱われます)
# serverA (serverA.localとして扱われます)
# printer1.local
test-device1
test-device2.local
# IPアドレスを固定で指定する場合
test-device3 = 192.168.3.10src/cli.py は、mDNS Proxyのデータベースに保存されている情報の確認や、静的ホストの管理を行うための対話型コマンドラインツールです。
(※利用方法は環境や実装の呼び出し方に依存しますが、通常はメインプロセスの python src/main.py から呼び出される形で動作します。)
Windows環境での利用について:
Windows向けにビルドされた mdns_proxy.exe をコマンドプロンプトやPowerShell等から直接実行した際にも、標準のコンソールアプリとしてこの対話メニューが利用可能な状態で実装されています(サービスとしてバックグラウンドで起動している場合は対話メニューにはアクセスできません)。
CLIを起動すると以下のメニューが表示されます:
- マージ済みレコードの表示: プロキシが収集・マージしたmDNSレコード(ホスト名とIPアドレスの対応)を一覧表示します。
- 静的ホストの表示: 手動で登録された静的ホストの一覧を表示します。
- 静的ホストの追加: 対話プロンプトに従い、新しい静的ホスト(FQDN)を追加登録します。
- 静的ホストの削除: 登録済みの静的ホストをID指定で削除します。
- インスタント実行: インスタント実行モードを開始します。実行中は
Ctrl+Cで終了してメニューに戻ることができます。 - 終了: CLIツールを終了します。(
Ctrl+Cでの終了も可能です)
Python環境がないWindows PCでも動作するように、PyInstallerを用いてEXE化できます。
-
ビルド(EXE化): 開発環境(Pythonインストール済み)で以下のコマンドを実行します。
pip install pyinstaller pyinstaller --onefile --name mdns_proxy src/main.py
ビルドが成功すると、
dist/mdns_proxy.exeが生成されます。 -
配置:
mdns_proxy.exeと同じディレクトリにdb/,log/,system.ini,search_hosts.iniを配置してください。 -
サービスとして起動する: NSSM (Non-Sucking Service Manager) や Windowsの
scコマンドを使用して、バックグラウンドサービスとして登録できます。 例(NSSMを使用):nssm install mDNSProxy "C:\path\to\mdns_proxy.exe" nssm start mDNSProxy
Raspberry Pi Pico W(Wi-Fi対応モデル)を使用します。
- MicroPythonの導入: Pico Wに最新のMicroPythonファームウェアを書き込みます。
- ファイルの転送:
Thonny IDEや
mpremoteツールを使用して、以下のファイルとディレクトリをPicoのルートに転送します。src/ディレクトリ内のすべてのPythonファイル(拡張子.py)をPicoのルート、またはlib/等適切な階層に配置system.inisearch_hosts.ini
- 自動起動の設定:
エントリーポイントとなるスクリプト(例:
main.py)をPicoのルートディレクトリに配置します。これにより、Picoの電源ON時に自動的に実行されます。
Python 3を使用して直接実行するか、systemdサービスとして登録します。
- 環境構築:
sudo apt update sudo apt install python3 python3-pip
- ファイルの配置:
適当なディレクトリ(例:
/opt/mdns_proxy/)にファイルを配置します。 - 実行:
cd /opt/mdns_proxy python3 src/main.py - systemdサービス化(自動起動):
/etc/systemd/system/mdns_proxy.serviceを作成します。サービスを有効化して起動します。[Unit] Description=mDNS Proxy Service After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/mdns_proxy ExecStart=/usr/bin/python3 /opt/mdns_proxy/src/main.py Restart=on-failure [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl enable mdns_proxy sudo systemctl start mdns_proxy
log/mdns_proxy.log には、システムの動作状況に関するログが出力されます。主な出力内容は以下の通りです。
- 起動・停止ログ: プログラムの起動時および終了時のメッセージ。
- 出力例:
INFO - mDNS Proxy started on 0.0.0.0
- 出力例:
- エラー・警告ログ: データベースのアクセスエラー、ネットワーク通信の失敗、設定ファイルの読み込みエラーなど。
- 出力例:
ERROR - Failed to connect to external proxy at 192.168.1.10
- 出力例:
- 名前解決ログ: ローカルネットワークでのmDNS名前解決リクエストおよびレスポンスの処理状況。
- 出力例:
DEBUG - Resolved test-device1.local to 192.168.0.50
- 出力例:
- 同期・マージログ: 他のセグメントのプロキシから取得したホスト情報の同期およびデータベースへのマージに関する記録。
- 出力例:
INFO - Merged 3 records from external proxy 192.168.1.10
- 出力例:
- スケジューラー実行ログ: 定期実行される外部プロキシとの通信や、期限切れ(TTLオーバー)レコードのクリーンアップ処理の記録。
- 出力例:
INFO - Removed 2 expired records during cleanup
- 出力例:
ログファイルは1日ごとにローテーションされます。
- 古いログはZIP圧縮されて保存されます。
- 最大で3世代前(3日分)までのアーカイブが保持され、それより古いログファイルは自動的に削除されます。