FreeBSD 12:mdns

mdnsとは、マルチキャストDNSのことです。Apple社が作成した名前解決のためのプロトコルです。Bonjourという名前のほうが有名かな?
これが入っているとLAN内にDNSサーバがなくても、名前解決が出来るようになります。
AppleのMacOS、iPhoneは標準で組み込まれています。WindoesXP~7はAppleのiTuneと一緒にBonjourがインストールされて使えるようになります。Windows10は最近のアップデートで組み込まれたので、何もしなくても使えるようになりました!
Apple系のプロトコルはあまり使いたくはありませんが、

  • 名前解決はパフォーマンスに一番影響する。(名前の問い合わせの応答を待つために時間がかかるとか)
  • ファイルサーバのsambaでmdnsが必要になる。

ために、仕方なく入れることにします。

UNIX系OSでは、mdnsの実装として、avahiとmDNSResponderの2種類があります。
avahiは依存する不要なパッケージが多いことと、RHELなどではavahiの方を入れることが多いので、mDNSResponderを入れてみることにします。

mdnsの応答側のインストール

マルチキャストDNSプロトコルの詳細は省きますが、ブロードキャストされた問い合わせに対して個々のノードが自分の名前を
応答する必要があります。
まずはそれに対応したmDNSResponderをインストールします。

root@cafe:~ # cd /usr/ports/
root@cafe:/usr/ports # echo */mDNS*
dns/mDNSResponder_nss net/mDNSResponder
root@cafe:/usr/ports # cd net/mDNSResponder/
root@cafe:/usr/ports/net/mDNSResponder #

mDNSResponderに2種類ありますが、「mDNSResponder」が応答側、「mDNSResponder_nss」が問い合わせ側になります。

root@cafe:/usr/ports/net/mDNSResponder # make

まずは、応答側の「mDNSResponder」を、いつものようにportsからコンパイルを行います。

configはデフォルトのままにしておきます。

===>  License APACHE20 BSD3CLAUSE accepted by the user
===>   mDNSResponder-1096.40.7 depends on file: /usr/local/sbin/pkg - found
=> mDNSResponder-1096.40.7.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-1096.40.7.tar.gz
mDNSResponder-1096.40.7.tar.gz                        2120 kB 2039 kBps    01s
===> Fetching all distfiles required by mDNSResponder-1096.40.7 for building
===>  Extracting for mDNSResponder-1096.40.7
=> SHA256 Checksum OK for mDNSResponder-1096.40.7.tar.gz.
===>  Patching for mDNSResponder-1096.40.7
===>  Applying FreeBSD patches for mDNSResponder-1096.40.7 from /usr/ports/net/mDNSResponder/files
===>   mDNSResponder-1096.40.7 depends on package: gmake>=4.3 - found
===>  Configuring for mDNSResponder-1096.40.7
===>  Building for mDNSResponder-1096.40.7
gmake[2]: Entering directory '/usr/ports/net/mDNSResponder/work/mDNSResponder-1096.40.7/mDNSPosix'
cc -O2 -pipe  -fstack-protector-strong -fno-strict-aliasing  -I../mDNSCore -I../mDNSShared -I../DSO -I -Iobjects/prod -fwrapv -W -Wall -DPID_FILE=\"/var/run/mdnd/ && install  -s -m 555 dnsextd /usr/ports/net/mDNSResponder/work/stage/usr/local/sbin/
/usr/bin/strip /usr/ports/net/mDNSResponder/work/stage/usr/local/bin/dns-sd
====> Compressing man pages (compress-man)
===> Staging rc.d startup script(s)
root@cafe:/usr/ports/net/mDNSResponder #

コンパイルが完了しました。

root@cafe:/usr/ports/net/mDNSResponder # make install
===>  Installing for mDNSResponder-1096.40.7
===>  Checking if mDNSResponder is already installed
===>   Registering installation for mDNSResponder-1096.40.7
Installing mDNSResponder-1096.40.7...
===> SECURITY REPORT:
      This port has installed the following files which may act as network
      servers and may therefore pose a remote security risk to the system.
/usr/local/bin/mDNSNetMonitor
/usr/local/sbin/mdnsd
/usr/local/bin/mDNSClientPosix
/usr/local/sbin/dnsextd
/usr/local/bin/mDNSResponderPosix
/usr/local/bin/mDNSProxyResponderPosix

      If there are vulnerabilities in these programs there may be a security
      risk to the system. FreeBSD makes no guarantee about the security of
      ports included in the Ports Collection. Please type 'make deinstall'
      to deinstall the port if this is a concern.

      For more information, and contact details about the security
      status of this software, see the following webpage:
https://developer.apple.com/bonjour/
root@cafe:/usr/ports/net/mDNSResponder #

