PowerShell を使用して Windows 上のアクティブな TCP/IP 接続を監視する方法

WindowsでアクティブなTCP/IP接続や開いているポートを確認するために、TCPViewnetstatのようなツールやグラフィカルアプリを使う人は多いでしょう。しかし、PowerShellスクリプトを使うのが便利かもしれません。PowerShellはWindows(Windows 8/Server 2012以降)に組み込まれており、ネットワーク接続、プロセス、ポートの状況をより明確かつカスタマイズ可能な形で確認できます。Get-NetTCPConnection

要点は、Get-NetTCPConnectionフィルターを一切使用せずに実行すると、アクティブなTCP接続のリストが全て表示されることです。これには、ローカルおよびリモートのIPアドレス、ポート、現在の状態(listen、established、time waitなど)、そしてそれらを使用しているプロセスIDといった詳細情報が含まれます。少し奇妙に思えるかもしれませんが、このコマンドを使うと、必要な情報(例えばlistenポートのみ、確立済みの接続のみなど)を絞り込むことができるため、スクリプトの作成やネットワーク監視の自動化が容易になります。

注意:IPアドレスだけでなくDNS名も表示したい場合は、コマンドをResolve-DnsNameにパイプすることができます。構文は少し長くなりますが、分かりやすさを考えると価値があります。また、特定のネットワークアクティビティに関連付けられているWindowsサービスを確認するには、Get-WmiObjectの出力と組み合わせることができます。Get-NetTCPConnectionこの方法を使うと、予期せぬ情報が見つかることもあります。

PowerShell でネットワーク接続を修正または確認する方法

方法1: すべてのアクティブなTCP接続を一覧表示する

  • 管理者権限で PowerShell を開きます (スタート メニューを右クリックし、Windows PowerShell (管理者)を選択します)。
  • を実行しますGet-NetTCPConnection。PC上で現在TCP経由で通信しているすべてのもののリストが表示されます。ローカルアドレス、リモートアドレス、ポート、接続状態、プロセスIDが表示されます。

これは、概要を素早く確認したいときに非常に便利です。設定によっては、少し遅延したり、すべての情報がすぐに表示されないことがあります。通常は、再起動するか再実行することで修正できます。

方法2: リスニングポートを確認する

  • 着信接続をリッスンする開いているポートだけを知りたい場合は、次を実行します。 Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State | Sort-Object LocalPort | ft
  • これにより、確立された接続や発信接続がすべて除外されます。

このコマンドは、ポートの競合のトラブルシューティングや、開いてはいけないポートをクリーンアップする際に役立ちます。何も表示されない場合は、ポートがリッスンしていないか、PowerShellを管理者として実行する必要がある可能性があります。

方法3: 確立された接続とそのホストのフィルタリング

  • リモート DNS 名とプロセス パスを使用したアクティブな確立された接続を詳細に確認するには、次の操作を試してください。
  • Get-NetTCPConnection -State Established | Select-Object LocalAddress, LocalPort, @{name='RemoteHostName';expression={(Resolve-DnsName $_. RemoteAddress).NameHost}}, RemoteAddress, RemotePort, State, @{name='ProcessName';expression={(Get-Process -Id $_. OwningProcess).Path}}, OffloadState, CreationTime | ft

注:DNS解決は、特に接続数が多い場合は速度が低下する可能性があります。一部のマシンでは数秒かかる場合や、DNSが正しく設定されていない場合は失敗する場合があります。それでも、PCが誰と、あるいは何と通信しているのか、そしてその背後でどのプロセスが動作しているのかを正確に確認するには、DNS解決が最も簡単な方法です。

方法4:リモートPCへの接続/トラフィックの監視

  • リモート マシン上のアクティブな接続を確認する場合は、PowerShell リモート処理を使用します。
  • Invoke-Command -ComputerName be-dc01 {Get-NetTCPConnection -State Established}

これは、サーバーやリモートワークステーションに直接ログインせずにトラブルシューティングを行う場合に役立ちます。対象マシンでPowerShellリモート処理が有効になっていることを確認してください(Enable-PSRemotingコマンドを使用)。もちろん、Windowsは必要以上に手間取ることがあるためです。

一つだけ覚えておいていただきたいことがあります。ネットワークデータや接続状態が停止したり、欠落したりすることがあります。その場合は、ネットワークスタックをリセットするか、再起動する必要があるかもしれません。スクリプトでは、これらのコマンドとロジックを組み合わせてアラートやログをトリガーするのが一般的です。

さらに、もしもっと高度な設定をしたい場合は、3389番ポート(RDP)やSSHのオープンポートなど、特定の接続パターンを監視し、ポップアップ通知を表示したり、情報をログに記録したりするスクリプトを作成することもできます。これにより、ネットワークセキュリティを事後対応型ではなく、プロアクティブに管理できます。

これらのツールを独自のスクリプトやサードパーティのソリューションと組み合わせることで、ブルート フォース RDP 攻撃の可能性などを監視するように拡張することもできます。

GUIツールだけに頼らずにネットワーク接続の詳細な情報を得たいと考えている方にとって、この記事がよい出発点になれば幸いです。PowerShellは、使いこなせば驚くほど強力です。

まとめ

  • Get-NetTCPConnection現在の TCP 接続とフィルターを確認するために使用します。
  • DNS ルックアップのためにResolve-DnsNameと組み合わせます。
  • PowerShell リモート処理を活用してリモート システムをチェックします。
  • スクリプトは、アラート、ログ記録、または特定のポートと IP の監視用に調整できます。

まとめ

このツールは完璧ではありません。DNSが失敗したり、コマンドがハングしたりすることもありますが、全体的に見て、PowerShellはWindows上のネットワークアクティビティを診断・監視するための柔軟な方法を提供します。特に、継続的なチェックを自動化したり、独自のカスタム監視ダッシュボードを作成したりするのに便利です。スクリプトの内容には注意し、再起動することで奇妙な不具合が解消されることを覚えておいてください。このツールが、ネットワークで何が起こっているのかという謎を解くのに役立つことを願っています。