PowerShellでポート疎通確認する方法【ping代替・Test-Connection/Test-NetConnection】

PowerShellのアイキャッチ

ネットワークの疎通確認をしたいけどpingだとポート番号まで確認できなくて困ったことってありますよね。WebサーバーやDBへの接続確認では「IPは通る、でも本当にポートまで届いているのか」が知りたい場面が多いと思います。

さらに最近のWindows環境ではファイアウォールがデフォルトでpingの受信を遮断する設定になっているため「pingが通らない=通信できない」とは限らないという難しさもありますよね。

今回はPowerShellを使ってホスト名(またはIPアドレス)とポート番号をセットで疎通確認する方法を解説します。環境に応じて2つのコマンドを使い分けることで、より正確なネットワーク診断ができるようになりますよ。

目次

この記事でわかること

  • pingコマンドではポート番号を指定した疎通確認ができない理由
  • Test-Connection(PowerShell 7.0以上)でシンプルに確認する方法
  • Test-NetConnection(PowerShell 5.1以上)で詳細情報を取得する方法
  • 2つのコマンドの使い分け基準

pingコマンドの限界とポート指定確認の必要性

pingではポート番号を確認できない

pingコマンドは便利なネットワーク診断ツールですが、ICMPプロトコルを使用しているためTCP/UDPのポート番号を指定した確認はできません。

例えば以下のようなシーンでは困りますよね。

  • Webサーバー(ポート80や443)が動いているか確認したい。
  • データベース(ポート3306や5432)への接続を確認したい。
  • 特定のアプリケーションポートが開いているか調べたい。

Windowsファイアウォールとpingの関係

Windows 10以降のOSではセキュリティ強化のためファイアウォールがデフォルトでICMPエコー要求(ping)をブロックします。このためpingが失敗した原因が「ネットワークが不通」なのか「ファイアウォールで遮断されている」のか判断できないこともあります。

PowerShellのポート指定確認コマンドを使えばTCP接続を直接試すことができ、より実用的な疎通確認が可能になります。

PowerShellでポート疎通を確認する2つの方法

PowerShellにはポート番号を指定して疎通確認できるコマンドが2種類用意されています。それぞれ特徴が異なるので用途に応じて使い分けましょう。

コマンド名必要なバージョン実行速度出力情報おすすめシーン
Test-ConnectionPowerShell 7.0以上高速True / Falseシンプルな確認、スクリプト組み込み
Test-NetConnectionPowerShell 5.1以上やや遅い詳細情報トラブルシューティング、詳細調査

Test-Connectionコマンドの使い方【高速・シンプル】

基本的な構文

PowerShell 7.0以上が使用可能な環境ではTest-Connectionコマンドが最もシンプルで高速です。実行結果はTrue(疎通可能)またはFalse(疎通不可)で返ってきます。

公式ドキュメントによると以下のような構文となっています。

Test-Connection
[-TargetName] <string[]>
-TcpPort <int>
[-IPv4]
[-IPv6]
[-ResolveDestination]
[-Source <string>]
[-Count <int>]
[-Delay <int>]
[-Repeat]
[-Quiet]
[-TimeoutSeconds <int>]
[-Detailed]
[<CommonParameters>]

