7月 082015
 

今回は Zeroconf (zero-configuration networking) について考察してみたいと思います。と、言っても OS X でのお話ではなく FreeBSD でのお話になります。

そもそも Zeroconf とは Apple が考えたプロトコルで OS X に実装されました。どうして『ゼロコンフと言うのだ?』と言えば『一個も設定しなくてもネットワークが色々使えるようになるからだ。』ということらしいのですが、詳しいことについては Apple のドキュメントや(多分あると思うけど) Wiki などを見てください。

今回は FreeBSD で利用する Zoroconf についてのお話です。

なお、文中「mdns」などと書かれている部分がありますが Zeroconf のプログラムが起動してマルチキャスト DNS を受信するモノという認識でお願いします。特定のアプリケーションやデーモンではありません。

僕の知っている(利用している)かぎり Zeroconf の実装は二つあります。 ports 的には

net/mDNSResponder/
net/avahi-app/

ですね。今回はこの二つを比べながら見ていきたいと思います。

 
1). どちらを利用するか?
mDNSResponder も Avahi も Zeroconf の実装なので基本的にやっていることはどちらも一緒です。ただ、 net/mDNSResponder/ のほうが軽量で ports からインストールする分には関連性でインストールされるモノが少なくて済みます。

かたや net/avahi-app/ は dbus や glib などを巻き込んでのインストールとなるので結構大げさになってきます。なので、デスクトップで利用している PC では net/avahi-app/ を、サーバなどで動作させたい場合には net/mDNSResponder/ をインストールするのが良いかと思われます。

例えば最近の net/samba41/ や net/samba42/ の場合は Zeroconf にどちらかを指定できるようになりました。 サーバの場合には mDNSResponder を、 KDE4 などのデスクトップを利用している場合には Avahi を利用するのが良いでしょう。

ちなみに両方インストールして両方起動すると「似たようなのが既に動いているよん。」などと syslog に出力されます。

 
2). インストールについて
実際にコテコテに利用する場合にインストールするモノについて説明します。

・mDNSResponder
以下の ports をインストールするのが良いと思います。

# cd /usr/ports/net/mDNSResponder/
# make install
# cd /usr/ports/dns/mDNSResponder_nss/
# make install
# cd /usr/ports/net/howl/
# make install

 
合計三つの ports をインストールします。インストールされるモノが比較的少ないので助かります。 FreeBSD/arm などではこっちのほうが良いですね。

・Avahi
こいつは関連性でドドドと『こんなん要らんっ!!』と、いうモノまでインストールしてしまいます。デスクトップ環境でインストールするのにおすすめです。

# cd /usr/ports/net/avahi-app/
# make install
# cd /usr/ports/dns/nss_mdns/
# make install

 
こうしてみると net/avahi-app/ のほうが楽そうに見えますけどね;-)。 しかし、サーバに cairo とか要らんし・・。

net/avahi-app/ は net/howl/ に相当する部分を内包しています。 libhowl.so などは net/avahi-app/ をインストールすると入ります。 net/mDNSResponder/ をインストールする場合には個別に net/howl/ をインストールする必要があります。

 
3). 設定
何はなくとも OS X のように ping hostname.local とか打ってみたいですよね。その場合は /etc/nsswitch.conf に以下の設定を行います。「クライアント側の設定」という位置づけでしょうかね。

 :
hosts: files mdns dns
 :

 
hosts: の行は標準であれば /etc/hosts を参照するための “files” と named を参照するための “dns” が書かれていると思います。ここに mdns を参照するための “mdns” を追加します。上記設定では “dns” よりも先に “mdns” を参照することになります。

 
続いて mDNSResponder や Avahi のサーバ側の設定をしていきます。

