NHN Cloud Meetup 編集部
ターゲットサーバーのポートが開いていることを確認する3つの方法
2019.11.06
24,599
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がなくてもファイルを受け取ることができるようです。