Alecriar Studioの中の人の技術メモ

横浜の個人事業主が日々の技術的な情報をつづります

NBTを止めてLLMNRのみ有効にする

LLMNRについて

LLMNRWindowsの新しい名前解決のための機能です。Windowsの名前解決といえば、今まではNBT (NetBIOS over TCP/IP)が広く使用されてきましたが、古い技術であり様々な問題を抱え込んでいる状態なので、それに代わる新しい技術としてLLMNRが登場しました。LLMNRについては以下の記事が詳しいです。

www.atmarkit.co.jp

これより下は、筆者の実環境での運用も交えて、NBTを排してLLMNRで運用する際の手順です。

PC2台のみのLANにしてみる

まずはこちらの図をご覧ください。

f:id:alecriarstudio:20191007225534p:plain
PC2台構成
PC2台がスイッチを通りして接続されている、極めてシンプルなLAN構成図です。PCは両方ともWindows 10で、それぞれIPアドレスとホスト名が割り振られています。スイッチはルータ機能が無いスイッチングハブとします。

この状態でPC2台はお互いに通信ができるでしょうか。PC1からPC2に向けてIPアドレスにてpingコマンドで確かめてみます。

> ping 192.168.1.16                                                                                               
192.168.1.16 に ping を送信しています 32 バイトのデータ:
192.168.1.16 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.16 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.16 からの応答: バイト数 =32 時間 =1ms TTL=128
192.168.1.16 からの応答: バイト数 =32 時間 <1ms TTL=128

192.168.1.16 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 1ms、平均 = 0ms

問題なく応答が返ってきます。

では、ホスト名を指定してのpingはどうでしょうか。

> ping PC2                                                                                                      
PC2 [192.168.1.16]に ping を送信しています 32 バイトのデータ:
192.168.1.16 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.16 からの応答: バイト数 =32 時間 =1ms TTL=128
192.168.1.16 からの応答: バイト数 =32 時間 =1ms TTL=128
192.168.1.16 からの応答: バイト数 =32 時間 =1ms TTL=128

192.168.1.16 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 1ms、平均 = 0ms

同じようにping成功します。

TCP/IPネットワークの場合、IPアドレスからホスト名を解決するには通常はDNSサーバが使用されます。しかし、上記の構成のLANにはDNSサーバが存在しないにも関わらず、なぜか名前解決ができています。どのような仕組みなのでしょうか。

NBTとLLMNR

答えは、最近のWindowsDNSサーバが存在しなくてもLAN内の名前解決を行うための仕組みが働いているからです。それがNBTとLLMNRです。

実は、NBTとLLMNRは同じことをする機能です。ともにリソース名をIPアドレスに変換、つまり名前解決という機能を受け持ち、機能的に重複しています。ちなみにリソース名はホスト名と同義と思ってください。ではなぜ重複するものが両方とも動いているのかというと、Windowsのこれまでの歴史的経緯が関係しています。下の図をご覧ください。

f:id:alecriarstudio:20191007231253p:plain
Windowsネットワークの新旧
NBTは従来から存在する機能で、Windows XPの頃まで使用されていました。いわばレトロな技術です。対してLLMNRはWindows Vista以後のWindowsに搭載された新たな仕組み、いわばこれからの技術です。ただし互換性のため、Windows 10などの現行のWindowsにおいてもNBTはまだ残されていて、デフォルトでオンになっています。そのため機能が重複しつつも両方が動いているわけです。

Windows XPなどの古いPCが残ってる環境ならばNBTを動かしておいても良いですが、筆者の環境ではもはやそのような古いPCはないし、何より同じ機能を持つものが複数動いているのはリソースの無駄ではないか。そのように考え、NBTを無効にすることにしました。

NBTの無効化とLLMNRの単独使用

具体的には「設定」から操作します。かなり深い階層ですが、以下の手順です。

設定 -> ネットワークとインターネット -> アダプターのオプションを変更する -> 街頭するアダプターを選択 -> この接続の設定を変更する -> インターネット プロトコル バージョン 4(TCP/IPv4)を選択 -> プロパティ(R) -> 全般 -> 詳細設定(V) -> WINS -> NetBIOS設定 -> NetBIOS over TCP/IP を無効にする(S)

f:id:alecriarstudio:20191007225508p:plain
NBTの無効化
以上でNBTは無効になり、LLMNRのみが有効になった状態となります。

しかし、問題が・・

エクスプローラを開き、繋がっていれば見えるであろうPC2が「ネットワーク」に出てきません。

f:id:alecriarstudio:20191007233229p:plain
ネットワークに表示されない
おかしいと思い、直接「¥¥PC2」(¥は半角)と入力してみると・・
f:id:alecriarstudio:20191007233250p:plain
直接ホスト名を入力
ちゃんとアクセスできます。つまり、ネットワークのコンピュータ一覧では見えないけれども、それは見えないだけでLAN上には存在しているということです。

原因は何かということですが、Windowsネットワークの新旧の図をよくよく見ると、NBTは名前解決の他にブラウジングという機能も合わせて持っています。このブラウジングがコンピュータ一覧のリスト生成に深く関わっているらしく、対してLLMNRはこのブラウジング機能は持ち合わせていないため、「ネットワーク」に表示されない現象につながっています。

Windows 10をはじめとする新しいWindowsは、このブラウジング機能については「LLTD」という新しい仕組みが用意されています。こちらを何とかすることができればコンピュータ一覧が正常に表示されるようになると思われますが、この話題についてはまた別の機会にします。

まとめ

LLMNRとは以下のような特徴をもっています。

  • NBTより新しい最近のWindowsに搭載された名前解決機能
  • IPv4IPv6に対応(NBTはIPv4のみ)
  • 現行のWindowsで、現状ではNBTとLLMNR両方がサポートされているが、NBTはいずれ廃止されLLMNRのみがサポートされる状態になりそう
  • 名前解決機能のみを提供し、ブラウジングについては別途