Test-Connection (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn

実行例:疎通OKの場合

ローカルホスト(127.0.0.1)のポート8080番に対して疎通確認を行う例です。

PowerShell
Test-Connection 127.0.0.1 -TcpPort 8080
PowerShell – 実行結果
True

この結果は、ポート8080で何らかのサービスが待ち受けておりTCP接続が確立できることを意味します。

実行例:疎通NGの場合

存在しないポート番号(12345番)に対して確認を行った場合です。

PowerShell
Test-Connection 127.0.0.1 -TcpPort 12345
PowerShell – 実行結果
False

Falseが返ってきた場合、以下のいずれかの可能性があります。

  • 指定したポートでサービスが起動していない。
  • ファイアウォールでポートがブロックされている。
  • ネットワーク的に到達できない。

外部サーバーへの接続確認例

実際の業務では外部のWebサーバーやAPIサーバーへの疎通確認も行いますよね。以下はGoogle(8.8.8.8)の53番ポート(DNS)への接続確認例です。

PowerShell
Test-Connection 8.8.8.8 -TcpPort 53
PowerShell – 実行結果
True

スクリプトでの活用例

Test-Connectionは戻り値がTrue/FalseなのでPowerShellスクリプト内での条件分岐に使いやすいという利点もあります。

PowerShell
$result = Test-Connection example.com -TcpPort 443
if ($result) {
    Write-Host "HTTPS接続OK"
} else {
    Write-Host "HTTPS接続NG"
}

Test-NetConnectionコマンドの使い方【詳細情報取得】

基本的な構文

PowerShell 5.1以上(Windows 10標準搭載)で使用可能なTest-NetConnectionTest-Connectionより詳細な情報を取得できます。ただし実行に若干時間がかかる点には注意が必要です。

公式ドキュメントによると以下のような構文となっています(参考:Microsoft Learn – Test-NetConnection)。

Test-NetConnection
[[-ComputerName] <String>]
-Port <Int32>
[-InformationLevel <String>]
[<CommonParameters>]

Test-NetConnection (NetTCPIP) | Microsoft Learn

実行例:疎通OKの場合

ローカルホストのポート8080番に対して確認を行った例です。

PowerShell
Test-NetConnection 127.0.0.1 -Port 8080
PowerShell – 実行結果
ComputerName     : 127.0.0.1
RemoteAddress    : 127.0.0.1
RemotePort       : 8080
InterfaceAlias   : Loopback Pseudo-Interface 1
SourceAddress    : 127.0.0.1
TcpTestSucceeded : True

Test-Connectionと異なり以下の詳細情報が取得できます。

  • RemoteAddress: 接続先のIPアドレス。
  • RemotePort: 接続先のポート番号。
  • InterfaceAlias: 使用されたネットワークインターフェース名。
  • SourceAddress: 接続元のIPアドレス。
  • TcpTestSucceeded: TCP接続が成功したかどうか(True/False)。

実行例:疎通NGの場合

存在しないポート番号への接続を試みた場合です。

PowerShell
Test-NetConnection 127.0.0.1 -Port 12345
PowerShell – 実行結果
WARNING: TCP connect to (127.0.0.1 : 12345) failed

ComputerName           : 127.0.0.1
RemoteAddress          : 127.0.0.1
RemotePort             : 12345
InterfaceAlias         : Loopback Pseudo-Interface 1
SourceAddress          : 127.0.0.1
PingSucceeded          : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False

注目すべきはPingSucceeded : Trueの部分です。「pingは通るけど指定したポートへのTCP接続は失敗した」ことを示しています。この情報があることで、ネットワーク自体は到達可能だがサービスが起動していない(またはファイアウォールでブロックされている)と判断できるわけですね。

トラブルシューティングでの活用

Test-NetConnectionはネットワークトラブルの切り分けに非常に役立ちます。

PowerShell
Test-NetConnection db-server.example.com -Port 3306

例えば上記のコマンドでデータベースサーバーのMySQLポート(3306)への接続を確認しPingSucceededTcpTestSucceededの組み合わせから原因を特定できます。

2つのコマンドの使い分けガイド

どちらのコマンドを使うべきか迷ったときの判断基準をまとめました。

Test-Connectionを使うべきケース

  • PowerShell 7.0以上が利用可能な環境。
  • 単純に「接続できるかどうか」だけを高速に確認したい。
  • スクリプト内で条件分岐に使いたい。
  • 複数のホスト・ポートを連続で確認したい。

Test-NetConnectionを使うべきケース

  • PowerShell 5.1環境(Windows標準)で実行したい。
  • 詳細なネットワーク情報も同時に取得したい。
  • トラブルシューティングで原因を切り分けたい。
  • pingの疎通状況も併せて確認したい。

PowerShellの起動方法についてはこちらでも解説してます。

Q&A

PowerShellのバージョンはどうやって確認できる?

以下のコマンドで確認できます。

PowerShell
$PSVersionTable.PSVersion

出力されたメジャーバージョンが7以上ならTest-Connection-TcpPortオプションが使用可能です。PowerShellのバージョンアップ方法については以下でも解説してます。

ホスト名でも指定できる?

できます!IPアドレスの代わりにホスト名(FQDN)も指定可能です。

PowerShell
Test-Connection example.com -TcpPort 443
Test-NetConnection example.com -Port 443
複数のポートを一度に確認できる?

Test-Connectionでは配列を使って複数確認できます。

PowerShell
80,443 | ForEach-Object { Test-Connection example.com -TcpPort $_ }
タイムアウト時間を変更できる?

Test-Connectionでは-TimeoutSecondsオプションで指定できます。

PowerShell
Test-Connection example.com -TcpPort 443 -TimeoutSeconds 5

Test-NetConnectionはデフォルトで数秒のタイムアウトが設定されています。

UDPポートの確認はできる?

残念ながら両コマンドともTCP接続のみの確認となります。UDPポートの確認には別のツールが必要です。

まとめ

PowerShellでポート番号を指定した疎通確認を行う方法について解説しました。

  • pingコマンドではポート番号を指定した確認ができないよ。
  • Test-Connection(PowerShell 7.0以上)は高速でシンプル、戻り値がTrue/Falseだよ。
  • Test-NetConnection(PowerShell 5.1以上)は詳細情報が取得できてトラブルシューティングに最適だよ。
  • PingSucceededTcpTestSucceededを組み合わせることで障害の原因を切り分けられるよ。

ネットワーク確認と組み合わせて使いたい、PowerShellでのログ監視はこちらでも紹介しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次