ネットワーク・サービスは特定のTCPやUDPのポートを使ってリッスン(待ち受け)している。ファイアウォールの設定やネットワーク管理などを行うためには、どのサービスやプロセスがどのポートを使用しているかを正確に把握する必要がある。Windowsで利用できる複数の確認方法を解説する。
対象OS:Windows 2000 Professional/Windows XP Professional/Windows XP Home Edition/Windows 2000 Server/Windows 2000 Advanced Server/Windows Server 2003/Windows XP SP2
TCP/IPを使ったネットワーク・サービスでは、ある特定のポートでリッスン(待ち受け)することにより、クライアントからの要求を受け付けるようになっている。だがどのサービスが実際にどのポートを使ってリッスンしているのかを知るのは簡単ではない。単純なサービスでは問題ないが、サービスによっては使用するポートが固定的ではなかったり、サービスやプログラムごとのポートの使用状況などに関する情報が必ずしも公開されていなかったりするからだ。ポート番号とサービスの対応関係が分からないと、ファイアウォールを始めとするネットワークの設定などができないし、ウイルス(によって設置されたバックドア)か正規のサービスかを区別することも不可能である。
ここでは、Windows系のOSにおいて、リッスンしているプログラムやサービスを特定するためのいくつかの方法について解説する。このためには、一般的には次のような方法が考えられる。
TCPやUDPでリッスンしているポート(サーバ側で、待ち受けしている方のポートのこと)を調査するには、最初に、「TIPS―netstatコマンドを使いこなす」で述べたとおり、netstatというコマンドを使う。「-a」オプションを付けてnetstatを実行すると、現在アクティブなコネクションとリッスンしているポートなどが表示されるので、これでどのようなプロトコルが使われているかが分かるだろう。
C:\>netstat -an……Windows XP上で実行した例
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:25 0.0.0.0:0 LISTENING
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1025 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1040 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1080 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1081 0.0.0.0:0 LISTENING…※
TCP 0.0.0.0:2076 0.0.0.0:0 LISTENING
TCP 0.0.0.0:2081 0.0.0.0:0 LISTENING…※
TCP 0.0.0.0:2354 0.0.0.0:0 LISTENING…※
TCP 0.0.0.0:5000 0.0.0.0:0 LISTENING
TCP 192.168.0.111:139 0.0.0.0:0 LISTENING
TCP 192.168.0.111:1081 192.168.0.51:445 ESTABLISHED
TCP 192.168.0.111:2354 192.168.0.102:445 ESTABLISHED
TCP 192.168.0.111:2888 0.0.0.0:0 LISTENING…※
TCP 192.168.0.111:2888 192.168.0.54:139 ESTABLISHED
UDP 0.0.0.0:135 *:*
UDP 0.0.0.0:445 *:*
UDP 0.0.0.0:500 *:*
UDP 0.0.0.0:1026 *:*
UDP 0.0.0.0:1027 *:*
UDP 0.0.0.0:1028 *:*
UDP 0.0.0.0:1031 *:*
UDP 0.0.0.0:1046 *:*
UDP 0.0.0.0:1048 *:*
UDP 0.0.0.0:3456 *:*
UDP 127.0.0.1:123 *:*
UDP 127.0.0.1:1900 *:*
UDP 127.0.0.1:2771 *:*
UDP 127.0.0.1:2922 *:*
UDP 192.168.0.111:123 *:*
UDP 192.168.0.111:137 *:*
UDP 192.168.0.111:138 *:*
UDP 192.168.0.111:1900 *:*
※実際にはリッスン状態ではないにもかかわらず(実際に接続しようとしても拒否される)、リッスンしているかのように表示されているTCPポート
ポート番号はここで示したように、実際には1〜65535の数値であるが(「-n」オプションを付けると数値で表示される)、代表的なものについてはservicesファイルを参照して、分かりやすいサービス名に変換して表示される。servicesファイルとは、ポート番号と具体的なサービス名の対応を記述したファイルであり、Windows系OSでは、%windir%\system32\drivers\etc\servicesに格納されている。
ただしこのservicesファイルの内容は、必ずしもWindows OSで使われているサービス名やポート番号を正確に表しているわけではない。これは非常に汎用的なファイルであり、UNIXやLinuxシステムなどでも同じものが使われているので、ときにはまったく別のサービス名が表示されたりする(もともとWindowsでは用意されていないようなサービス名も表示される)。またプロトコルによっては、ダイナミックにリッスンするポートを変更するものがあるが、その場合は別のサービス名であるかのように表示されてしまう。
また、これはWindows OSのnetstatコマンドの問題であるが、「TIPS―netstatコマンドを使いこなす」の最後で述べたように、実際にはリッスンしていないにもかかわらず、リッスンしているかのように表示されるポートがいくつかある。例えば先の例でいえば、TCPの1081番というポート番号がリッスン状態になっているが、外部からこのポートへ接続しようとしても拒否されてしまい、接続することはできない(すぐに拒否応答が返ってくる)。これは、「192.168.0.111:1081←→192.168.0.51:445」というコネクションの影響で、「192.168.0.111:1081」というポートがリッスンであるかのように表示されているのである。
このように、netstatだけでは実際にどのサービスやアプリケーションがポートを使っているかを完全に特定することができない。正確なポートの使用状況を知るためには、さらにいくつかの調査が必要になる。
servicesファイルに記述されているサービス名はかなり限定的であり、Windows 2000やWindows XPに付属のものでは、約120種類のサービスが記述されているだけである(UDPとTCPで同じ番号を使っていても、別のサービスとして数えているので、実際にはこの半分程度のプロトコルしか記述されていない)。もう少し詳細なプロトコル番号の一覧については、例えばRFCの「Assigned Numbersリスト」を参照する必要がある。RFCは、インターネットに関する各種の技術文書などをまとめたもので、「Assigned Numbers」は、特定のサービスやプロトコルに割り当てられた具体的な番号の一覧をまとめた文書である。このような場合に使われる文書としては、いままではRFC1700があったが、これはすでに8年も前のものである。現在では「www.iana.org」でオンラインデータベース化されている(RFC3232)。ただし最新のプロトコルについてはまだ収録されてなかったりするので、このリストを信用しすぎると、「このマシンには、〜というソフトウェアが入っているらしいがどうやって止めればいいのだろうか」などと、少々見当はずれな疑問を抱いて、時間を無駄にしてしまうかもしれない。
ある特定のポートをリッスンしているプログラムやサービスを見つける見付けるには、Windows XPやWindows Server 2003ならばnetstat -oコマンドで、そのポートを使用しているプロセスを調べるのが確実である(このオプションはWindows 2000では利用できない)。
C:\>netstat -oan …Windows Server 2003で実行
Active Connections
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:25 0.0.0.0:0 LISTENING 1500
TCP 0.0.0.0:42 0.0.0.0:0 LISTENING 1856
TCP 0.0.0.0:53 0.0.0.0:0 LISTENING 3728
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 252
TCP 0.0.0.0:88 0.0.0.0:0 LISTENING 500
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 752
TCP 0.0.0.0:389 0.0.0.0:0 LISTENING 500
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 252
TCP 0.0.0.0:444 0.0.0.0:0 LISTENING 252
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:464 0.0.0.0:0 LISTENING 500
……以下省略……
一番右端のPID欄に表示されているのが、プロセスIDである。PIDが分かれば、次はタスク・マネージャやtasklist.exeコマンド(このコマンドもWindows XPおよびWindows Server 2003でのみ利用可能)で、実際のプロセス名を特定することができる。
C:\>tasklist …Windows Server 2003で実行
イメージ名 PID セッション名 セッション# メモリ使用量
========================= ====== ================ =========== ============
System Idle Process 0 Console 0 16 K
System 4 Console 0 1,332 K
smss.exe 364 Console 0 452 K
csrss.exe 416 Console 0 8,040 K
winlogon.exe 444 Console 0 6,556 K
services.exe 488 Console 0 9,020 K
lsass.exe 500 Console 0 40,256 K
svchost.exe 752 Console 0 3,284 K
svchost.exe 892 Console 0 4,568 K
svchost.exe 908 Console 0 6,580 K
svchost.exe 952 Console 0 22,868 K
spoolsv.exe 1244 Console 0 9,160 K
msdtc.exe 1284 Console 0 4,268 K
dfssvc.exe 1360 Console 0 4,992 K
svchost.exe 1436 Console 0 2,060 K
inetinfo.exe 1500 Console 0 23,428 K
llssrv.exe 1524 Console 0 5,840 K
sqlservr.exe 1544 Console 0 27,624 K
svchost.exe 252 Console 0 6,052 K
……以下省略……
これにより、例えば1500はinetinfo.exe(IISサービスのプロセス)、4はSystemプロセスということが分かる。
ただしこの例からも分かるが、実際のWindowsシステム上でこれを実行しても、「System」プロセスや「svchost.exe」プロセスが所有者となっているポートが多く表示される。これらはシステム起動時に実行を開始するサービスであり、ほとんどのサービスの親となる重要なサービスである。これだけの情報では、あるポートが具体的にどのサービスによってオープンされたものかを簡単に知ることはできない。
これらのサービスに関するプロセスを調べるには、tasklistに/svcオプションを付けるとよい。これは、各プロセスごとに関連付けられているサービス名を表示させるオプションである。
C:\>tasklist /svc …Windows Server 2003で実行
イメージ名 PID サービス
========================= ====== =============================================
System Idle Process 0 N/A
System 4 N/A
smss.exe 364 N/A
csrss.exe 416 N/A
winlogon.exe 444 N/A
services.exe 488 Eventlog, PlugPlay
lsass.exe 500 HTTPFilter, kdc, Netlogon, NtLmSsp,
PolicyAgent, ProtectedStorage, SamSs
svchost.exe 752 RpcSs
svchost.exe 892 Dhcp, Dnscache
svchost.exe 908 LmHosts, WebClient, WinHttpAutoProxySvc
svchost.exe 952 AudioSrv, BITS, Browser, CryptSvc, dmserver,
EventSystem, helpsvc, lanmanserver,
lanmanworkstation, Netman, Nla, RasMan,
Schedule, seclogon, SENS, ShellHWDetection,
winmgmt, wuauserv
spoolsv.exe 1244 Spooler
msdtc.exe 1284 MSDTC
dfssvc.exe 1360 Dfs
svchost.exe 1436 ERSvc
inetinfo.exe 1500 IISADMIN, RESvc, SMTPSVC
llssrv.exe 1524 LicenseService
……以下省略……
これを見ると、lsass.exeというプロセスはHTTPFilterやkdcなどのサービスを提供しており、svchost.exeというプロセスはRpcSsやDhcp、Dnscache、LmHostsなどのサービスを提供しているということが分かる。これらのサービス名が実際に何を表しているかについては、別稿の「TIPS―svchost.exeプロセスとは?」を参照していただきたい。
使用しているポート番号などが分かれば、次はマイクロソフト社の「サポート オンラインのページ」で、ポート番号などをキーにして具体的なサービス名を調べるとよいだろう。
(少々スキルが要求されるが)実際にネットワーク・モニタ(プロトコル・アナライザ)などを使って、プロトコルの詳細を調査して見当を付けるという方法もある。ネットワーク・モニタの使い方については、別稿の「Windowsネットワーク・プロトコルの理解と検証―プロトコル・アナライザを使ってネットワーク・トラフィックを解析する」や「TIPS―netcapコマンドでネットワーク・パケットをキャプチャする」などを参照していただきたい。
以上の方法のほかに、サービスを1つずつ停止させながら、利用されているポートを調査するという方法もある。svchost.exeやSystemプロセスが所有者となっているポートは、実際にはシステムのサービスとして実行されているものが多い。そのため、サービスを順番に1つずつ止めながらnetstat -anコマンドを実行すると、リッスン状態であったポートがnetstatのリストから消えることがある。するとそのサービスが実際のポートの所有者であることが分かる。特にtasklist.exeコマンドが使えないWindows 2000では、このような方法も有効であろう。
例えば最初のWindows XPのnetstatの例で、TCPのポート5000番をリッスンしているサービスを特定してみよう。最初にnetstat -anを実行してその結果をどこかに保存しておく(もしくは複数のコマンド・プロンプトを立ち上げて、順次コマンドを実行してもよいだろう)。次に、管理ツールの「サービス」ツールで、一番上にあるサービスを1つ停止させてみる。そしてnetstat -anをまた実行し、先ほどの結果と比べてみる。こうやって順番にサービスを停止させながら、状態の変化を観察する。いくつか停止不可能なサービスがあるかもしれないが、あまり気にせず、取りあえず先へ進もう。
こうやって作業を進め、「SSDP Discovery Service」まで停止させると、TCPの5000番ポートのリッスン状態が消えることが分かるはずだ。「SSDP Discovery Service」サービスの説明には、「ホーム ネットワークの UPnP デバイスの検出を有効にします。」と書かれている。つまり、これはUPnPサービスで使われているポートであるということが分かる。ここまで分かればあとは簡単だろう。UPnPやSSDPのサポート技術情報などを調べればよい。そうするとこのサービスでは、TCPの5000番のほかに、UDPの1900番も使用していることが分かるだろう。
Windows XP SP2のnetstatコマンドでは、新たに「-b」と「-v」オプションが導入された。-oオプションではプロセスID(PID)のみが表示されたが、-bオプションを付けると、その通信を行っている実行ファイル名(もしくはサービス)が表示される。これにより、プロセスやサービスを特定するのが容易になっている。
C:\>netstat -nb
Active Connections
Proto Local Address Foreign Address State PID
TCP 192.168.0.111:139 192.168.0.155:1174 ESTABLISHED 4
[システム]…サービス名
TCP 192.168.0.111:1140 192.168.0.51:23 ESTABLISHED 4016
[telnet.exe]…プログラム名
…(以下省略)…
-bオプションに加えて-vオプションも指定すると(両方同時に指定すること)、実行ファイル名だけでなく、その通信に関連している(呼び出している)コンポーネントのファイル名(DLLファイル名など)も表示される。
C:\>netstat -anbv
Active Connections
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1544
c:\windows\system32\WS2_32.dll
C:\WINDOWS\system32\RPCRT4.dll
c:\windows\system32\rpcss.dll
C:\WINDOWS\system32\svchost.exe
-- 不明なコンポーネント --
[svchost.exe]
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
-- 不明なコンポーネント --
ntoskrnl.exe
[システム]
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1448
-- 不明なコンポーネント --
C:\WINDOWS\system32\ole32.dll
[svchost.exe]
TCP 127.0.0.1:1025 0.0.0.0:0 LISTENING 544
C:\WINDOWS\System32\WS2_32.dll
C:\WINDOWS\System32\alg.exe
C:\WINDOWS\system32\RPCRT4.dll
C:\WINDOWS\system32\ole32.dll
[alg.exe]
…(以下省略)…
■更新履歴
【2004/11/27】Windows XP SP2に関する情報を追加して修正しました。
【2004/03/13】Windows Server 2003の情報を反映して、加筆修正しました。
【2002/07/30】初版公開。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.