make installコマンドでインストールが完了しました。

mdnsの応答側の設定

まずは、自動起動の設定です。

root@cafe:/usr/ports/net/mDNSResponder # bsdconfig

/etc/rc.confを直接編集しても良いのですが、bsdconfigコマンドを使ってみましょう。

「C Startup」を選択します。

「1 Toggle Startup Service」を選択します。

「mdnsd_enable」と「mdnsresponderposix_enable」にチェックを入れて、「Exit」を選択します。
これで自動起動の設定は完了です。

root@cafe:/usr/ports/net/mDNSResponder # cat /etc/rc.conf
hostname="cafe.lo.zeke.ne.jp"
keymap="jp.106"
ifconfig_vtnet0="inet 192.168.1.7 netmask 255.255.255.0"
defaultrouter="192.168.1.254"
ifconfig_vtnet0_ipv6="inet6 2001:2c0:cd03:ca00::cafe/64"
ipv6_defaultrouter="2001:2c0:cd03:ca00::254"
local_unbound_enable="YES"
sshd_enable="YES"
ntpdate_enable="YES"
ntpd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="NO"
php_fpm_enable="YES"
nginx_enable="YES"
mdnsd_enable="YES"
mdnsresponderposix_enable="YES"
root@cafe:/usr/ports/net/mDNSResponder #

/etc/rc.confに「mdnsd_enable」と「mdnsresponderposix_enable」の設定が増えていることを確認します。

root@cafe:/usr/ports/net/mDNSResponder # vi /usr/local/etc/mDNSResponder.conf
root@cafe:/usr/ports/net/mDNSResponder # cat /usr/local/etc/mDNSResponder.conf
cafe
_ssh._tcp. local
22
cafe ssh server

root@cafe:/usr/ports/net/mDNSResponder #

次に、設定ファイル /usr/local/etc/mDNSResponder.conf を作成します。これは、このサーバでどんなサービスが動いているか応答するための情報を書いておきます。ここではとりあえずsshだけ書いておきました。
サービスが増えたら、後から追加しようと思います。

root@cafe:/usr/ports/net/mDNSResponder # vi /etc/rc.conf
root@cafe:/usr/ports/net/mDNSResponder # cat /etc/rc.conf
hostname="cafe.lo.zeke.ne.jp"
keymap="jp.106"
ifconfig_vtnet0="inet 192.168.1.7 netmask 255.255.255.0"
defaultrouter="192.168.1.254"
ifconfig_vtnet0_ipv6="inet6 2001:2c0:cd03:ca00::cafe/64"
ipv6_defaultrouter="2001:2c0:cd03:ca00::254"
local_unbound_enable="YES"
sshd_enable="YES"
ntpdate_enable="YES"
ntpd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="NO"
php_fpm_enable="YES"
nginx_enable="YES"
mdnsd_enable="YES"
mdnsresponderposix_enable="YES"
mdnsresponderposix_flags="-f /usr/local/etc/mDNSResponder.conf"
root@cafe:/usr/ports/net/mDNSResponder #

「mdnsresponderposix_flags="-f /usr/local/etc/mDNSResponder.conf"」この行を追加して、設定ファイルをmdnsresponderposixに読み込ませるように、起動オプションを変更しました。

root@cafe:/usr/ports/net/mDNSResponder # reboot

再起動して、mdnsを有効にします。

mdnsの応答側の動作確認


MacOSやITuneをインストールしたWindowsから、pingを打って名前解決の動作確認を行います。
iTuneをインストールしたWindowsからping cafe.localコマンドを実行します。「.local」はmdns用のドメインです。
ちゃんと名前解決ができて、pingの応答が返ってくることが確認できました。

root@cafe:~ # mDNSNetMonitor

0:03:05.262090 Interface 1/vtnet0
192.168.1.70     -Q-              Q:  1  Ans:  0  Auth:  0  Add:  0  Size:   28 bytes
192.168.1.70     (QM)  Addr       cafe.local.

0:03:05.262546 Interface 1/vtnet0
192.168.1.7      -R-              Q:  0  Ans:  1  Auth:  0  Add:  3  Size:  114 bytes
192.168.1.7      (AN)  Addr   120 cafe.local. -> 192.168.1.7
192.168.1.7      (AD)  AAAA   120 cafe.local. -> fe80::a00:27ff:fea8:e8f
192.168.1.7      (AD)  AAAA   120 cafe.local. -> 2001:2c0:cd03:ca00::cafe
192.168.1.7      (AD)  NSEC   120 cafe.local. -> Addr AAAA

