あなたならどうする? 引き継ぎ一切なしで社内LAN上にあるデバイスをリストアップせよ!山市良のうぃんどうず日記(198)

2020年末にある相談を頂きました。その相談とは、社内のLANセグメント上で稼働中のネットワークデバイスから情報を取得したい、それも認証を必要としない方法で、ネットワーク情報だけでなく、OSの種類やバージョン、ネットワークプリンタやルーターの情報まで取得したいというものでした。さて、どうしましょうか。

» 2021年01月13日 05時00分 公開
[山市良テクニカルライター]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「山市良のうぃんどうず日記」のインデックス

山市良のうぃんどうず日記

匿名で得られる情報は限られる

 相談には、「残念ながら参考情報程度しか取得できない」とお答えしました。企業にLANが普及し始めた20〜30年前とは異なり、現在のネットワークでは、境界だけでなく、デバイスのエンドポイントでもファイアウォールが有効になっているのが当然であり、ネットワークを介して“認証なし”で得られる情報は多くありません。逆に、得られる情報が少ない方が、良いともいえます。ネットワークデバイスが誰にでも自らの情報をおしゃべりするような状態は、決して健全なネットワーク環境とはいえません。

 よく知られた方法として、IPv4アドレスに対して「Ping」コマンドを実行し、応答のTTL(Time to Live)値を調べる方法があります。TTL値が「128」ならWindows、TTL値が「64」ならLinuxやmacOSとざっくりと判断できるというものです(画面1)。

画面1 画面1 IPv4アドレスに対するPing応答のTTL値はWindowsが「128」、LinuxやmacOSが「64」というのは昔から知られたテクニック

 しかしながら、現在はプライベートなネットワークにおいてもPingやICMPが許可されていないことがあります。TTL値を得られたとしても、Windowsかそうでないかを判断できるくらいで、Windowsクライアントなのか、Windows Serverなのか、Windowsのどのバージョンなのかまで知ることはできません。

 Ping/ICMPが利用可能であれば、Pingコマンドや「arp」コマンドでIPv4アドレスやIPv6アドレス、MACアドレスを調査することができますし、さらに「nslookup」コマンド(Windows、レガシーなLinux/UNIX)、「dig」コマンド(Linux)、Windows PowerShell(「Windows 8」および「Windows Server 2012」以降)の「Resolve-DnsName」コマンドレットなどを利用して、ホスト名やDNSドメイン名などの情報を取得することができます。

 さらに、MACアドレスを入手できれば、MACアドレスのベンダーコード(OUI)からネットワークアダプターのベンダーを特定できる場合があります。仮想マシンの場合は、既定値を変更していない限り、MicrosoftのOUIである「00-15-5D」(Hyper-Vの仮想マシン)や「00-1D-D8」(System Center Virtual Machine ManagerやAzure Stackで管理されている仮想マシン)、VMwareのOUIである「00-15-5D」や「00:0C:29」で識別することもできます。

