netstatでリッスンしているプロセスを特定するTech TIPS

ネットワーク・サービスは特定のTCPやUDPのポートを使ってリッスン(待ち受け)している。ファイアウォールの設定やネットワーク管理などを行うためには、どのサービスやプロセスがどのポートを使用しているかを正確に把握する必要がある。Windowsで利用できる複数の確認方法を解説する。

» 2004年11月27日 05時00分 公開
[打越浩幸デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象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において、リッスンしているプログラムやサービスを特定するためのいくつかの方法について解説する。このためには、一般的には次のような方法が考えられる。

●netstat コマンドでリッスンしているプロトコルとそのポート番号を調査する

 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だけでは実際にどのサービスやアプリケーションがポートを使っているかを完全に特定することができない。正確なポートの使用状況を知るためには、さらにいくつかの調査が必要になる。

●RFCのAssigned Numbersリストでサービス名を調査する

 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 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でのみ利用可能)で、実際のプロセス名を特定することができる。

svchostが多数実行されているタスク・マネージャの画面 svchostが多数実行されているタスク・マネージャの画面
タスク・マネージャで確認すると、svchost.exeというプロセスが多数動作しており、場合によってはCPU負荷が高くなっていたり、メモリを大量に消費していることがある。svchost.exeはサービスを起動するための元となるプロセスであり、OSのバージョンなどにもよるが、このように複数実行されているのが普通である。これはWindows XP Professionalにおけるタスク・マネージャの例。
  (1)この例では、6つ動作している。

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つずつ停止させながら、リッスンしているポートを調査する

 以上の方法のほかに、サービスを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オプションで実行ファイルを調査する

 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】初版公開。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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