DNS以外の名前解決の方法
ネットワークの名前解決というとDNS(Domain Name System)だと思っていたのですが、そのための方法はいくつかあり、DNSを含めた複数の手法が共存している状態だということを知りました。
ここでは主にWindowsとDebian(Linux)におけるそれらについての知識の整理をしたいと思います。
hostsファイル
名前解決の方法のひとつにhostsファイルによるものがあります。これはPCの内部にあるファイルで、そこに名前とIPアドレスの結び付けが書かれています。
PCはこのファイルを参照することにより名前からIPアドレスを取得し通信します。このファイルはPCそれぞれに持つ必要があります。統一するためにはすべてのPCのhostsファイルを管理しなければいけません。そのため大規模ネットワークでの利用は現実的ではありません。
このファイルはWindowsではC:¥Windows¥System32¥drivers¥etcに配置されます。Debianでは/etc/hosts、Macでは/private/etc/hostsにあります。
NetBIOS
NetBIOSはWindowsにおいて古くからある名前解決の方法です。PCに15文字以内で他と重ならないように名前を付けて、その名前を使って接続するという手法です。これはのちにNetBEUIという方式に進化し、現在ではNBT(NetBIOS over TCP/IP)となっています。
Windowsの初期設定時に「PC名」や「コンピューター名」を付けると思いますが、それがここでの名前として用いられます。
NetBIOSでは同一ネットワークであることが前提でしたが、NBTにおいては外部ネットワークとも通信が可能になります。ただそれにはWINS(Windows Internet Name Service)サーバを設ける必要があります。WINSサーバは、いうなればNetBIOS版のDNSサーバです。
また先のhostsファイルと同等のものも存在し、NBT版は「lmhosts」というファイルになります。これはhostsファイルと同じ場所に配置します。
mDNS
mDNSはmulticastDNSの意味で、通常のDNSとは異なる名前解決の方法です。DNSではサーバ側に名前を登録し、各PCはそこに解決を求めるのに対し、mDNSは同一ネットワーク内で自動的に名前を生成・保持・解決をします。管理するサーバも登録作業も不要です。ちなみにmDNSで利用されるポートはUDPの5353番です。
割り当てられる名前はWindows10ならPC名(コンピュータ名).local、Debian(Linux)ならホスト名.local、Macではローカルホスト名.localとなります。pingなどで通信する際、Windowsでは名前だけでも.localを付与した形どちらでも指定可能です。Debianでは.localをつけないと認識してくれません。
mDNSを利用しようと考えた場合、Windowsが標準機能としてmDNSに対応したのは近年になってからですので古いOSの場合は対応が必要です。Debianでは「avahi-daemon」等のパッケージが必要です、MacではmDNSの元となった「Bonjour」が古くからあるので問題ないと思われます。
どの名前解決が用いられるのか
hostsファイル、mDNS、DNS等複数の名前解決の方法があるのはここまで紹介してきた通りです。
それぞれのOSは複数存在するこれらの名前解決の方法に優先順位をつけて実行し解決できた時点で終了します。
Windowsにおいては、MCTの憂鬱:「Windows10の名前解決」によればレジストリに書かれている優先度によって決められるそうです。
レジストリキーは¥HKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥Services¥TCPIP¥ServiceProviderに存在します。
この中にmDNSのエントリーはありませんが、mDNSはDNSやNetBIOSより優先度が低いそうです。
筆者の環境で試してみたところhostsファイルとmDNSで同じ名前にして、HostsProrityの値をffff fffeにしてもhostsファイルの値が採用されました。おそらくこのレジストリの値とは別にmDNSの優先度は低く設定されているようです。そうなっているのは、Windowsがかつて.localをドメインにもつ別の仕組みを持っていて、それとmDNSの.localが衝突するのを予防するためだと筆者は予想します。
DebianにおいてはNSS(Name Service Switch)の設定ファイルに存在します。NSSはネットワークの名前解決だけでなく、ユーザー名などの解決方法の優先順位も決めるものです。/etc/nsswitch.confにエントリーがあり、それぞれの項目名の後:(半角コロン)をつけ、解決方法 [結果=アクション]という指示をスペースで区切って記述します。[]の部分はオプションで省略可能です。
mdns4_minimalという部分がmDNSを解決方法として指示している部分です。[]内の説明をすると、ここでは結果が「NOTFOUND」だったら終了(return)するという指示が加わっています。これは「.local」という末尾のついた名前はmDNS固有の名前だという前提のもと、.localのついた名前をmDNSで解決できなければ(NOTFOUNDが結果として戻れば)、次の処理(dns)に回さないようにしています。つまり不要な処理を避けるものです。
しかし、もし社内ネットワーク等で.localというドメインを運用していたら本来の名前解決ができなくなってしまいます。その場合mdns4_minimalより前に dnsを設定すれば回避できると思いますが、mDNSを運用しているネットワークでmDNS管理範囲以外に.localをドメインとして持つ端末があるとmDNSが正常に稼働しないこともあるそうです。
参考にさせていただきましたサイトの皆様、ありがとうございました。