がっ!!『をいをい。ぜろこんふ ってのは設定無しで利用できるんだろう? どうして設定するんだぁ?』などと思います。『全然ぜろこんふじゃねーじゃんっ!!』みたいな・・。
しかし mDNSResponder のほうは本当に “ぜろこんふ” です。設定する必要はありません。さすがは Apple 謹製;-)。とわ言いつつ、実際は設定できるんですけどね。あとで、その設定方法について書きます。

Avahi のほうは /usr/local/etc/avahi/avahi-daemon.conf をちょっとだけ変更します。以下は設定変更の例です。

[server]
host-name=wanchan
domain-name=local
browse-domains=running-dog.net, icmpv6.org
use-ipv4=yes
use-ipv6=yes
allow-interfaces=bge0
deny-interfaces=re0
 :

 
これくらいで良いでしょうかねぇ。 host-name= domain-name= browse-domains= はまぁ、お約束で書いていきます。 IPv6 を利用している人は use-ipv6=yes にしてと。

あと、 mdns はマルチキャスト DNS (port:5353 の UDP) を流すので PC に NIC が複数ある場合にはどこのインターフェースにマルチキャストを流すのか許可・拒否設定ができます。

これらの設定が終わったら起動します;-)。一応 /etc/rc.conf の設定などを。これは FreeBSD の設定なので “ぜろこんふの設定” とは関係ない;-)。

・mDNSResponder

mdnsd_enable="YES"
mdnsresponder_enable="YES"

 
・Avahi

avahi_daemon_enable="YES"
avahi_dnsconfd_enable="YES"

 
あとは起動して完了です。

 
4). 確認方法
確認方法についてですが、以前「iOS4.2・AirPrint で体験する avahi。」というエントリで Avahi に付いては書いています。なので、この項は先に Avahi のほうから書きましょう;-)。

・Avahi

 $ avahi-browse -art

 
このコマンドを叩くと mdns が動作していて、提供されているサービスの一覧やホスト名が表示されます。

Avahi の場合には /usr/local/etc/avahi/services/ に ssh.service と sftp-ssh.service があるのでそれらのサービスが _ssh._tcp とか _sftp-ssh._tcp で見えますね。 このディレクトリに XML 形式の設定ファイルを突っ込むと他のサービスも見えるようにすることができます。 PDF プリンタとかですね。

一方 mDNSResponder のほうはそれらのサービスが登録されてないので上記コマンドでも見えません。

例えば net/samba42/ をインストールして make config のオプションのところで Zeroconf に mDNSResponder を指定した場合は _smb._tcp というサービスが見えるので、一応、正常に動いていることは確認できると思います。

 
と、ここで話は前後して申し訳ないですが mDNSResponder の設定について書きます。 Avahi みたいに _ssh._tcp. と _sftp-ssh._tcp. は表示してもらいたいぜぃ。と、いうことで設定ファイルを一個書いてみます。
例えば /usr/local/etc/Bonjour.conf というファイルを用意します。記載する内容は以下の要領で。

wanko
_ssh._tcp. local
22
wanko ssh server

wanko
_sftp-ssh._tcp. local
22
wanko sftp server

 
一行目は name=[] に相当します。今回はホスト名を書きました。
二行目はサービス。 Avahi と一緒にしてみましょう;-)。
三行目はそのサービスのポート番号。
四行目は説明文。TXT=[] で利用されますが、好きな文字列をどうぞ。

になります。他にもどんどんサービスを追加できます。 _smb.tcp. とかもね。けど、既に net/samba42/ で利用しているので書く必要は無いです。逆に net/samba42/ で Zerobof をリンクせず、このファイルに書いても良いわけですね。
けど、どうせ mDNSResponder をインストールするのであれば samba にリンクしたほうが良いような気はしないでもないです;-)。

設定ファイルが出来上がったら /usr/local/bin/mDNSResponderPosix に食わせます。 起動用スクリプトとして /usr/local/etc/rc.d/mdnsresponderposix というのがあるのですが、こいつはオプションにファイルを指定できないので以下のように改修します。

#!/bin/sh
 :
(略)
 :
load_rc_config $name

