ターゲットサーバーのポートが開いていることを確認する3つの方法

ACLやセキュリティグループ(security group)でポートが塞がっているか確認したいと思うときがあります。

通常はpingのようなコマンドでICMPパケットを打ってみて、サーバーが生きているか最初に確認します。
しかし、pingでは生きていても、SSHやHTTPなどができないときがあります。
このようなときは、TCPポートが開いている状態か確認する必要があります。

1. tcpping

TCP SYNパケットを送信して、そのポートが開いているかどうかを確認する簡単なプログラムです。
余談ですが、tcppingを使うと、pingのようにround-trip timeを表示して、TCP接続の速度を見ることができます。かつては、ルータでのpingの優先順位が低く(?)ゆっくり処理されていたため、インターネットの速度よりも遅く出力されることがありました。TCP接続は、可能な限り迅速に処理するため、レイテンシー(latency)をより正確に見るためには、pingよりtcppingを使わなければならないようです。

2. telnet <IP> <port>

TelnetでIPアドレス、ポートを指定すると、対象サーバーで当該ポートが開いているか簡単に確認できます。

$ telnet 127.0.0.1 10002
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

$ telnet 127.0.0.1 22
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.1
^C^]
telnet> quit
Connection closed.

接続されてしまえば、Ctrl+Cも効きません。そこで、Ctrl+’]’を押すと、Telnetプロンプトが出力されます。
ここでquitすればよいでしょう。

Telnetは、数十年前に使用されていたもので、最近はデフォルトでインストールされていません。
そこで、次のコマンドを使うこともできます。

3. echo > /dev/tcp/<ip>/<port>

Bashのbuilt-in機能です。

$ echo > /dev/tcp/127.0.0.1/22
$ echo $?
0

ポートが開いている場合は、何もメッセージが出てこない状態で終了します。
echo $?してみると、0が出ます。
すぐ前の実行コマンドが正常に終了しました、というUNIXの世界でのメッセージです。

$ echo > /dev/tcp/127.0.0.1/10002
bash: connect: 接続が拒否される
bash: /dev/tcp/127.0.0.1/10002: 接続が拒否される
$ echo $?
1

ポートが開いていない場合はエラーメッセージが表示され、$?の値が1で出力されます。
正常に終了しなかったことを意味します。

以下の文書で、Bashのbuilt-inについて詳しい内容が説明されています。
https://www.tldp.org/LDP/abs/html/devref1.html

P.S. /dev/tcpを利用すると、wgetやcurlがなくてもファイルを受け取ることができるようです。

TOAST Meetup 編集部

TOASTの技術ナレッジやお得なイベント情報を発信していきます
pagetop