フリーのツールで精度を上げることはできても、確定はできない

 SNMP(簡易ネットワーク管理プロトコル)を利用できれば、ネットワークデバイスからさらに詳細な情報を入手できる場合もありますが、コミュニティー名とパスワードによる認証が必要ですし、情報を取得するためのSNMP対応ツールも必要です。そもそも、デバイス側でSNMPのエージェントを適切にセットアップしてなければ、何も情報は得られません。

 ポートスキャンを用いたツールを利用すれば、アプリケーションのプロトコルのバージョンや特性からOSの詳細な識別に役立つ情報を得られる場合があります。

 例えば、オープンソースのネットワークツール「Nmap」(https://nmap.org/)は、「-A(または-O)」パラメーターのOS検出オプションを提供します。主要なLinuxであれば標準のリポジトリから簡単にインストール(Ubuntuの場合は「sud apt install nmap」)できますし、Windowsであればインストーラーを使用してGUIツールの「Zenmap」とともに簡単にインストールできます。

 このようなツールを使用する場合、精度の高い情報を得られるのは、どれだけアプリケーションのTCP/UDPポートが応答するかにかかっています。ファイアウォールでほとんどブロックされる場合、OSの種類を検出することはできません。

 以下のZenmapの結果は、「Windows Server 2019」(バージョン1809)のHyper-Vホストをターゲットとしたものですが、OSは96%の精度で「Microsoft Windows 10 1709 - 1909」と検出しました(画面2)。

画面2 画面2 オープンソースのネットワークツール「Nmap」によるOSの識別。Zenmapの結果はWindows Server 2019に対して実行したもの、Nmapの結果はUbuntu Desktop 20.04 LTSに対して実行したもの。参考程度にしかならない

 Nmapのコマンドの結果はUbuntu Desktop 20.04 LTS(kernel 5.4)をターゲットとしたものですが、「Linux 4.15 - 5.6」と検出しました。別のテストでは、macOS Mojave(10.14)をOS「Apple iOS 11.x」、デバイスタイプ「phone」、つまりiPhoneと識別しました。

 このように、認証なしで得られる情報は、参考程度にしかなりません。

取りあえずネットワークデバイスのリストアップから始めよう

 一切の引き継ぎなしで、管理者不在の自社のITインフラ管理を任されてしまったというような状況を想像してみてください。しっかり管理するためには、できるだけ早く管理対象のリストを手に入れたいところでしょう。もしリストがなければ、自分で調べて作成するしかありません。ひと昔前なら比較的簡単な作業だったかもしれませんが、現在は、社員に貸与された多数のスマートフォンがWi-Fi接続していて、ネットワークデバイスが激増しているかもしれません。

 前述のように、認証なしで得られる情報は限られます。しかし幸いなことに、しっかり管理されていないネットワークの場合、不適切ではありますが、おしゃべりなデバイスが多い可能性があります。

 手元にあるPCのIPアドレスを確認し、ローカルサブネットを予想して、サブネット内に存在するIPアドレスを順番にPingやその他のコマンドなどで当たっていけば、アクティブ(稼働中)のネットワークデバイスをリストアップすることができるはずです。動的にIPアドレスが割り当てられている場合、DHCPサーバを見つけて、DHCPスコープを確認しておくこともリスト作成に役立つでしょう。

 以下のPowerShellスクリプト「scannet.ps1」は、開始IPv4アドレスと終了IPv4アドレスを入力することで、その範囲のIPv4アドレスを列挙するように作成しました。「Write-Host "Target: "$targetip」の部分を何らかのアクションに置き換えることで、リストの作成を自動化できます。

function getnextip($str){
  $work = $str -Split "\."
  $ip1 = [int]$work[0]
  $ip2 = [int]$work[1]
  $ip3 = [int]$work[2]
  $ip4 = [int]$work[3]
  $ip4 = $ip4 + 1
  if ($ip4 -gt 255) {
    $ip4 = 0
    $ip3 = $ip3 + 1
  }
  if ($ip3 -gt 255) {
    $ip3 = 0
    $ip2 = $ip2 + 1
  }
  if ($ip2 -gt 255) {
    $ip2 = 0
    $ip1 = $ip1 + 1
  }
  if ($ip1 -gt 255) {
    return "Invalid IP"
  } else {
    return [string]$ip1+"."+[string]$ip2+"."+[string]$ip3+"."+[string]$ip4
  }
}
$startip = Read-Host "Enter the first IP addr of IP range"
$endip = Read-Host "Enter the last IP addr of IP range"
$endup = getnextip($endip)
if ($endup -eq "Invalid IP") {
  Write-Host "Error: Invalid IP range."
  Exit
}
$targetip = $startip
while ($targetip -ne $endup) {
  #-- Start action to target --
  Write-Host "Target: "$targetip
  #-- End action to target --
  $targetip = getnextip($targetip)
}
▲「scannet.ps1」

 Windows PowerShellの「Test-NetConnection」(Windows 8.1またはWindows Server 2012 R2以降で利用可能)を次のように記述すれば、HTTPポート(HTTPの他、RDP、SMB、WINRMを指定できます)の接続性をテストし、成功/失敗(TcpTestSucceeded:True/False)を調査できます。TCPの接続が失敗した場合はPingの接続性がテストされ、成功/失敗(PingSucceeded:True/False)を報告します(画面3)。「-CommonTcpPort」の代わりに「-Port」で任意のTCPポートを指定することもできます。

Test-NetConnection -ComputerName $targetip -CommonTcpPort HTTP
画面3 画面3 指定したIPアドレス範囲をターゲットに、「Test-NetConnection」コマンドレットでHTTPとPingの接続性をテストしている例

 先ほど例に挙げたNmapをインストールすれば、Nmapのコマンドラインを実行するように記述してOSの検出を試みることも可能です。

 IPアドレスの範囲によってはリスト作成に多くの時間がかかりますが、コマンドラインの出力をファイルにリダイレクトするように記述すれば、完了まで放置しておくことができるでしょう。リストが出来上がったら、足を使って現場を調査して回り、リストの参考情報を確定情報に一つ一つ書き換えていくという、大変な作業の始まりです。

 筆者が引き継ぎもなく、ITインフラの管理を任されたら、多分そうするでしょう。しかし、スマートフォンなどのモバイルデバイスが膨大な数になると、途中で投げ出したくなるかもしれません。

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2019-2020)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。