: ${mdnsresponderposix_enable="NO"}
: ${mdnsresponderposix_pidfile="/var/run/${name}.pid"}
: ${mdnsresponderposix_flags=""}

command="/usr/local/bin/mDNSResponderPosix"
command_args="-b -P ${mdnsresponderposix_pidfile}"

run_rc_command $*

 
mdnsresponderposix_flags を新規に定義しました。あとは /etc/rc.conf に以下のように書きます。

mdnsd_enable="YES"
mdnsresponder_enable="YES"
mdnsresponderposix_enable="YES"
mdnsresponderposix_flags="-f /usr/local/etc/Bonjour.conf"

 
これで起動しますが mDNSResponder のプロセスは全部で三つ起動することになりました。あとは別の PC 上の avahi-browse コマンドで届いた情報を確認すれば良いですね;-)。

 
さてと。ここで話をもどしてと;-)。

Avahi の場合は他にもコマンドが色々あるので試してみると良いです。例えば DHCP で動作している PC があったとして、ホスト名は解るが IP アドレスが解らない場合は

$ avahi-resolve-host-name wanchan.local
wanchan.local  192.168.1.153

 
が有用です。 cat /var/db/dhcpd.leases しなくても IP アドレスが確認できるようになります;-)。 あ。 avahi-resolve-host-name -6 ってオプションもあるのでご安心を;-)。
Avahi の場合はコマンドラインインターフェースの他に GUI の ports もあるので色々試してみるのも良いかもしれません。

・mDNSResponder
mDNSResponder の場合は利用できるコマンドがあまりないんですよねぇ・・。まずは mDNSIdentify というコマンドです。

