目次
tcpポートの疎通チェックの方法について調べていると、Bashにソケット通信機能を使てtcpポートの疎通チェックを行う方法がある事をしりまとめた記事となります。
本記事で利用している環境
- Amazon Linux 2023
- GNU bash, version 5.2.15(1)-release (x86_64-amazon-linux-gnu)
参考元
- stackoverflow - Test if remote TCP port is open from a shell script
- stackoverflow - How to decrease TCP connect() system call timeout?
- stackexchange - Different ways to use /dev/tcp/host/port command and where to find manual pages on this
Bashのソケット通信機能を用いてtcpポート疎通チェックするコマンドについて
下記のような感じでコマンドを実行するとポートのBashのリダイレクト機能を利用してポートチェックができる。
# 書き方パターン1
# 3秒間で疎通できれば「Port open.」表示 できなければ「Port closed.」表示
timeout 3 bash -c "</dev/tcp/{HOST}/{Port}" && echo Port open. || echo Port closed.
# 書き方パターン2
# 3秒間で疎通できれば「Port open.」表示 できなければ「Port closed.」表示
timeout 3 bash -c "cat < /dev/null > /dev/tcp/{HOST}/{Port}" && echo Port open. || echo Port closed.
Bashのドキュメントを確認してみる
Bash Reference Manual - Redirections
Reference ManualのRedirections部分に記述があり、下記のように記載されています。
/dev/tcp/host/port
If is a valid hostname or Internet address, and is an integer port number or service name, Bash attempts to open the corresponding TCP socket. hostport
Bashでは/dev/tcp/host/portにリダイレクトすると記述されたhostとportにtcpソケットを開くようです。
先で紹介したコマンドではこの機能を利用してポートの疎通チェックをしています。
疎通チェックコマンドで何をやっているか確認
先で紹介したtcpの疎通チェックのコマンドは、Bashのリダイレクトに記載のあるソケット通信機能を利用して実現しており、下記画像のようにリダイレクト部分だけ実行してみるとコマンドが成功した時は"Port open."をecho。失敗した時は"Port closed.をecho"しています。
このように疎通する、疎通しないで終了コードが変化する事を利用して、またtcpが疎通しない場合はtcpがタイムアウトするまで待ってしまうため、timeout 3として3秒間疎通しなければtimeoutといった形にしているのが今回紹介するコマンドとなっています。
余談
ポートの疎通チェック方法としてcurlコマンドでプロトコルとしてtelnetを選択して疎通チェックする方法や、ncコマンドなどもありますが。
Amazon Linux 2023環境ではcurlではtelnetのプロトコルが利用できないようになっており。
(下記画像のように表示される)
AWSから提供されるAMIから起動した素の状態ではncコマンドもインストールされていなかったりします。
総評
もともとは素の状態のAmazon Linux 2023でポートチェックしたかったので、何か方法がないか調べていましたが。
初見よくわからない方法で疎通チェックをしているStackOverflowの記事がり、調べてみるとBashにソケット通信を行う機能を利用していた事がわかりました。
このため本記事ではその理解をまとめてみました。
各種コマンドがインストールされてない環境で、ちょっとポートの疎通確認したい時などに利用すると便利かと思います。