[PowerShell]複数のサーバーに対し指定したポートで疎通確認する方法
概要
監視対象となっていない社内サーバーに対し、任意のタイミングでポートの疎通確認を行いたく、
PowerShellで実現可能な方法を調べました。
この記事のターゲット
- PowerShellユーザーの方
- PowerShellでポートの疎通確認を行いたい方
- さらに複数のサーバーに対してポートの疎通確認を行いたい方
環境
OSのバージョン
Windows 10 Pro環境
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 Core ではGet-WmiObjectからGet-CimInstanceに変更
https://www.vwnet.jp/windows/PowerShell/2021061301/PowerShellCore6xWMI.htm -
参考記事:Win32_OperatingSystem クラスは CIM_OperatingSystem に変更
https://learn.microsoft.com/ja-jp/windows/win32/cimwin32prov/cim-operatingsystem
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つの方法を紹介。
モジュールとして定義し実行する方法 が知りたい方は、こちらの記事を参照。
ポートの疎通確認ができるコマンドレット
コマンドレット「Test-NetConnection
」を使う事で実現可能です。
Test-NetConnection "対象サーバーのIPアドレス(またはホスト名)" -Port "確認したいポート番号"
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コマンドレットでは、「TcpTestSucceeded
が True
」だと正常終了で、
異常終了だと「TcpTestSucceeded
が False
」となります。
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を使って実行
ジャグ配列 や 多次元配列については、こちらの記事で紹介。
# 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[0,1].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
参考記事
-
Microsoft公式ドキュメント:Test-NetConnection
https://learn.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection -
PowerShellのFunctionにおいて2次元配列を引数で渡す場合
https://qiita.com/Mount/items/d10ff1eb41617f4b8368 -
Microsoft公式ドキュメント:配列について
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_arrays
まとめ
- ポートの疎通確認ができるコマンドレット
Test-NetConnection "対象サーバーのIPアドレス(またはホスト名)" -Port "確認したいポート番号"
により実現 - 複数のサーバーに対してポート疎通確認が実現できる方法
- 疎通確認リストを2次元配列で作成
IPアドレス(またはホスト名) と ポート番号 がセットになった配列。 - for文で文字列配列を繰り返し個々にTest-NetConnectionを実行
Functionで受け取った配列の種類(ジャグ配列、または多次元配列)により運用方法に差異があるので注意!
- 疎通確認リストを2次元配列で作成
関連記事
Discussion