突然消失するかもしれないブログ

”とつきえブログ”

Windows, Mac OS X, Linux間でDNSを使わずにホスト名を解決する方法:mDNS編

NetBIOS over TCP/IP編に引き続き、mDNSを使用してWindows, Mac OS X, Linux間でホスト名を解決する方法についてです。

以下、長文となります。

まずはmDNS関連のサーベイから。

  mDNS LLMNR
概要 mDNS – osdev-j (MMA)

ネットワークプロトコル Rendezvous DNS DNS-SD

http://www.multicastdns.org/ – 本家

Multicast DNS。DNSパケットをIPマルチキャストで流す。標準ポートは5353。

DNS-SDによるサービスルックアップに用いられる。

DNS-SD

LLMNR – osdev-j (MMA)

RFC:4795mDNSに相当する位置付。

UDPポート5355、IPv4マルチキャスト224.0.0.252、IPv6マルチキャストFF02:0:0:0:0:0:1:3。パケットフォーマットはDNSと同様。

対応製品

・AppleのBonjourはmDNSを使用している。(Mac OS X, iTunes, iPhone/iPod touchなど)
Bonjour – Wikipedia

・Linuxのavahiが対応しているのはmDNS。

・Windows Vista以降で、LLMNRに対応している。

・Apple製品で対応しているのはmDNSで、Microsoft製品で対応しているのはLLMNR。

・AppleとMicrosoftが解決しようとしている問題は同じですが、mDNSとLLMNRは上記を見てもわかるとおり、使用するポート番号が異なるし、互換性がありません。大人の事情ってやつでしょうか。

 

○mDNSを使用できるようにする。

ということで、以下の設定を行えば、Windows, Mac OS X, Linuxから、「ホスト名.local」でホスト名の解決が出来るようになります。

■Windows

最新のiTunesをインストールするか、Bonjour for Windowsをインストールします。

Bonjourがインストールされていれば特に何もしなくてもmDNSで「ホスト名.local」でホスト名の解決ができるようになります。

さて、ここで気になるmDNSとLLMNRの競合の問題です。

以下によると、

Catra’s Diary [2009-07]

ここで Vista になって IPv6 対応が進んだことにより、 Vista 単体でも Link-Local Multicast Name Resolution (LLMNR) を搭載。 しかし、実装している範囲が Bonjour とは異なっており、

1.「ホスト名.local」についての問い合わせに応答しない
2.他のホストに対する「ホスト名.local」名前問い合わせは内部で「ホスト名」の問い合わせに変換して LLMNR で問い合わせる

という謎な仕様になっている。このため、

1.他からの「ホスト名.local」問い合わせに応答しない
2.他ホストが応答するはずの「ホスト名.local」問い合わせが変換され「ホスト名」になるため、他ホストの名前問い合わせもできない (「ホスト名」を名前解決するのは NetBIOS over TCP/IP の仕事で、LLMNR (avahi)で対応できない)

・まず、avahiはLLMNRは対応していないはず?

・次に、Windows Vista, Windows 7は、標準ではmDNSに対応していないので、mDNSによる名前問い合わせ、応答が出来ません。

-mDNSによる他ホストに対する「ホスト名.local」の名前問い合わせができない。
-mDNSによる他ホストからの「ホスト名.local」問い合わせに応答しない。
(他ホストではmDNSによる「ホスト名.local」の名前問い合わせできない)

 

また、以下によると、
Link-Local Multicast Name Resolution- The Cable Guy, November 2006
英語版

Windows Vista, Windows 7は、

・正式なホスト名として「ホスト名.local」をサポートしていない。

・「ホスト名.local」に慣れているユーザの利便性のために、他ホストに対する単一の「ホスト名.local」の名前問い合わせを受け付けると、

LLMNRにより単一の「ホスト名」で名前問い合わせしようとするので、LLMNRに対応していない機器では名前解決ができません。

Windows 7 RCの挙動を見ている感じでは、「ホスト名.local」の名前問い合わせをすると、LLMNRで名前解決が出来なければ中断してしまい、NetBIOS over TCP/IPで名前問い合わせをしていないようです。

ただし、最初から単一の「ホスト名」で名前問い合わせをすれば、

「LLMNR」→「NetBIOS over TCP/IP」

の順番で名前問い合わせを行おうとするので、NetBIOS over TCP/IPに対応している機器であればホスト名を解決できます。

・LLMNRにより他ホストから「ホスト名.local」という名前問い合わせがきても応答しないので、他ホストではLLMNRによる「ホスト名.local」の名前解決はできません。

 

Windows 7 RCでの詳しい動作を見てみます。

Windows7 RC標準のName Space Provider
(mswsock.dll)

BonjourのName Space Provider
(mdnsNSP.dll)

\HKEY_LOCAL_MACHINE\SYSTEM
\CurrentControlSet\service
\WinSock2\Parameters
\NameSpace_Catalog5\Catalog_Entries6400000000007
\HKEY_LOCAL_MACHINE\SYSTEM
\CurrentControlSet\service
\WinSock2\Parameters
\NameSpace_Catalog5\Catalog_Entries6400000000007
SupportedNameSpace=12(DNS) SupportedNameSpace=12(DNS)
WS000022 WS000021

Windows 7 RCでは、DNSのWinsock2のName Space Providerであるmswsock.dllが1つあります。

Bonjourをインストールすると、DNSのWinsock2のName Space Providerとして、mdnsNSP.dllが追加されます。

・mswsock.dllとmdnsNSP.dllを有効にして「ping ホスト名.local」を実行すると、レスポンスが返ってくるのにしばらく時間がかかります。

・mswsock.dllを無効、mdnsNSP.dllが有効にして「ping ホスト名.local」を実行すると、すぐにレスポンスが返ってきます。

このことから、mswsock.dll(LLMNR) → mdnsNSP.dll(mDNS)の順番で名前問い合わせを行っているのではないかと推測できます。

実装としては、こんな感じになっているのではないかと思われます。

・「ホスト名.local」の名前問い合わせがあると、WinSock2のDNSのName Space Providerのみが呼び出される。

・WinSock2のDNSのName Space Providerの
mswsock.dll(LLMNR) → mdnsNSP.dll(mDNS)の順番で呼び出される。

(ただし、LLMNRで名前解決が出来なかったらNetBIOS over TCP/IPでは名前問い合わせを行わない)

 

まとめると、Windows Vista, Windows 7では、

・単一の「ホスト名」あるいは「ホスト名.local」の名前問い合わせは、LLMNRを使用する。

・「ホスト名.local」の名前問い合わせは、LLMNRのみで名前問い合わせを行い、NetBIOS over TCP/IPでは名前問い合わせを行わない。

・単一の「ホスト名」の名前問い合わせは、「LLMNR」→「NetBIOS over TCP/IP」で名前問い合わせを行う。

・上記以外の名前問い合わせ(単一の「ホスト名」と「ホスト名.local」を除く)はDNSを使用する。

・他ホストからのLLMNRによる名前問い合わせでは「ホスト名.local」は応答しない。
(Windows Vista, Windows 7では正式なホスト名としてサポートしてないため)

 

ちなみに、Windows Vista以降でLLMNRを無効にする方法は、以下のレジストリを0x0にするとあります。(本当に有効なのかどうか真偽は不明です)

EnableMulticast – Microsoft TechNet Search
Ability to disable LLMNR- – Vista Forums

HKLM\Software\Policies\Microsoft\Windows NT\DNSClient!EnableMulticast(DWORD値です)

 

■Mac OS X

特に設定する必要はありません。標準で使用できます。

 

■Linux

apt-get install avahiを実行してavahiをインストールします。

単にmDNSでホスト名を解決したいだけなら特に設定は必要ありません。

あとは、/etc/nsswitch.confのホスト行にmDNSを使用するための設定を追加するだけです。

hosts:          files wins mdns4_minimal [NOTFOUND=return] dns mdns4

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。