Windowsで開いているポートを確認することは、ネットワークを意識したユーザーなら誰もが知っておくべきスキルです。開いているポートとは、コンピュータが特定のポート番号で接続を待ち受けている状態を意味し、どのポートが開いているかを把握することで、セキュリティの隙間を見つけたり、接続の問題をトラブルシューティングしたり、アプリケーションが正常に動作していることを確認したりできます。Windowsには複数の組み込みツールが用意されており、さらに外部ツールを使ってポートがどのように見えるかを外部からテストすることもできます。
目次
開いているポートとは何か、なぜ重要なのか
コンピュータ上のすべてのネットワークサービスは、1から65535の間のポート番号にバインドされています。サービスが実行中で接続を待ち受けている場合、そのポートは「開いている」状態です。何も待ち受けていない場合、ポートは「閉じている」状態であり、接続の試みは拒否されるか無視されます。
実際にこれが重要である理由は以下の通りです。
- セキュリティ監査: 予期しない開いているポートは、不正なプロセス、マルウェア、または設定ミスのあるサービスがマシンを露出させていることを意味する可能性があります。
- トラブルシューティング: Webサーバー、ゲームサーバー、またはリモートデスクトップに到達できない場合、最初の質問はそのポートが実際に開いているかどうかです。
- ファイアウォール検証: Windowsファイアウォールがサービスの実行中でもポートをブロックしている可能性があります。または、閉じていると思っていたポートを許可している可能性があります。
Netstatコマンドを使用して開いているポートを確認する
netstatコマンドは、Windowsマシンが現在待ち受けているすべてのポートをリストアップするための最速の組み込み方法です。コマンドプロンプトを開き(スタートメニューで「cmd」を検索し、右クリックして「管理者として実行」を選択)、以下を実行します。
netstat -ano
フラグの内訳は以下の通りです。
-
-aはすべてのアクティブな接続と待ち受けているポートを表示します。 -
-nはアドレスとポート番号を数値で表示し、ホスト名の解決を行いません(はるかに高速です)。 -
-oはプロセスID(PID)を追加し、各ポートを所有しているプログラムを特定できます。
出力列は「Proto」「Local Address」「Foreign Address」「State」「PID」です。State列に「LISTENING」と表示されている行を探してください。これらがあなたの開いているポートです。
待ち受けているポートのみに絞り込むには、次を実行します。
netstat -ano | findstr LISTENING
調査したいPIDが見つかったら、以下のコマンドでプロセス名を確認します。
tasklist | findstr PID
netstat出力から実際のPIDに置き換えてください。このコマンドは、そのポートで待ち受けているプログラムが何かを正確に教えてくれます。
特定のポートが使用されているかどうかを確認するには、netstatをfindstrと組み合わせます。
netstat -ano | findstr :8080
PowerShellでポートを確認する
PowerShellはnetstatに比べて、より洗練されたスクリプト可能な代替手段を提供します。PowerShellを管理者として開き、以下を実行します。
Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, OwningProcess | Sort-Object LocalPort
これにより、LISTEN状態のすべてのTCPポート、ローカルアドレス、PIDをソートされたリストで返します。同じコマンドでPIDをプロセス名に解決するには、以下を実行します。
Get-NetTCPConnection -State Listen | ForEach-Object { $_ | Add-Member -NotePropertyName ProcessName -NotePropertyValue (Get-Process -Id $_.OwningProcess).Name -PassThru } | Select-Object LocalAddress, LocalPort, ProcessName | Sort-Object LocalPort
PowerShellからTest-NetConnectionを使用して、リモートホストの特定のポートが開いているかどうかをテストすることもできます。
Test-NetConnection -ComputerName example.com -Port 80
出力に「TcpTestSucceeded : True」が表示されれば、ポートは開いており、マシンからの接続を受け入れています。これはローカルで開いているものをチェックするだけでなく、Windowsパソコンからサーバーへのアウトバウンド接続を確認するのに便利です。
Windowsファイアウォール設定でポートルールを確認する
Windowsファイアウォールはどのポートが出入りを許可されるかを制御します。サービスがローカルでポートで待ち受けていても、ファイアウォールがそのポートへのインバウンドトラフィックをブロックしている場合、外部クライアントはそれに到達できません。ファイアウォールルールを確認する方法は以下の通りです。
Windows Defender ファイアウォール(詳細設定)を使用する
- 「Win + R」を押し、「wf.msc」と入力して、Enterキーを押します。
- 左パネルの「インバウンドルール」をクリックして、マシンへの着信トラフィックを制御するルールを確認します。
- 「アウトバウンドルール」をクリックして、マシンから出ていくトラフィックを確認します。
- 「有効」でソートして、どのルールがアクティブかをすばやく確認します。
- 各ルールはプロトコル(TCP/UDP)、ローカルポート、リモートポート、およびアクション(許可/ブロック)を表示します。
コマンドラインを使用する
コマンドラインからすべてのアクティブなファイアウォールルールをリストアップするには、以下を実行します。
netsh advfirewall show allprofiles
特定のポートがファイアウォール経由で許可されているかどうかを確認するには、以下を実行します。
netsh advfirewall firewall show rule name=all | findstr 8080
Microsoftの公式ドキュメント「 Windowsファイアウォール設定のベストプラクティス 」では、ルールの作成と管理について詳しく説明しており、ルールを追加または変更する必要がある場合に参考になります。
Windows上でポートスキャナーを使用する
組み込みツールは自分のマシンをチェックするのに最適ですが、ネットワーク上の別のホストをスキャンしたい場合や、生のコマンドライン出力ではなく視覚的な概要が必要な場合があります。専用ポートスキャナーはこのギャップを埋めます。
Nmap はポートスキャンの業界標準です。無料でオープンソースであり、 公式Nmapダウンロードページ からWindowsで利用可能です。Windowsインストーラーには、グラフィカルフロントエンドのZenmapが含まれています。ホストの基本的なスキャンは以下のようになります。
nmap -sV example.com
-sVフラグは、各開いているポートで実行されているサービスバージョンを検出しようとします。これはWindowsのネットワークセキュリティ監査に役立ちます。どのポートが開いているかだけでなく、その背後にあるソフトウェアが何かを確認できるからです。
開いているポートを外部からテストする
ここで重要な区別があります。ほとんどのガイドがスキップしているものです。Windowsマシンでローカルにポートが待ち受けていても、外部から見ると閉じているように見える場合があります。これはルーターがそのポートを転送していない場合、またはISPがそれをブロックしている場合に発生します。インターネットが実際に何を見ているかを知るには、外部の視点からテストする必要があります。
これはまさにオンラインポートチェッカーが行うことです。リモートサーバーからあなたのIPアドレスへのTCP接続を開始し、接続が受け入れられた(開いている)、拒否された(閉じている)、またはタイムアウトした(タイムアウト)かどうかを報告します。ソフトウェアのインストールは不要で、ローカルファイアウォールをバイパスして真の外部ビューを表示します。
Windowsマシンで実際に開いているポートを確認する
当社の無料オンラインポートチェッカーは、外部サーバーからIPまたはドメインへのTCP接続をテストするため、Windowsで開いているポートをチェックする際に真の外部ビューが得られます。1つのポートをチェックするか、最大10個をバッチチェックでき、結果はミリ秒単位で得られます。
開いているポートを確認する
よく使われるポートのクイックリファレンス
どのサービスがどのポートを使用しているかを知ることは、トラブルシューティング時に時間を節約できます。Windowsシステムで最も頻繁に遭遇するポートは以下の通りです。
| ポート | プロトコル | サービス | Windowsでの一般的な用途 |
|---|---|---|---|
| 80 | TCP | HTTP | Webサーバー(IIS、Apache)、ローカル開発サーバー |
| 443 | TCP | HTTPS | セキュアWebサーバー、Windowsアップデート |
| 3389 | TCP | RDP | リモートデスクトッププロトコル、リモート管理 |
| 445 | TCP | SMB | ファイル共有、Windowsネットワーク共有 |
| 22 | TCP | SSH | OpenSSH(Windows 10/11に組み込み) |
| 21 | TCP | FTP | ファイル転送、IIS FTPサービス |
| 25 | TCP | SMTP | メール送信、メールサーバーリレー |
| 3306 | TCP | MySQL | MySQL/MariaDBデータベース接続 |
| 5432 | TCP | PostgreSQL | PostgreSQLデータベース接続 |
| 135 | TCP | RPC | Windows リモートプロシージャコール、DCOM |
不要なポートを閉じる
優れたWindowsポート監視は、開いているものを見つけることだけではありません。どのポートが開いている必要があるかを判断し、それ以外はすべて閉じることです。実用的なアプローチは以下の通りです。
- netstat -anoを実行して、すべてのLISTENINGポートをリストアップします。 先ほど示したtasklistコマンドを使用して、各PIDをプロセス名にマップします。
- 不要なサービスを特定します。 たとえば、IISを使用していない場合、ポート80または443がローカルで開いている理由はありません。サービスマネージャーでサービスを停止します。
- Windowsファイアウォールのインバウンドルールを確認します。 wf.mscを開き、不要と特定したポートへのトラフィックを許可するルールを無効にします。
- ルーターを確認します。 ルーター上のポート転送ルールは、Windowsファイアウォールでブロックされていてもポートを露出させる可能性があります。ルーターの管理パネルにログインして、転送されたポートを監査します。
- 外部から再度テストします。 変更を加えた後、外部ポートチェックを再度実行して、ポートがもう到達不可能であることを確認します。
CISAサイバーセキュリティアドバイザリー は、野外で悪用されている特定のポートについて定期的にアラートを公開しています。Windowsサーバーを管理している場合、このリストを定期的に確認することは良い習慣です。
ポートがローカルで開いているということは、Windowsマシン上のサービスがそのポート番号で接続を積極的に待ち受けていることを意味します。ポートが外部で開いているということは、インターネット上の外部コンピュータが実際にそれに到達できることを意味します。ルーター、ISP、またはWindowsファイアウォールは、ポートがローカルで待ち受けていても外部アクセスをブロックできます。常に外部ツールからテストして、実際の状態を確認してください。
これはほぼ常に3つのことのいずれかが原因です。Windowsファイアウォールがポートをブロックするインバウンドルールを持っている、ルーターがそのポートのポート転送ルールを持っていない、またはISPがネットワークレベルでポートをブロックしている。順番に各レイヤーをチェックしてください。ISPがブロックする一般的なポートには、住宅用接続で25(SMTP)、80、443が含まれます。
RDPを直接インターネットに露出させることは大きなセキュリティリスクです。自動ボットは継続的にオープンポート3389をスキャンし、ブルートフォースログインを試みます。リモートアクセスが必要な場合は、VPNを使用してネットワークに最初に到達するか、Windowsファイアウォールで特定のIPアドレスへのRDPアクセスを制限するか、標準以外のポートと強力なパスワード、ネットワークレベル認証(NLA)を組み合わせて使用してください。
Netstatは-aフラグを使用するとUDPポートを表示します。Protoコラムで「UDP」とラベル付けされた行を探してください。ただし、TCPのような接続ハンドシェイクがないため、UDPはリモートでテストするのが非常に難しいです。ほとんどのオンラインポートチェッカー(TCPベースのツールを含む)はTCP接続のみをテストします。UDPスキャンの場合、-uフラグを使用したNmapが実用的なオプションですが、管理者権限が必要です。
wf.mscを開き、「インバウンドルール」をクリックして、右側の「新しいルール」をクリックします。「ポート」を選択し、TCPまたはUDPを選択し、ポート番号を入力し、「接続を許可する」を選択し、適切なプロファイル(ドメイン、プライベート、パブリック)に適用し、ルールに名前を付けます。コマンドラインが好きな場合は、以下を使用します。
netsh advfirewall firewall add rule name="Open Port 8080" dir=in action=allow protocol=tcp localport=8080
タイムアウトは、ポートチェッカーがTCP接続リクエストを送信したが、待機期間内(通常は数秒)に応答を受け取らなかったことを意味します。これは通常、ファイアウォールがパケットを積極的に拒否するのではなく、サイレントにドロップしていることを意味します。「閉じている」結果は、ホストがTCPリセットを送信し、接続を積極的に拒否したことを意味します。タイムアウトはトラフィックを拒否するのではなくドロップする厳密なファイアウォール設定でより一般的です。