2015年5月17日日曜日

mDNS、Avahi、Bonjour

 よくわからんなぁ。
 VirtualBoxにFreeBSDを入れて、ネットワークアダプタを二つ定義した。NATとホストオンリーアダプタである。これでパケットの到達性はグローバル、ローカルともに確保されたはず。VirtaulBoxのホストOSであるMacOSへの到達性を考えなければ、NATひとつだけで充分なのだけれど。

 で、よくわからないのはAvahi——mDNSの名前解決。あるいはAppleでいうBonjour。というのもMacBook Airをスタンドアローンにして使うと、MacOS、FreeBSD on VirtualBoxともに相手の名前を解決できるのに、無線LANにつないだとたん、FreeBSDから名前解決できなくなる。——なんで?
 さらにいうならスタンドアローンの状態で、FreeBSD側でネットワークアダプタにDHCPでアドレス解決していないと、MacOS側から名前解決ができなくなる。FreeBSD側からはできるのに。
 というか、ホストオンリーアダプタなしNATのみの状態でもFreeBSD側からはMacOSの名前解決がされている。ただし、到達性のない「127.0.0.1」というIPアドレスで。いやぁ、わかるような、わからないような。おそらくMacOSにとって自分自身のホスト名は当然、「127.0.0.1」——localだからそれを返却しているのだろう。自分自身が自分の名前解決をしていると思っているのかな?

 などと思い悩んでいると、avahi-resolveというコマンドがあることに気づいた。使ってみると——。

$ avahi-resolve --address 192.168.56.1
192.168.56.1 MacBookAir.local
$ avahi-resolve --name MacBookAir.local
MacBookAir.local 192.168.56.1
$ ping MacBookAir.local
ping: cannot resolve MacBookAir.local: Unknown host
$ ping 192.168.56.1
PING 192.168.56.1 (192.168.56.1): 56 data bytes
64 bytes from 192.168.56.1: icmp_seq=0 ttl=64 time=0.200 ms
64 bytes from 192.168.56.1: icmp_seq=1 ttl=64 time=0.418 ms
^C
--- 192.168.56.1 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.200/0.309/0.418/0.109 ms

 これはMacBook Airが無線LAN接続しているときに、VirtualBoxのFreeBSDで操作したもの。あっ、名前解決しているじゃないか。でもpingで名前指定では「Unknown host」になっている。
 これはあれだ。名前解決の順番に問題があるんだ。
 たしか、/etcの下に設定ファイルがあったはず……。
 「/etc/nsswitch.conf」だった。あれ? こんな名前のファイルだっけかな?
 この中に名前解決する順番が定義されている。

hosts: files dns

 となっている。
 おそらく、DNSにつながっているとき、名前解決ができないのはこのせいだろう。DNSが「Unknown host」を返してしまっているのだろう。
 じゃ、こうだろう。

hosts: files mdns dns

 DNSで名前解決する前にavahiで解決すれば、問題ないはずだ。
 ただし、この設定を有効にするには「nss_mdns」のインストールが必要で、「pkg install nss_mdns」した。
 以上で問題は解決——かつてThinkPadからMacBook Airを引けなかった問題も解決した。ただし、Avahiは「traceroute」で1階層でつながっていなければ、ならないらしく、それより上の階層の名前解決はできなかった。
 たとえば、MacBook Airと同じレイヤーにある機器にはVirtualBoxの中のFreeBSDからは名前解決できなかった。NATごしにIPは到達できるのだが。
 ちなみにmdnsが名前解決できなくてもDNSはちゃんと呼ばれているらしく、グローバルの名前解決できているようだ(ブラウザでサイトが開けた)。

 あといくつか、メモ。

  1. avahiのインストールは「pkg install avahi」
  2. /etc/rc.confに「avahi_daemon_enable="YES"」でOK
  3. /usr/local/etc/avahi/avahi-daemon.confの編集は必要なく、/etc/rc.confの「hostname="XXXX"」が名前になる。名前は「XXXX.local」。localはおそらくデフォルトのドメイン。
  4. グローバルネットにつながっていないのならそれでLANの名前解決はできる。
  5. グローバルネットにつなっているなら、名前解決の順番を調整する必要がある(DNSが名前が解決できない、と怒ってしまうので)。
  6. まず、「nss_mdns」のインストール(「pkg install nss_mdns」)
  7. 次に/etc/nsswitch.confの「hosts:」行でdnsより前にmdnsを定義。

 以上。  ああ、すっきりした。