よくわからんなぁ。
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はちゃんと呼ばれているらしく、グローバルの名前解決できているようだ(ブラウザでサイトが開けた)。
あといくつか、メモ。
- avahiのインストールは「pkg install avahi」
- /etc/rc.confに「avahi_daemon_enable="YES"」でOK
- /usr/local/etc/avahi/avahi-daemon.confの編集は必要なく、/etc/rc.confの「hostname="XXXX"」が名前になる。名前は「XXXX.local」。localはおそらくデフォルトのドメイン。
- グローバルネットにつながっていないのならそれでLANの名前解決はできる。
- グローバルネットにつなっているなら、名前解決の順番を調整する必要がある(DNSが名前が解決できない、と怒ってしまうので)。
- まず、「nss_mdns」のインストール(「pkg install nss_mdns」)
- 次に/etc/nsswitch.confの「hosts:」行でdnsより前にmdnsを定義。
以上。
ああ、すっきりした。