数年前のこと、筆者宅でPCのIPアドレス割り当てが「予想もしていない」アドレスになったことがある。原因はポータブルテレビ。本体とディスプレイの接続に無線LANを使っていて、無線LANアクセスポイント経由で接続しない場合、本体が無線LANのアクセスポイントやDHCPサーバー、ルーターになるものだった。簡単にいうと、テレビの中に無線LANルーターが入っているようなものだ。購入時には、自宅のアクセスポイントを経由して接続するよう設定したが、あるとき調子が悪いので出荷状態に戻したときに、直接接続するモードに戻ってしまった。このため、ネットワーク内に2つのDHCPサーバーが存在し、一部のPCがテレビからIPアドレスをもらっていたわけだ。こういうとき、ネットワーク内のノードを列挙できるツールが使えるとかなり助かる。

○ネットワーク内のノードを列挙したい

Windowsではエクスプローラーのネットワークを開くと、同じネットワークに属するPCやプリンタ、ファイルサーバーなどを見ることができる。しかし、ネットワークにあるすべての機器を表示できるわけではない。Windowsからアクセス可能な機器だけが見える。たとえば、Chromebookは、SMBプロトコルを使ってWindows PCが公開している共有フォルダにアクセスできるが、エクスプローラーには表示されない。エクスプローラーは、限られたプロトコルでしか機器を探さないからだ。ネットワークフォルダを「詳細表示」させて探索方法の列を見ると、そこには「WSD」、「SSDP」、「WCN」などのキーワードが並ぶ。

もしかしたら、まだSMBv1の機器もあるかもしれない。かつてのWindowsでは、SMBv1プロトコルを使ってネットワーク内機器を探索していたが、Windows 10 Ver.1709(RS3)でSMBv1が廃止された(ただし、Ver.1709以前からSMBv1を利用していると残ったままになる)。SMBv2以降は、ネットワーク上の機器の検出には、WSD(Web Services for DevicesあるいはWeb Services on Devicesとも)を利用する。

これは、Web Services Dynamic Discovery(WS-Discovery)プロトコルを使い、Devices Profile for Web Services(DPWS)に準拠したデバイスを探索するしくみ。基本的にはWindowsは、これで他のWindowsマシンやプリンタをネットワークから見つける。

SSDPは、UPnP(Universal Plug and Play)で使われるSimple Service Discovery Protocolのことで、ネットワーク上のサービスやその存在を発見するためものだ。WSDは、PCの検出に使われるが、SSDPは、テレビなどのネットワーク対応AV機器で主に使われる。また、WCNは、Windows Connect Nowの略で、無線LANのWPS(Wi-Fi Protected Setup)と、WSC(Wi-Fi Simple Configuration)を使った簡易なデバイス発見、設定方法だ。Windowsでは、これらを使ってネットワーク内の機器を探して表示するが、逆にいうと、これらに対応しない機器は、Windowsのエクスプローラーから見ることができない。

となると、積極的にネットワークにある機器を探すツールが必要になる。簡易には、多くのプラットフォームで、利用可能なARP(Address Resolution Protocol)のarpコマンドを使う方法もある。しかし、事前に該当アドレスへのアクセスが必要なこと、同一ネットワーク内でないと記録が残らない(他のネットワークへのアクセス時にはmacアドレスが不要であるため)。ただし、ARPにより一回macアドレスとIPアドレスの対応付けがなされると、一定時間は、キャッシュに残るため、現在は、通信できなくても機器を列挙できる。WindowsでもLinuxでも「arp -a」で記憶しているIPアドレスとmacアドレスを表示できる。

○ネットワーク機器を列挙するコマンド

Windowsでは、PowerShellを使えば、ネットワーク内の機器を列挙できる。それには、Get-NetNeighborコマンドを使う。ただし大量のアドレスが表示されるので、オプション(表01)を使って出力を制限するか、Where-Objectを使って、特定の機器(たとえばLinkLayerAddressがすべてゼロではないなど)だけ抜き出す。たとえば、“-InterfaceIndex”を使うと、特定のネットワークアダプターから発見できるネットワーク機器だけを表示できる。なお、この値は、get-netadapterコマンドで探すことが可能だ。

Get-NetNeighbor -ifIndex 5 | ?{ $_.LinkLayerAddress -ne "00-00-00-00-00-00" }

Linuxならnmapコマンドを使うのが手っ取り早い。多くのディストリビューションでは、nmapパッケージをインストールすればよい(Windows版もありwingetでインストールが可能)。Windows上のWSLからも利用可能だが、WSL2は、ホスト側Windowsとは異なる内部ネットワークをブリッジしているため、LAN側のスキャンに少し時間がかかる。自分のLANのネットワークアドレスが192.168.0.0/24ならば、

nmap -sn 192.168.0.0/24

でpingを使ったネットワークのスキャンが行える。なにもオプションを付けずにネットワークアドレスだけ指定すれば、開いているポートの表示もできるし、オプションでOSやバージョンの判定も可能だ(写真01)。Get-NetNeighborはアドレスの指定は不要だが、nmapの場合にはスキャン対象のネットワークアドレスを指定する必要がある。

写真01: nmapは、指定アドレス範囲のスキャンが行えるほか、オプション指定で、機器のOSやバージョンの推定も行える。Chromebookに対して実行すると、Linuxカーネルを使っているところまでは判定する


どちらも、IPアドレスを持っている機器ならば探索が可能だが、UPnPを使うと、機器自身が提供する情報も取得できる。エクスプローラーでネットワーク対応テレビやBDレコーダーなどが機種名やアイコンを表示するのは、この機能のためだ。こうした機器は、WSDには反応しないものが多い。

Linuxならgupnp-toolsパッケージの中にあるgssdp-discoverを使うと、ネットワーク内のSSDP対応機器をスキャンしてくれる。ただし、SSDPではマルチキャストを使うため、発見できるのは同一ネットワーク内に限られる。WindowsのWSL1ではgssdp-discoverが動かず、WSL2のLinuxは仮想マシン内で動作するため、ホスト側PCとは別ネットワークになる。このため、WSLではgssdp-discoverでUPnP機器を発見することはできない。WSLではなく物理ハードウェアで動いているLinuxが必要になる。

Windows向けのUPnPツールは、かつてはIntelが開発した“Intel Tools for UPnP”があったのだが、配付が止まったのかIntelのサイトでみつけることができなかった。インターネット検索するとオープンソースのものがあるようだが、きちんと評価する時間がなかった。とりあえずエクスプローラーがSSDP対応機器を表示してくれるのでなんとかなるだろう。

同一ネットワーク内の機器が列挙できれば、これをもとにさまざまなネットワークサービスを使って、情報収集やリモート管理などが可能になる。ネットワークの機器リストは、その意味でネットワーク管理の「基礎」ともいえる。スマートフォンやタブレットなどバッテリ駆動で、接続が間欠的になる機器もあれば、昔に比べるとネットワーク接続可能な機器の価格も下がったが、寿命も短くなった。実際に動いている機器は数台でも、人手で調べた機器リストによる管理は、一般ユーザーでもそろそろ限界だろう。