Test-NetConnectionでTCPポート疎通確認|使い方・結果の見方・False時の切り分け

IT
この記事は約10分で読めます。

ネットワークの疎通確認といえば、まず ping を思い浮かべる人が多いと思います。

ただ、実務では「pingは通らないけどWebは見られる」「サーバまでは到達していそうなのにRDPだけ接続できない」といったケースが普通にあります。

そんなときに便利なのが、Windows PowerShellの Test-NetConnection です。指定した宛先のTCPポートへ接続できるかを、追加ツールなしで確認できます。

この記事では、基本コマンドだけでなく、結果の読み方・pingとの違い・Falseになったときの切り分け・複数ポートの一括確認まで、ネットワーク障害の切り分けで使えるところまで掘り下げます。

┈ Twitterでも発信しているのでぜひフォローお願いします!

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アドレス
TcpTestSucceededTCP接続に成功したか

一番分かりやすいのは 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 が出たときは、「ネットワークが悪い」と即断せず、順番に切り分けます。

  1. 名前解決:RemoteAddressは想定したIPになっているか
  2. 送信元:InterfaceAlias / SourceAddressは想定どおりか
  3. 経路:宛先ネットワークへのルートが存在するか
  4. 途中の制御:端末FW・ネットワークFW・ACLなどで遮断されていないか
  5. 接続先:指定ポートでサービスが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ポート確認例
HTTP80Test-NetConnection host -Port 80
HTTPS443Test-NetConnection host -Port 443
SSH22Test-NetConnection host -Port 22
RDP3389Test-NetConnection host -Port 3389
SMB445Test-NetConnection host -Port 445
SQL Server1433Test-NetConnection host -Port 1433
MySQL3306Test-NetConnection host -Port 3306
PostgreSQL5432Test-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.exeInvoke-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の使い分け

コマンド主に確認するもの使う場面
pingICMP疎通IPレベルの基本的な到達確認
Test-NetConnectionTCPポートRDP・HTTPS・SMBなど特定サービスの入口確認
curl.exeHTTP/HTTPSWebやProxyを含めたアプリケーション層の確認
nslookupDNS名前解決先・DNS応答の確認

実務では、ひとつのコマンドだけで原因を断定するのではなく、どのレイヤまで正常なのかを順番に狭めていくのが基本です。

まとめ

  • Test-NetConnection 接続先 -Port ポート番号 でTCP接続を確認できる
  • TcpTestSucceeded だけでなくRemoteAddress・SourceAddress・InterfaceAliasも切り分けに役立つ
  • pingが失敗しても、必要なTCPポートが正常な場合はある
  • FalseならDNS → 送信元 → 経路 → FW/ACL → 接続先サービスの順で確認すると整理しやすい
  • HTTP/HTTPSの中身まで見るならcurlなど別の手段を使う

「pingはどうなの?」「ポートは開いているの?」という会話は、ネットワーク障害の切り分けでは本当によく出てきます。

Test-NetConnectionはWindows標準環境で手軽に使えるので、RDP・Web・ファイル共有などの疎通確認で覚えておくとかなり便利です。

参考:Microsoft公式ドキュメント

コメント

タイトルとURLをコピーしました