
今回は、PowerShellで特定のIPアドレス・ポートに対して、定期的にTCP接続確認を行う簡易スクリプトを作りました。
- ファイアウォールのポリシーが正しく許可されているか確認したい
- アプリケーションサーバの待受ポートが開いているか確認したい
- 一時的な通信断やサービス停止が発生していないか見たい
- サーバ再起動や設定変更中に、ポートの状態を継続的に見たい
本格的な監視であれば Zabbix や Prometheus、死活監視サービスなどを使うべきですが、「今この場で数秒おきにポートが開いているか見たい」くらいであれば、PowerShellだけでも十分確認できるので作りました。
⚠ 注意事項
設定内容やプログラムの内容は、用途・環境に応じて適切なものが変わります。
各種設定値や環境情報についてよく理解を深め、壊れてもよい環境で十分に検証してください。
なるべく正確に書くよう心掛けていますが、本投稿内容を実施される際には自己責任の下でお願いいたします。
作ったスクリプト
今回作成したスクリプトは以下です。
$ip = "10.0.0.152"
$port = 54322
$interval = 3
Write-Host "${ip}:${port} のポート監視を開始します。 (停止するには Ctrl + C)" -ForegroundColor Cyan
Write-Host "--------------------------------------------------"
while ($true) {
# 現在の時刻を取得
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
try {
# TcpClient を使って接続テスト(タイムアウト1秒)
$client = New-Object System.Net.Sockets.TcpClient
$connection = $client.BeginConnect($ip, $port, $null, $null)
$success = $connection.AsyncWaitHandle.WaitOne(1000, $false)
if ($success -and $client.Connected) {
Write-Host "[$timestamp] 接続成功 (Open)" -ForegroundColor Green
$client.Close()
} else {
Write-Host "[$timestamp] 接続失敗 (Closed / Timeout)" -ForegroundColor Red
}
}
catch {
Write-Host "[$timestamp] エラー発生: $_" -ForegroundColor Yellow
}
# 指定秒数待機
Start-Sleep -Seconds $interval
}
何をしているか
最初に、確認したい接続先を指定しています。
$ip = "10.0.0.152"
$port = 54322
$interval = 3
$ip が接続先のIPアドレス、$port が確認したいポート番号です。$interval は何秒おきに確認するかを指定しています。
この例では、10.0.0.152 の 54322 番ポートに対して、3秒おきに接続確認を行います。
TCP接続確認の部分
実際に接続確認しているのは、この部分です。
$client = New-Object System.Net.Sockets.TcpClient
$connection = $client.BeginConnect($ip, $port, $null, $null)
$success = $connection.AsyncWaitHandle.WaitOne(1000, $false)
TcpClient を使って、対象のIPアドレスとポートにTCP接続を試みています。
ここでポイントなのは、BeginConnect と WaitOne を使っているところです。
単純に Connect() を使うと、接続できない場合に待ち時間が長くなることがあります。
今回は、FWの疎通確認やアプリケーションサーバの稼働確認に使いたかったので、1回の確認で長く待たされるのは避けたいです。
そのため、タイムアウトを1秒にしています。
$success = $connection.AsyncWaitHandle.WaitOne(1000, $false)
結果表示
接続できた場合は、緑色で表示します。
Write-Host "[$timestamp] 接続成功 (Open)" -ForegroundColor Green
接続できなかった場合は、赤色で表示します。
Write-Host "[$timestamp] 接続失敗 (Closed / Timeout)" -ForegroundColor Red
実行すると、以下のような表示になります。
10.0.0.152:54322 のポート監視を開始します。 (停止するには Ctrl + C)
--------------------------------------------------
[2026-06-01 10:00:01] 接続成功 (Open)
[2026-06-01 10:00:04] 接続成功 (Open)
[2026-06-01 10:00:07] 接続失敗 (Closed / Timeout)
[2026-06-01 10:00:10] 接続成功 (Open)
タイムスタンプ付きで結果が出るので、
「何時何分頃に一時的に接続できなかったのか」が分かりやすいです。
FWポリシーの確認に使う
今回このスクリプトを作った主な理由は、ファイアウォールのポリシーテストです。
FWの設定変更を行ったあとに、
- 想定した通信だけ許可されているか
- 対象ポートに対して接続できるか
- ポリシー変更の反映タイミングで通信が切れないか
- サーバ側ではなくFW側で止められていないか
といったことを確認したい場面がありました。
もちろん、1回だけなら Test-NetConnection でも確認できます。
Test-NetConnection 10.0.0.152 -Port 54322
ただ、ポリシー変更中やサーバ再起動中は、継続的に見たいことがあります。
そのため、今回は数秒おきにループして確認する形にしました。
アプリケーションサーバの稼働確認にも使える
このスクリプトは、FWだけでなくアプリケーションサーバの簡易的な稼働確認にも使えます。
例えば、アプリケーションが 54322 番ポートで待ち受けている場合、
そのサービスが起動していれば Open になり、停止していれば Closed / Timeout になります。
アプリケーションの再起動時にこのスクリプトを流しておくと、
[2026-06-01 10:15:01] 接続成功 (Open)
[2026-06-01 10:15:04] 接続失敗 (Closed / Timeout)
[2026-06-01 10:15:07] 接続失敗 (Closed / Timeout)
[2026-06-01 10:15:10] 接続成功 (Open)
のように、停止していた時間帯をざっくり確認できます。
厳密な監視やログ保存を目的としたものではありませんが、
作業中に横で流しておく確認ツールとしては便利です。
止め方
このスクリプトは while ($true) で無限ループしています。
停止する場合は、PowerShellの画面で以下を押します。
Ctrl + C
注意点
このスクリプトは、あくまでTCPポートに接続できるかどうかを確認するものです。
そのため、接続成功と表示されたからといって、アプリケーションが正常に処理できているとは限りません。
例えばHTTPサーバであれば、TCP接続はできても、アプリケーション側で500エラーを返している可能性があります。
また、DBサーバであれば、ポートは開いていても認証エラーや内部エラーが発生している可能性があります。
なので、このスクリプトで確認できるのは、対象IPの対象ポートにTCP接続できるかというところまでです。
アプリケーションレベルの正常性まで確認したい場合は、HTTPのステータスコード確認や、実際のAPI疎通確認などを別途行う必要があります。
まとめ
今回は、PowerShellで簡単なポート監視スクリプトを作りました。
FWのポリシーテストや、アプリケーションサーバの待受確認をするだけであれば、これくらいのスクリプトでも十分役に立ちました。
特に、設定変更作業中に数秒おきに接続状況を見たい場合には便利です。
本格的な監視システムを入れるほどではないけれど、
一時的にポートの状態を追いかけたい、という場面では今後も使えそうです。