ネットワークの疎通確認といえば、まず ping を思い浮かべる人が多いと思います。
ただ、実務では「pingは通らないけどWebは見られる」「サーバまでは到達していそうなのにRDPだけ接続できない」といったケースが普通にあります。
そんなときに便利なのが、Windows PowerShellの Test-NetConnection です。指定した宛先のTCPポートへ接続できるかを、追加ツールなしで確認できます。
この記事では、基本コマンドだけでなく、結果の読み方・pingとの違い・Falseになったときの切り分け・複数ポートの一括確認まで、ネットワーク障害の切り分けで使えるところまで掘り下げます。
Test-NetConnectionとは
Test-NetConnection は、WindowsのNetTCPIPモジュールに含まれるネットワーク診断用コマンドレットです。
- PingによるICMP疎通確認
- 指定TCPポートへの接続確認
- TraceRouteによる経路確認
- ルート・送信元アドレス選択の診断
今回の主役は、この中のTCPポート疎通確認です。
TCPポート疎通確認の基本コマンド
書式はかなりシンプルです。
Test-NetConnection 接続先 -Port ポート番号
たとえばHTTPSのTCP/443を確認するなら、次のように実行します。
Test-NetConnection example.com -Port 443
正常にTCP接続できた場合、結果の中に次のような項目が表示されます。
ComputerName : example.com
RemoteAddress : 93.184.216.34
RemotePort : 443
InterfaceAlias : Ethernet
SourceAddress : 192.0.2.10
TcpTestSucceeded : True
※IPアドレスなどの出力例は説明用です。実際の結果は環境によって異なります。
実行結果はどこを見ればいい?
| 項目 | 見るポイント |
|---|---|
| ComputerName | 指定したホスト名 |
| RemoteAddress | 名前解決された接続先IPアドレス |
| RemotePort | 確認対象のTCPポート番号 |
| InterfaceAlias | 通信に利用されたNIC |
| SourceAddress | 実際に選択された送信元IPアドレス |
| TcpTestSucceeded | TCP接続に成功したか |
一番分かりやすいのは TcpTestSucceeded ですが、障害切り分けでは RemoteAddress・InterfaceAlias・SourceAddress もかなり重要です。
RemoteAddressが想定どおりか
ホスト名を指定した場合、まず名前解決が行われます。RemoteAddressが想定していたIPと違うなら、TCPポート以前にDNSや名前解決先を疑う材料になります。
InterfaceAliasとSourceAddressも見る
PCに有線LAN・Wi-Fi・VPNなど複数のインターフェースがあると、「想定していないNICから通信が出ている」ということもあります。
接続先だけでなく、どの送信元IP・インターフェースが選ばれたかまで確認できるのがTest-NetConnectionの便利なところです。
TcpTestSucceededがTrueなら何が分かる?
TcpTestSucceeded : True なら、少なくともそのPCから指定した宛先IP・TCPポートへのTCP接続が確立できたと判断できます。
たとえばTCP/443がTrueなら、ネットワーク経路やファイアウォールを通り、接続先側でTCP/443への接続を受け付けるところまでは進めています。
ただし、ここは勘違いしやすいポイントです。
- TLS証明書が正常
- HTTP認証が成功する
- Webアプリケーションが正常に応答する
- 業務アプリが正常に動作する
これらまで保証しているわけではありません。
Test-NetConnectionは、ざっくり言えば「TCP接続できるところまで」を確認するコマンドです。HTTP/HTTPSの中身まで確認したい場合は curl などを使い分けます。
WebProxy経由でHTTPS通信を継続確認したい場合は、以前作成したこちらの記事でcurl.exeを使った確認方法をまとめています。
PowerShellでWebProxy経由のインターネット疎通を定期確認する方法|CSVログ保存付き
pingが通らなくてもTCPポートは通ることがある
ネットワーク障害の切り分けで、かなり大事なポイントです。
ping はICMP Echo Request / Replyを利用します。一方、Test-NetConnection -Port は指定したTCPポートへの接続を確認します。
ping example.com
Test-NetConnection example.com -Port 443
ファイアウォールでICMPだけを許可していない環境では、pingが失敗していてもTCP/443やTCP/3389などの必要な通信は正常、というケースがあります。
そのため、「pingが通らない=サーバへ通信できない」ではありません。確認したいサービスのTCPポートを直接テストする方が、切り分けとして適切な場合があります。
TcpTestSucceededがFalseのときの切り分け
TcpTestSucceeded : False が出たときは、「ネットワークが悪い」と即断せず、順番に切り分けます。
- 名前解決:RemoteAddressは想定したIPになっているか
- 送信元:InterfaceAlias / SourceAddressは想定どおりか
- 経路:宛先ネットワークへのルートが存在するか
- 途中の制御:端末FW・ネットワークFW・ACLなどで遮断されていないか
- 接続先:指定ポートでサービスがListenしているか
1. 名前解決を確認する
ホスト名で失敗する場合は、まずIPアドレスを直接指定して比較すると切り分けしやすくなります。
Test-NetConnection example.com -Port 443
Test-NetConnection 192.0.2.10 -Port 443
IP指定では成功し、ホスト名指定だけ失敗するなら、DNS・hostsファイルなど名前解決側を優先的に確認します。
2. 経路を確認する
Test-NetConnectionにはTraceRouteもあります。
Test-NetConnection example.com -TraceRoute
ただし、TraceRouteが途中で止まったからといって、その地点で通信が必ず遮断されているとは限りません。途中機器がICMP応答を返さない構成もあるので、TCPテスト結果と合わせて判断します。
3. 接続先サービスを確認する
ルーティングが正常でも、接続先でサービスが起動していなければTCP接続は成立しません。
たとえばRDPならTCP/3389、SMBならTCP/445など、本当にそのポートで待ち受けているのかを接続先サーバ側でも確認します。
True / Falseだけを取得する方法
詳細情報が不要で、成功・失敗だけ知りたい場合は -InformationLevel Quiet が便利です。
Test-NetConnection example.com -Port 443 -InformationLevel Quiet
成功時は True、失敗時は False が返るので、PowerShellスクリプトにも組み込みやすくなります。
if (Test-NetConnection example.com -Port 443 -InformationLevel Quiet) {
Write-Host "TCP/443 接続OK"
} else {
Write-Host "TCP/443 接続NG"
}
複数ポートをまとめて確認する
サーバ移行やファイアウォール変更後など、複数ポートをまとめて確認したいこともあります。
$target = "example.com"
$ports = 80, 443, 445, 3389
foreach ($port in $ports) {
[PSCustomObject]@{
Target = $target
Port = $port
Result = Test-NetConnection $target -Port $port -InformationLevel Quiet
}
}
結果を一覧にすると、どのポートだけ失敗しているかを比較しやすくなります。
Target Port Result
------ ---- ------
example.com 80 True
example.com 443 True
example.com 445 False
example.com 3389 False
※上記は表示例です。実際に開放されているポートは接続先によって異なります。
よく使うTCPポートの確認例
| 用途 | TCPポート | 確認例 |
|---|---|---|
| HTTP | 80 | Test-NetConnection host -Port 80 |
| HTTPS | 443 | Test-NetConnection host -Port 443 |
| SSH | 22 | Test-NetConnection host -Port 22 |
| RDP | 3389 | Test-NetConnection host -Port 3389 |
| SMB | 445 | Test-NetConnection host -Port 445 |
| SQL Server | 1433 | Test-NetConnection host -Port 1433 |
| MySQL | 3306 | Test-NetConnection host -Port 3306 |
| PostgreSQL | 5432 | Test-NetConnection host -Port 5432 |
ポート番号は環境によって変更されている場合があるので、実際のサービス設定も合わせて確認してください。
-CommonTCPPortという指定方法もある
Test-NetConnectionには、代表的なサービスを名前で指定できる -CommonTCPPort もあります。
Test-NetConnection server01 -CommonTCPPort RDP
Test-NetConnection server01 -CommonTCPPort SMB
Test-NetConnection example.com -CommonTCPPort HTTP
Microsoftのドキュメントで指定できる値は HTTP / RDP / SMB / WINRM の4種類です。HTTPSはプリセットに含まれないため、TCP/443は通常どおり -Port 443 を使います。
Test-NetConnectionでできないこと
UDPポートの疎通確認
Test-NetConnection -Port はTCP接続テストです。
DNSのUDP/53、DHCPのUDP/67・68、RADIUSのUDP/1812などを同じ感覚で確認することはできません。UDPはコネクションレスなので、TCPとは確認方法を分ける必要があります。
HTTPやアプリケーションの正常性確認
TCP/443がTrueでも、「Webページが200 OKを返す」「TLSや認証が正常」とは限りません。
HTTP/HTTPSまで確認するなら curl.exe や Invoke-WebRequest など、アプリケーション層を確認できる手段を使います。
細かいTCP接続タイムアウト指定
Test-NetConnectionの -Port パラメーターセットには、単純な -TimeoutSeconds のような指定はありません。
一方、PowerShell 7系の Test-Connection には -TcpPort と -TimeoutSeconds が用意されています。環境によってはこちらも選択肢になります。
Test-Connection -TargetName example.com -TcpPort 443 -TimeoutSeconds 3
ping・Test-NetConnection・curl・nslookupの使い分け
| コマンド | 主に確認するもの | 使う場面 |
|---|---|---|
| ping | ICMP疎通 | IPレベルの基本的な到達確認 |
| Test-NetConnection | TCPポート | RDP・HTTPS・SMBなど特定サービスの入口確認 |
| curl.exe | HTTP/HTTPS | WebやProxyを含めたアプリケーション層の確認 |
| nslookup | DNS | 名前解決先・DNS応答の確認 |
実務では、ひとつのコマンドだけで原因を断定するのではなく、どのレイヤまで正常なのかを順番に狭めていくのが基本です。
まとめ
Test-NetConnection 接続先 -Port ポート番号でTCP接続を確認できるTcpTestSucceededだけでなくRemoteAddress・SourceAddress・InterfaceAliasも切り分けに役立つ- pingが失敗しても、必要なTCPポートが正常な場合はある
- FalseならDNS → 送信元 → 経路 → FW/ACL → 接続先サービスの順で確認すると整理しやすい
- HTTP/HTTPSの中身まで見るならcurlなど別の手段を使う
「pingはどうなの?」「ポートは開いているの?」という会話は、ネットワーク障害の切り分けでは本当によく出てきます。
Test-NetConnectionはWindows標準環境で手軽に使えるので、RDP・Web・ファイル共有などの疎通確認で覚えておくとかなり便利です。

コメント