ポート開放の疎通確認の方法【PowerShell, Ubuntu】
ポート開放の疎通確認の方法をいくつか、メモも兼ねて残します。あるサーバーのあるポートと通信が可能か、を確認する方法です(pingではない)。
以下の二点が必要となります。
・クライアントからサーバーに対して疎通確認
・(ない場合に)サーバー側でリスナーを用意
ファイアーウォールで通信許可をしても、サーバー側にリスナーがないとプログラムレベルで確認ができません。AWSでセキュリティグループの設定はしたものの、きちんとプログラムレベルで疎通確認する場合、サーバーを用意する必要があります。
当方の環境がWindowsはPowerShell、LinuxはUbuntuなので、PowerShellのコマンドとUbuntu (22.04.1)の場合を想定して書きます。LinuxはRed HatでもCentOSでも同じコマンドが使えると思います。多分。
クライアント -> サーバーへの疎通確認
PowerShell
ググれば出てきますが、Test-NetConnection
を使います。
Test-NetConnection 192.168.20.30 -Port 8000
成功すると結果はこんな感じ。
ComputerName : 192.168.20.30
RemoteAddress : 192.168.20.30
RemotePort : 8000
InterfaceAlias : イーサネット
SourceAddress : 192.168.20.110
TcpTestSucceeded : True
失敗すると、こう
警告: TCP connect to (192.168.20.30 : 8001) failed
ComputerName : 192.168.20.30
RemoteAddress : 192.168.20.30
RemotePort : 8001
InterfaceAlias : イーサネット
SourceAddress : 192.168.20.110
PingSucceeded : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded : False
参考:Test-NetConnection (NetTCPIP) | Microsoft Learn
Ubuntu
nc
使用します。netcatが正式名称のようです。
nc -z -v 192.168.20.110 60001
成功すると、以下のようにsucceeded!
と表示されます。
Connection to 192.168.20.110 60001 port [tcp/*] succeeded!
-z
はヘルプによると"Zero-I/O mode [used for scanning]"だそうで、何のデータも送らない。-v
は詳細を出力します(詳細はマニュアルかnc -help
を参照)。
サーバー側にリスナーを立てる
PowerShell
.NETのTcpListener
クラスを使用します。
下の例では、$tcpListener.Start()
でリスナーを起動しています。
$port = 60001
$endpoint = New-Object System.Net.IPEndPoint([IPAddress]::Any, $port)
$tcpListener = New-Object System.Net.Sockets.TcpListener $endpoint
$tcpListener.Start()
止める時はStop()
メソッドで。
$tcpListener.Stop()
参考:
TcpListener クラス (System.Net.Sockets) | Microsoft Learn
Ubuntu
クライアント側で使用したnc
をここでも使います。
ポート60002で待ち受ける場合、以下のようにします。
nc -l 60002
接続が来て成功すると終了します。
nc -l -v 60002
と、-v
オプションを付けると詳細情報を出せます。
Listening on 0.0.0.0 60002
Connection received on 192.168.20.27 46152
番外編: Python
Pythonがある環境なら標準でHTTP Serverが使えますので、これをポート指定で使うのもありです。そもそも、PythonでなくともTCPで通信するプログラムなら何でもよいのですが。
python3 -m http.server 8001
Windows ServerでIISがある環境なら、IISを指定のポートに設定してやっても、疎通確認はできます。
補足:Test-NetConnectionって何してるの?
ドキュメントに情報がないのでTest-NetConnection
で接続試行した時の、サーバー側のtcpdump
の出力を確認しました。
予想通りですが、 SYN -> SYN + ACK -> ACKの3-way handshakeのようです。その後、即座に接続終了をしています。
22:58:46.288802 ... : Flags [S], ...
22:58:46.288882 ... : Flags [S.], ...
22:58:46.289198 ... : Flags [.], ack 1, win 1026, length 0
22:58:46.289297 ... : Flags [F.], seq 1, ack 1, win 1026, length 0
22:58:46.290540 ... : Flags [F.], seq 1, ack 2, win 502, length 0
22:58:46.290708 ... : Flags [.], ack 2, win 1026, length 0
nc -v -z ...
の時も同様でした。
23:09:23.515239 ... : Flags [S], ...
23:09:23.515403 ... : Flags [S.], ...
23:09:23.515608 ... : Flags [.], ...
23:09:23.516291 ... : Flags [F.], ...
23:09:23.517212 ... : Flags [F.], ...
23:09:23.517333 ... : Flags [.], ...
以上です。
アプリ構築時にファイル転送やらで開きポートの確認をする必要があったので、調べてみました。
Discussion