🙌

ポート開放の疎通確認の方法【PowerShell, Ubuntu】

2023/02/24に公開

ポート開放の疎通確認の方法をいくつか、メモも兼ねて残します。あるサーバーのあるポートと通信が可能か、を確認する方法です(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