🛣

[PowerShell]複数のサーバーに対し指定したポートで疎通確認する方法

2023/12/15に公開

概要

監視対象となっていない社内サーバーに対し、任意のタイミングでポートの疎通確認を行いたく、
PowerShellで実現可能な方法を調べました。

この記事のターゲット

  • PowerShellユーザーの方
  • PowerShellでポートの疎通確認を行いたい方
  • さらに複数のサーバーに対してポートの疎通確認を行いたい方

環境

OSのバージョン

Windows 10 Pro環境

Get-WmiObjectコマンド
PS C:\Users\"ユーザー名"> Get-CimInstance CIM_OperatingSystem

SystemDirectory     Organization BuildNumber RegisteredUser SerialNumber            Version
---------------     ------------ ----------- -------------- ------------            -------
C:\WINDOWS\system32              19045       XXXXX          00000-00000-00000-AAAAA 10.0.19045
                                             ^^^^^          ^^^^^ ^^^^^ ^^^^^ ^^^^^
                                             ↑マスク       ↑マスク

PS C:\Users\"ユーザー名">

PowerShellのバージョン

PowerShellのバージョン
PS C:\Users\"ユーザー名"> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.3.10
PSEdition                      Core
GitCommitId                    7.3.10
OS                             Microsoft Windows 10.0.19045
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

PS C:\Users\"ユーザー名">

対応方法

コマンド(PowerShell CLI)で実行Functionを使って実行 という代表的な2つの方法を紹介。

モジュールとして定義し実行する方法 が知りたい方は、こちらの記事を参照。
https://zenn.dev/haretokidoki/articles/84aea5bddf2dd6

ポートの疎通確認ができるコマンドレット

コマンドレット「Test-NetConnection」を使う事で実現可能です。

コピー用
Test-NetConnection "対象サーバーのIPアドレス(またはホスト名)" -Port "確認したいポート番号"
google.comに対しポート「443(HTTPS)」で疎通確認
PS C:\Users\"ユーザー名"> Test-NetConnection google.com -Port 443

ComputerName     : google.com
RemoteAddress    : 142.250.206.206
RemotePort       : 443
InterfaceAlias   : イーサネット
SourceAddress    : 192.168.XXX.XXX
TcpTestSucceeded : True


PS C:\Users\"ユーザー名">

複数のサーバーに対してポート疎通確認が実現できる方法

コマンド(PowerShell CLI)で実行

IPアドレス(またはホスト名) と ポート番号 がセットになっている2次元配列を繰り返し実行する事で、
複数のサーバーに対して疎通確認が可能となる。

コピー用
$port_check_lists = @(
    @('localhost','8080'),
    @('localhost','8000'),
    @('google.com','443'),
    @('smtp.google.com','25')
)

for($i = 0; $i -lt $port_check_lists.Count; $i++) {
    $target_row = $port_check_lists[$i]

    Test-NetConnection $target_row[0] -Port $target_row[1]
}

Test-NetConnectionコマンドレットでは、「TcpTestSucceededTrue」だと正常終了で、
異常終了だと「TcpTestSucceededFalse」となります。

実行結果
PS C:\Users\"ユーザー名"> $port_check_lists = @(
>>     @('localhost','8080'),
>>     @('localhost','8000'),
>>     @('google.com','443'),
>>     @('smtp.google.com','25')
>> )
>>
>> for($i = 0; $i -lt $port_check_lists.Count; $i++) {
>>     $target_row = $port_check_lists[$i]
>>
>>     Test-NetConnection $target_row[0] -Port $target_row[1]
>> }
WARNING: TCP connect to (::1 : 8080) failed
WARNING: TCP connect to (127.0.0.1 : 8080) failed

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

ComputerName     : localhost
RemoteAddress    : ::1
RemotePort       : 8000
InterfaceAlias   : Loopback Pseudo-Interface 1
SourceAddress    : ::1
TcpTestSucceeded : True

ComputerName     : google.com
RemoteAddress    : 142.250.206.206
RemotePort       : 443
InterfaceAlias   : イーサネット
SourceAddress    : 192.168.XXX.XXX
TcpTestSucceeded : True

ComputerName     : smtp.google.com
RemoteAddress    : 64.233.188.26
RemotePort       : 25
InterfaceAlias   : イーサネット
SourceAddress    : 192.168.XXX.XXX
TcpTestSucceeded : True


PS C:\Users\"ユーザー名">  

Functionを使って実行

ジャグ配列 や 多次元配列(リテラル配列)については、こちらの記事で紹介。

https://zenn.dev/haretokidoki/articles/f79a5bb769973f

ジャグ配列「 @() 」で宣言した変数を使用する場合
# Function 定義
Function CheckPortMultipleServers {
    Param (
        [System.String[][]]$port_check_lists
    )

    for($i = 0; $i -lt $port_check_lists.Length; $i++) {
	    $target_row = $port_check_lists[$i]
	    Test-NetConnection $target_row[0] -Port $target_row[1]
	}
}

# Function 実行
[System.String[][]]$server_lists = @(
    @('localhost','8080'),
    @('localhost','8000'),
    @('google.com','443'),
    @('smtp.google.com','25')
)
CheckPortMultipleServers $server_lists
多次元配列「 [,] 」で宣言した変数を使用する場合
# Function 定義
Function CheckPortMultipleServers {
    Param (
        [System.String[,]]$port_check_lists
    )

    for($i = 0; $i -lt $port_check_lists.Length; $i++) {
        Test-NetConnection $port_check_lists[$i,0] -Port $port_check_lists[$i,1]
    }
}

# Function 実行
$server_lists = New-Object "System.String[,]" 4,2
$server_lists[0,0] = 'localhost'
$server_lists[0,1] = '8080'
$server_lists[1,0] = 'localhost'
$server_lists[1,1] = '8000'
$server_lists[2,0] = 'google.com'
$server_lists[2,1] = '443'
$server_lists[3,0] = 'smtp.google.com'
$server_lists[3,1] = '25'
CheckPortMultipleServers $server_lists

参考記事

まとめ

  • ポートの疎通確認ができるコマンドレット
    Test-NetConnection "対象サーバーのIPアドレス(またはホスト名)" -Port "確認したいポート番号"により実現
  • 複数のサーバーに対してポート疎通確認が実現できる方法
    1. 疎通確認リストを2次元配列で作成
      IPアドレス(またはホスト名) と ポート番号 がセットになった配列。
    2. for文で文字列配列を繰り返し個々にTest-NetConnectionを実行
      Functionで受け取った配列の種類(ジャグ配列、またはリテラル配列)により運用方法に差異があるので注意!

関連記事

https://zenn.dev/haretokidoki/articles/31ad6dfc204e38
https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion