2022年1月27日木曜日

FreeBSDとLinuxでホスト名.localでの名前解決

FreeBSDでDNSと連動したdhcpサーバーの運用がめんどうになってきたので、FreeBSDでもホスト名.localでの名前解決ができるように設定をしました。手順は、以下の説明にようにしました。

FreeBSD 12:mdns
https://zeke.jp/dns

以下に手順を引用します。

# pkg instgall mDNSResponder
....
# pkg install mDNSResponder_nss
...
# cat /etc/rc.conf
mdnsd_enable="YES"
mdnsresponderposix_enable="YES"
mdnsresponderposix_flags="-f /usr/local/etc/mDNSResponder.conf"
# cat /usr/local/etc/mDNSResponder.conf
ホスト名
_ssh._tcp. local
22
ホスト名 ssh server
...
# cat /etc/nsswitch.conf
...
# hosts: files dns
hosts: files mdns dns
...
# /usr/local/etc/rc.d/mdns start
...
# /usr/local/etc/rc.d/mdnsresponderposix
...
#

こうするとFreeBSDからWindowsなどのPCに対して、またその逆に以下のようにpingができるようになります。

$ ping ホスト名.local 

mDNSでsshやhttpサービスを提供するホストは

Zeroconf 考察。
https://running-dog.net/2015/07/post_1544.html

の説明のように見つけることができます。以下に例をあげます。

$ dns-sd -B _ssh
Browsing for _ssh._tcp
DATE: ---Fri 22 Apr 2022---
14:40:34.422 ...STARTING...
Timestamp A/R Flags if Domain Service Type Instance Name
14:40:34.422 Add 3 21 local. _ssh._tcp. ss-mini18
^C
$

サービス名には_httpや_smbなどあり、一覧は以下のようにして見つけることができます( discover iOS device name using mDNS - https://stackoverflow.com/questions/18884422/discover-ios-device-name-using-mdns 参照)。

$ dns-sd -B _services._dns-sd._udp
Browsing for _services._dns-sd._udp
DATE: ---Fri 22 Apr 2022---
15:01:13.294 ...STARTING...
Timestamp A/R Flags if Domain Service Type Instance Name
15:01:13.294 Add 3 4 . _tcp.local. _amzn-wplay
15:01:13.294 Add 3 4 . _tcp.local. _airport
^C
$

IPアドレスは以下のようにします。

$ dns-sd -G v4 macbook.local
DATE: ---Fri 22 Apr 2022---
15:05:50.623  ...STARTING...
Timestamp     A/R    Flags if Hostname                               Address                                      TTL
15:05:50.807  Add        2  4 macboo.local.                        172.xx.yyy.zzz                               120
^C
$ 

Linux(ubuntu 20.04)については以下のようにすればよいようです。

$ sudo apt install avahi-daemon libnss-mdns
$ cat /etc/nsswitch.conf
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
$
IPv6も使う場合には以下のようにするようです。
hosts: files mdns_minimal [NOTFOUND=return] dns mdns

これだけではだめでホストでサービスの広告をしなくてはなりません。

Avahi
https://wiki.archlinux.jp/index.php/Avahi
にあるように、AvahiにはSSHサーバーを広告するサンプルがありました。
# cp /usr/share/doc/avahi/ssh.service /etc/avahi/services/
avahiはファイルが置かれたことを検知するようで、デーモンの再起動などは不要です。
そして、FreeBSDのdns-sdと同じようなことをするにはmds-scanパッケージを使います。

$ sudo apt install mdns-scan
...
$ mdns-scan
+ AirPortTimeCapsule802.11ac._smb._tcp.local
+ EPSON PX-504A-IOT._smb._tcp.local
...
こうしておけばLANのホスト名とIPアドレスの組の管理が少しだけ楽になります。