0:03:05.355778 Interface 1/vtnet0
192.168.1.70     -R-              Q:  0  Ans:  1  Auth:  0  Add:  1  Size:   85 bytes
192.168.1.70     (AN)  PTR    120 70.1.168.192.in-addr.arpa. -> virtual-xp.local.
192.168.1.70     (AD)  NSEC   120 70.1.168.192.in-addr.arpa. -> PTR

0:03:05.455005 Interface 1/vtnet0
192.168.1.70     -R-              Q:  0  Ans:  0  Auth:  0  Add:  1  Size:   45 bytes
192.168.1.70     (AD)  NSEC   120 virtual-xp.local. -> Addr

mDNSNetMonitorコマンドはネットワーク上のmdnsプロトコルをキャプチャするコマンドです。
192.168.1.70(Windows)からcafe.localのIPアドレスをたずねるブロードキャストが飛び、192.168.1.7(FreeBSD)がそれに応答して自分のIPアドレスを答えていることが確認できます。

mdnsの問い合わせ側のインストール

mdnsの応答に対応できるようになったら、FreeBSDからも問い合わせができるようにしたいですよね。

root@cafe:~ # cd /usr/ports/dns/mDNSResponder_nss

PortsのmDNSResponder_nssをインストールします。

root@cafe:/usr/ports/dns/mDNSResponder_nss # make
===>  License APACHE20 BSD3CLAUSE accepted by the user
===>   mDNSResponder_nss-1096.0.2 depends on file: /usr/local/sbin/pkg - found
=> mDNSResponder-1096.0.2.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch http://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-1096.0.2.tar.gz
:
省略
:
install  -m 0644 /usr/ports/dns/mDNSResponder_nss/work/mDNSResponder-1096.0.2/mDNSPosix/nss_mdns.conf  /usr/ports/dns/mDNSResponder_nss/work/stage/usr/local/share/examples/mDNSResponder
install  -m 444 /usr/ports/dns/mDNSResponder_nss/work/mDNSResponder-1096.0.2/mDNSPosix/nss_mdns.conf.5  /usr/ports/dns/mDNSResponder_nss/work/stage/usr/local/man/man5
install  -m 0644 /usr/ports/dns/mDNSResponder_nss/work/mDNSResponder-1096.0.2/mDNSPosix/nss_mdns.conf  /usr/ports/dns/mDNSResponder_nss/work/stage/usr/local/etc/nss_mdns.conf.sample
====> Compressing man pages (compress-man)
root@cafe:/usr/ports/dns/mDNSResponder_nss # 

makeしてみました。特に依存関係はないみたいです。

root@cafe:/usr/ports/dns/mDNSResponder_nss # make install
===>  Installing for mDNSResponder_nss-1096.0.2
===>  Checking if mDNSResponder_nss is already installed
===>   Registering installation for mDNSResponder_nss-1096.0.2
Installing mDNSResponder_nss-1096.0.2...
To enable the mDNSResponder NSS module, update the hosts entry in
/etc/nsswitch.conf by adding mdns, preferably between files and dns:

hosts: files mdns dns

root@cafe:/usr/ports/dns/mDNSResponder_nss # 

インストール完了です。設定ファイルは/etc/nsswitch.confみたいですね。

mdnsの問い合わせ側の設定

root@cafe:/usr/ports/dns/mDNSResponder_nss # cp -p /etc/nsswitch.conf /etc/nsswitch.conf.orig
root@cafe:/usr/ports/dns/mDNSResponder_nss # vi /etc/nsswitch.conf

root@cafe:/usr/ports/dns/mDNSResponder_nss # diff /etc/nsswitch.conf /etc/nsswitch.conf.orig
7c7
< hosts: files dns
---
> hosts: files mdns dns
root@cafe:/usr/ports/dns/mDNSResponder_nss # 

インストールしたときに出てきたメッセージのとおりに、hosts:セクションのfilesとdnsの間に、mdnsを追加します。

mdnsの問い合わせ側の動作確認

root@cafe:/usr/ports/dns/mDNSResponder_nss # ping virtual-xp.local
PING virtual-xp.local. (192.168.1.70): 56 data bytes
64 bytes from 192.168.1.70: icmp_seq=0 ttl=128 time=0.482 ms
64 bytes from 192.168.1.70: icmp_seq=1 ttl=128 time=0.498 ms
64 bytes from 192.168.1.70: icmp_seq=2 ttl=128 time=0.396 ms
64 bytes from 192.168.1.70: icmp_seq=3 ttl=128 time=0.455 ms
^C
--- virtual-xp.local. ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.396/0.458/0.498/0.039 ms
root@cafe:/usr/ports/dns/mDNSResponder_nss #

iTuneをインストールしたWindowsにpingを打ってみました。ホスト名.localで正常に名前解決ができることを確認しました。

mdnsのインストールと設定は以上です。