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 が発生して、異常終了していることはわかるが、あまり詳しいことはわからない。

ubnt@ubnt2:/lib/systemd/system$ systemctl status avahi-daemon.service
* avahi-daemon.service - Avahi mDNS/DNS-SD Stack
Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor pre
Active: failed (Result: timeout) since Fri 2022-02-18 05:18:42 UTC; 18s ago
Main PID: 13305 (code=exited, status=0/SUCCESS)
Status: "avahi-daemon 0.6.32 starting up."

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

ubnt@ubnt2:/lib/systemd/system$ sudo journalctl -xe
Feb 18 05:18:42 ubnt2 avahi-daemon[13305]: Leaving mDNS multicast group on i
Feb 18 05:18:42 ubnt2 avahi-daemon[13305]: Leaving mDNS multicast group on i
Feb 18 05:18:42 ubnt2 avahi-daemon[13305]: Leaving mDNS multicast group on i
Feb 18 05:18:42 ubnt2 avahi-daemon[13305]: avahi-daemon 0.6.32 exiting.
Feb 18 05:18:42 ubnt2 systemd[1]: Failed to start Avahi mDNS/DNS-SD Stack.
-- Subject: Unit avahi-daemon.service has failed
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit avahi-daemon.service has failed.
--
-- The result is failed.
Feb 18 05:18:42 ubnt2 systemd[1]: avahi-daemon.service: Unit entered failed
Feb 18 05:18:42 ubnt2 systemd[1]: avahi-daemon.service: Failed with result '
Feb 18 05:18:42 ubnt2 sudo[13456]: pam_unix(sudo:session): session closed fo
Feb 18 05:18:53 ubnt2 sudo[13483]:     root : TTY=unknown ; PWD=/ ; USER=roo
Feb 18 05:18:53 ubnt2 sudo[13483]: pam_unix(sudo:session): session opened fo
Feb 18 05:18:53 ubnt2 sudo[13483]: pam_unix(sudo:session): session closed fo
Feb 18 05:19:23 ubnt2 sudo[13526]:     root : TTY=unknown ; PWD=/ ; USER=roo
Feb 18 05:19:23 ubnt2 sudo[13526]: pam_unix(sudo:session): session opened fo
Feb 18 05:19:23 ubnt2 sudo[13526]: pam_unix(sudo:session): session closed fo
Feb 18 05:19:32 ubnt2-ivy sudo[13544]:     ubnt : TTY=pts/0 ; PWD=/lib/systemd/s
Feb 18 05:19:32 ubnt2 sudo[13544]: pam_unix(sudo:session): session opened fo

設定ファイルの修正

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が有効にならないようにした。

[server]
#host-name=foo
#domain-name=local
#browse-domains=0pointer.de, zeroconf.org
use-ipv4=yes
use-ipv6=yes
#allow-interfaces=eth0
#deny-interfaces=eth1
#check-response-ttl=no
#use-iff-running=no
#enable-dbus=yes
#disallow-other-stacks=no
#allow-point-to-point=no
cache-entries-max=0
#clients-max=4096
#objects-per-client-max=1024
#entries-per-entry-group-max=32
ratelimit-interval-usec=1000000
ratelimit-burst=1000

[wide-area]
enable-wide-area=yes

[publish]
#disable-publishing=no
#disable-user-service-publishing=no
#add-service-cookie=no
#publish-addresses=yes
publish-hinfo=no
publish-workstation=no
#publish-domain=yes
#publish-dns-servers=192.168.50.1, 192.168.50.2
#publish-resolv-conf-dns-servers=yes
#publish-aaaa-on-ipv4=yes
#publish-a-on-ipv6=no

[reflector]
#enable-reflector=yes
#reflect-ipv=no

[rlimits]
#rlimit-as=
rlimit-core=0
rlimit-data=4194304
rlimit-fsize=0
rlimit-nofile=768
rlimit-stack=4194304
rlimit-nproc=3

avahi-daemon.service

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

[Unit]
Description=Avahi mDNS/DNS-SD Stack
Requires=avahi-daemon.socket

[Service]
#Type=dbus
Type=forking
#BusName=org.freedesktop.Avahi
#ExecStart=/usr/sbin/avahi-daemon -s
ExecStart=/usr/sbin/avahi-daemon -s -D
ExecReload=/usr/sbin/avahi-daemon -r
NotifyAccess=main

[Install]
WantedBy=multi-user.target
Also=avahi-daemon.socket
Alias=dbus-org.freedesktop.Avahi.serviceへ

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

ubnt@ubnt2:/lib/systemd/system$ sudo systemctl reenable avahi-daemon
Removed /etc/systemd/system/dbus-org.freedesktop.Avahi.service.
Removed /etc/systemd/system/sockets.target.wants/avahi-daemon.socket.
Created symlink /etc/systemd/system/dbus-org.freedesktop.Avahi.service -> /lib/systemd/system/avahi-daemon.service.
Created symlink /etc/systemd/system/multi-user.target.wants/avahi-daemon.service -> /lib/systemd/system/avahi-daemon.service.
Created symlink /etc/systemd/system/sockets.target.wants/avahi-daemon.socket -> /lib/systemd/system/avahi-daemon.socket.こ

動作確認

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

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

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

ubnt@ubnt2:/lib/systemd/system$ sudo systemctl status avahi-daemon.service
* avahi-daemon.service - Avahi mDNS/DNS-SD Stack
   Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor pre
   Active: active (running) since Fri 2022-02-18 05:26:35 UTC; 37s ago
  Process: 14132 ExecStart=/usr/sbin/avahi-daemon -s -D (code=exited, status=0/S
 Main PID: 14134 (avahi-daemon)
   CGroup: /system.slice/avahi-daemon.service
           |-14134 avahi-daemon: running [ubnt2.local]
           `-14135 avahi-daemon: chroot helper

Feb 18 05:26:35 ubnt2 avahi-daemon[14134]: Registering new address record fo
Feb 18 05:26:35 ubnt2 avahi-daemon[14134]: Registering new address record fo
Feb 18 05:26:35 ubnt2 avahi-daemon[14134]: Registering new address record fo
Feb 18 05:26:35 ubnt2 avahi-daemon[14134]: Registering new address record fo
Feb 18 05:26:35 ubnt2 avahi-daemon[14134]: Registering new address record fo
Feb 18 05:26:35 ubnt2 avahi-daemon[14134]: Registering new address record fo
Feb 18 05:26:35 ubnt2 avahi-daemon[14134]: Registering new address record fo
Feb 18 05:26:35 ubnt2 avahi-daemon[14134]: Registering new address record fo
Feb 18 05:26:35 ubnt2 avahi-daemon[14134]: Registering new address record fo
Feb 18 05:26:36 ubnt2 avahi-daemon[14134]: Server startup complete. Host nam

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

PS C:\Users\user2> ping ubnt2

ubnt2.local [fe80::76ac:b9ff:fea0:c1ae%12]に ping を送信しています 32 バイトのデータ:
fe80::76ac:b9ff:fea0:c1ae%12 からの応答: 時間 <1ms
fe80::76ac:b9ff:fea0:c1ae%12 からの応答: 時間 <1ms
fe80::76ac:b9ff:fea0:c1ae%12 からの応答: 時間 <1ms
fe80::76ac:b9ff:fea0:c1ae%12 からの応答: 時間 <1ms

fe80::76ac:b9ff:fea0:c1ae%12 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms

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デーモンが有効になっていなかった。

ubnt@ubnt2:~$ journalctl -xe
No journal files were found.

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