$ mDNSIdentify wanko.local
setsockopt - SO_RECV_ANYIF: Protocol not available
setsockopt - SO_RECV_ANYIF: Protocol not available
setsockopt - SO_RECV_ANYIF: Protocol not available
setsockopt - SO_RECV_ANYIF: Protocol not available
gonta.local. AAAA 2021:1470:FFFF:FEE1:0000:0000:0000:0001
gonta.local. Addr 192.168.1.129
gonta.local. AAAA 2021:1470:FFFF:FEE1:0201:0BFF:1110:2C98
HINFO Hardware: AMD64
HINFO Software: FREEBSD
mDNS_PurgeCacheResourceRecord: Lock not held! mDNS_busy (0) mDNS_reentrancy (0)
mDNS_PurgeCacheResourceRecord: Lock not held! mDNS_busy (0) mDNS_reentrancy (0)
mDNS_PurgeCacheResourceRecord: Lock not held! mDNS_busy (0) mDNS_reentrancy (0)
mDNS_PurgeCacheResourceRecord: Lock not held! mDNS_busy (0) mDNS_reentrancy (0)
No response after 4 seconds
_services._dns-sd._udp.local. PTR Trying multicast
No response after 4 seconds
_services._dns-sd._udp.local. PTR *** No Answer ***

 
ホスト名が解るとそれをオプションに指定すると情報が表示されます。なんかエラーになっているところもありますけどねf(^^;;。

もう一個。実行形式は記載しませんが mDNSNetMonitor というコマンド。

これを実行しておいて、別の PC から avahi-browse -art を叩くとドドドと表示されます。また Mac は定期的にマルチキャスト送ってくるのね。など、パケットキャプチャ的に利用できます。

 
とまぁ、基本的にはこんな感じで。
利用する側は /etc/nsswitch.conf の hosts: 行に mdns と指定するために マルチキャスト DNS 用の nss 系の ports をインストールする必要があります。

あとは上にも書いた通り DHCP で利用している PC や IoT 機器の探査などに利用することも可能です。

 
ユーザに見える部分としてはこんな感じでしょうか。あとは Mac などの OS や KDE4 などの統合デスクトップ環境に組み込まれている場合、アプリ側で良きに計らってくると思います。例えば Finder (OS X のファイルマネージャ) や dolphin (KDE4 のファイルマネージャ) などではルチキャスト DNS でホスト情報を収集し左側のメニューに表示してくれたりとか、 _ipp._tcp に対応しているプリンタを発見してくれるとか。

そー言えば以前 Windows7 を利用しているときはわざと Apple の Bonjour をインストールしていたなぁ。プリンタの探査が早くなるので。

と、いうことでそーいう感じで Zoroconf の実装を利用するのも良いかと思われます。

 
最近の Raspberry Pi2 の OS なんかは『一番最初にウェブにアクセスする場合には hoge.local でアクセスしろ。』みたいに書かれているモノがあったりするのですが、それって、アクセスする側は mdns が動いてないとダメじゃん。となるのであります。
最近の Linux (ubuntu かな?) は default で mdns が動いているのかな? そー考えると FreeBSD でも稼働しているものは mdns を動かしておいたほうが良いのかもしれないですね。

 
内容的にはまだ浅いのかも知れませんが、今回はこんなところでおしまいにしましょうf(^^;;。

 
2015/07/09 加筆
mDNSResponderPosix って core dump するじゃん・・。orz FreeBSD/amd64 や FreeBSD/arm で core dump する。場所は libc の中で。しかし、ちゃんと動作する場合や環境もあるので何が悪いのか、解らない。 orz

mDNSResponderPosix は -f でファイル名を指定できるし、 -n からドドドと他にオプションも指定できます。

 # mDNSResponderPosix -name wanchan  -t _ssh._tcp -p 22

 
と、いう起動の方法もありますが、サービスが一個しか指定できない・・。
しかし、この場合も core dump する場合があります・・。orz

 
と、いうことで素直に mDNSResponder を使ってみましょう。こいつも -f で設定ファイルを指定することができます。その設定ファイルの中身は以下のような感じです。

wanchan        _ssh._tcp.      local   22
wanchan        _sftp-ssh._tcp. local   22

 
これで OK。 mDNSResponder はマルチキャスト DNS を流すインターフェースも指定できるようです。それらを合わせた起動オプションは以下で良いかな。

# mDNSResponder -i bge0 -f /usr/local/etc/mDNSResponder.conf

 
これで Avahi で設定した動作と同じことができるようになったはずです。 mDNSResponderPosix の設定ファイルの記述方法よりも mDNSResponder の設定ファイルの記述のほうが直感的ですよね;-)。

 
せっかくなので mDNSResponder を利用した場合の avahi-browse -art に相当する(かもしれない)確認方法についてちょっと書いておきます。 dns-sd というコマンドを利用します。 -B がそれに近いでしょうかね。

$ dns-sd -B _ssh
Browsing for _ssh._tcp
DATE: ---Thu 12 Jul 2025---
22:44:14.360  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
22:88:14.301  Add        2   1 local.               _ssh._tcp.           wanton
22:88:14.419  Add        2   2 local.               _ssh._tcp.           wanko
22:88:14.588  Add        3   1 local.               _ssh._tcp.           wantaro

 
オプション無しで dns-sd を叩くとコマンドオプションが表示されます。 -B で Browse 機能。ただオプションにサービス名を指定する必要がありますが。
他に dns-sd -G オプションも役に立つかも知れません。

 
と、いうことで、これが、僕の知っている Zeroconf のほぼ全てです。

Zeroconf の設定ができると bind9 の name.conf で色々設定する view “internal” { } って要らねんじゃね? などと思えてきました。まぁ、全部の PC や端末が Zeroconf をしゃべれるわけでは無いのですけどね。
しかし、今回はデスクトップ機もサーバも Zeroconf がしゃべれるようになったので中々良い感じです。
あ。当然 mDNSResponder と Avahi 間でも通信は行えるのでどちらをチョイスしても全然問題ありません。

皆さんも自宅もしくは職場・データセンタのネットワークにマルチキャスト流してみませんか? ;-)。