Edge Router X の ホスト名をmDNSで publishする

複数台の EdgeRouter X があり、DHCPでIPアドレスを取得しているために、IPアドレスが変わる。ホスト名を mDNS (multicast DNS) でパブリッシュして、それでアクセスできるようにしたいと思って試したが、EdgeOS の GUIではうまくできなかった。

SSHでEdgeRouter X に接続して、内部のファイルを直接変更することでできるようになったと思われるので、備忘録として残しておく。利用した EdgeRouter X の ファームウェアバージョンは、「EdgeRouter X v2.0.9-hotfix.2」である。

EdgeOS GUIでの設定

EdgeRouter X の GUI の SystemタブからHostNameを ubnt2 と設定した。

ConfigTreeタブの Configuration → service → mdns を有効にすれば ホスト名はパブリッシュされるかと思ったがうまくいかなかった。

Configuration → service → mdns → reflector を有効にすれば、ホスト名がパブリッシュされるようにできた。しかし、reflector を有効にすると入ってくる mDNSリクエストをすべてのLANインタフェースに転送することになり、VLANなどでネットワークを分けていない場合には無駄な通信が行われることになる。また、複数の reflector があり、ループを構成するようになっているとリクエストが増えつづけることになり問題である。このため、reflector や repeater としては機能させないで、ホスト名のみをパブリッシュしたい。

ちなみに、Configuration → service → mdns → repeater を有効にしてみたが、ホスト名に対するリクエストがあってもIPアドレスは取得できなかった。

エラーの発生

いろいろとConfigTreeでmdns の設定を変えていたら次のようなエラーが発生するようになった。EdgeOSではmDNSの処理を Avahi で行っていることがわかる。

Starting dbus (via systemctl): dbus.service.<br />Starting avahi-daemon (via systemctl): avahi-daemon.serviceJob for avahi-daemon.service failed because a timeout was exceeded. See "systemctl status avahi-daemon.service" and "journalctl -xe" for details. failed!

SSHで接続して調査

ssh で接続して調査を少しした。systemctl status avahi-daemon.service を実行すると次のように timeout が発生して、異常終了していることはわかるが、あまり詳しいことはわからない。

journal の記録を後で示すように有効にしてから見ると次のようなメッセージが得られたが、何をすべきなのかははっきりしなかった。

設定ファイルの修正

Ubiquiti のフォーラムなどを探したが、reflector や repeater の設定に関することばかりで解決方法は見つからなかった。 run mDNS without the enabling the reflector  では、reflector を有効化しないで mDNSでホストをパブリッシュすることがGUIからできるようにする要望が書かれているが、実現されていないようである。

Avahi の設定については、[SOLVED] Avahi-daemon Error Messages that May be Solved by Editing the Configuration File に書いてある。しかし、目的を達成する方法がはっきりしなかった。その後、さらに Avahi に関して探したところ、avahi-daemon fails if dbus is disabled に関連することが書いてあった。avahi-daemon fails if dbus is disabled に従って、dbus は使わず、mDNS のみを有効にする設定をした。

avahi-daemon.conf

一応、/etc/avahi/avahi-daemon.conf の enable-reflector=yes をコメントアウトして、reflectorが有効にならないようにした。

avahi-daemon.service

avahi-daemon fails if dbus is disabled に従って /lib/systemd/system/avahi-daemon.service を次のように変更した。[Service] のType、BusName、ExecStart を変更した。

変更後、sudo systemctl reenable avahi-daemon を実行した。

動作確認

GUI で Configuration → service → mdns を有効にしてあるとする。

sudo systemctl start avahi-daemon.service で Avahi デーモンを起動したところすぐに正常終了した。

sudo systemctl status avahi-daemon.service で状態を調べると次のようなメッセージが表示され、動作しているようであった。

別のWindowsマシンのWindows PowerShell から ping ubnt2 を実行して、次のように名前の解決がされていることを確認した。

WAN側Firewallの設定

EdgeRouter X をルータとして使用している際に、内側のLANからは上記のようにできた。しかし、外側からはリクエストがあっても応答が得られない。WAN側のfirewallルールで mDNSのパケットがdropされている。

mDNSのリクエストへの応答をWAN側でも得るためには、WANからルータ自身へのルールセット(WAN_LOCAL)にmDNSを許可するルールを追加する必要がある。作成したルールは、dropよりも先に適用されるように順序を変更して、それを保存しておく必要がある。

プロトコルが UDP でStateが New、デスティネーションポートが 5353 を許可するルールを追加することで、外部から ping ubnt2 で応答を得られるようになった。EdgeOS GUIでの設定を以下に示す。

この後で、EdgeOSを再起動しても設定が有効であることを確認した。

(2022年2月19日追記) 上記の設定で、EdgeRouter Xの外部からは(WAN側からでもLAN側からでも) mDNSで EdgeRouter のホスト名からIPアドレスの解決ができるようになったが、EdgeRouter X そのものでは、自分のホスト名からIPアドレスの解決ができるが、外部にあるmDNSリスポンダー からIPアドレスは解決できないことがわかった(同様の設定をした他のEdgeRouter X のホスト名からIPアドレスを得ることができなかった)。

journalデーモンの有効化

sshで接続して問題の調査の際に journalctl -xe を最初に実行した場合には、次のようにjournalデーモンが有効になっていなかった。

GUIのConfigTree → Configuration → system → systemd → journal を有効にすることで、journal ファイルが生成されるようになった。Storageの設定には auto を設定しておけば良いようだ。