リモートシステムのポートが到達可能かどうかをテストします(telnetなし)


353

telnetは、リモートホストのポートが開いているかどうかを確認していました。つまり、telnet hostname port任意のホストの任意のポートに接続し、未加工のTCPストリームにアクセスできるようにします。

最近、私が作業しているシステムには(セキュリティ上の理由から)telnetがインストールされておらず、すべてのホストへのすべてのアウトバウンド接続がデフォルトでブロックされています。時間が経つにつれて、どのポートがどのホストに対して開いているかを簡単に把握できなくなります。

リモートシステムのポートが開いているかどうかをテストする別の方法telnetはありますか。インストールされているパッケージの数が限られているLinuxシステムを使用して使用できませんか?



私はこれと同じ問題を抱えていました。以下の@Subhranath Chunderの回答が役に立ちました。ただし、Telnetのインストールはを実行するだけの小さな問題であることがわかりましたbrew install telnet。だから私は、Linuxユーザーがと同じことを行うことができ期待yumしてapt-get
Mig82

回答:


277

Bashはしばらくの間、TCPおよびUDPポートにアクセスできました。manページから:

/dev/tcp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a UDP connection to the corresponding socket.

したがって、次のようなものを使用できます。

xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here

ターダー!


これはMinGWでも機能するようです。たとえば、192.168.2.100上のリモートVNCサーバーは、「cat </dev/tcp/192.168.2.100/5900」を使用して「RFB 003.008」で応答します。
ピーターモーテンセン

1
@ lornix、OK、しかしこの場合、-zオプションなしでncを使用して同じ結果を取得する必要がありますが、それでも動作しません:#nc -v -w5 127.0.0.1 18080 127.0.0.1 18080ポート[tcpへの接続/ *]成功しました!#cat </dev/tcp/127.0.0.1/18080結果なしでハングします。ちょうど私が「は/ dev / TCP /ホスト/ポート」オプションを使用することができたときに理解したい
アレクサンドル

5
@Alexandr ...実際には、「結果なしでハングする」というのはほとんど予想される動作です。 は入力を待っています。 ncには、保留中のデータがないことを検知して試行を停止できるようにする特別な機能があります。 猫はないが、非常にスマート。試してみてcat < /dev/tcp/localhost/22、sshdヘッダーを取得してください。明らかに、ポート18080上のプロセスは、何かを送信する前に、何かが入ってくるのを待ちます。ポート22(ssh)は、そのバージョンとその他を歓迎します。やってみて!
lornix

1
@lornix、説明ありがとうございます!これで制限が明確になりました。ncを使用することは、ポートをチェックするための好ましい方法であると思います。
アレクサンドル・

2
これは、何もインストールされていないドッカーコンテナで作業するときに非常に役立ちました。コンテナがDNS経由でコンテナ化されていないDBにアクセスできることをすばやく確認できました。例:cat </ dev / tcp / hostname / 5432
Michael Hobbs

404

素敵で冗長!マニュアルページから。
単一ポート:

nc -zv 127.0.0.1 80

複数のポート:

nc -zv 127.0.0.1 22 80 8080

ポートの範囲:

nc -zv 127.0.0.1 20-30

6
一番いい答えだと思います、ありがとう。;-)
lpapp 14年

6
これは、Ubuntu 14.04(Trusty Tahr)で閉じたポートのリモートサーバー(同じLAN)(127秒後にタイムアウトになった)で試行したときにハングしました。したがって、スクリプトにはあまり適していません。ただし、ポートが開いているサービスでは機能しました。オプション "-w2"を使用することで解決できます。
ピーターモーテンセン

6
UDPポートには-uオプションを使用します。
エフレン

8
ncat -zのバージョン6.4では認識されません。私はzなしで行うことができました
smishra

5
以下を使用して、複数の範囲を確認できます:nc -zv 127.0.0.1 22,80,8080,20-30,443-446(ncバージョン:1.107-4)。
ボベル

102

Netcatは便利なツールです。

nc 127.0.0.1 123 &> /dev/null; echo $?

0ポート123が開いていて、1閉じている場合に出力されます。


これは、私自身よりもはるかにエレガントでスクリプト可能な回答です。それは私のために不幸である源泉徴収セキュリティ意識の高いシステム管理者telnetも天引きnc(ただし-奇妙-ではありませんcurlwget)。
スティーブHHH

はい、それは完全にarbitrary意的で愚かなことです。
13

3
ましょFOR文が始まります!
チャドハリソン

1
これは、Ubuntu 14.04(Trusty Tahr)で閉じたポートのリモートサーバー(同じLAN)で試行するとハングしました(約127秒後にタイムアウトしました)。したがって、スクリプトにはあまり適していません。ただし、ポートが開いているサービスでは機能し、0を返しました。オプション "-w2"を使用することで解決できます。
ピーターモーテンセン

1
私が思うに-G 2、TCPタイムアウトのためのより適切であろう
AB

58

のような別のツールを使用しない最も簡単な方法は、socat上記の@lornixの回答で説明されているとおりです。これは、たとえば/dev/tcp/...、コマンドラインからアクセス可能な特定のポートが別のサーバーにあるかどうかをテストする場合に、Bash内で擬似デバイスを使用する方法の実際の例を追加するためのものです。

という名前のネットワーク上にホストがあるとしますskinner

$ (echo > /dev/tcp/skinner/22) >/dev/null 2>&1 \
    && echo "It's up" || echo "It's down"
It's up

$ (echo > /dev/tcp/skinner/222) >/dev/null 2>&1 && \
    echo "It's up" || echo "It's down"
It's down

このecho > /dev/...ように括弧で囲みたいの(echo > /dev/...)は、そうしないと、接続のテストでダウンしていると、これらのタイプのメッセージが表示されるからです。

$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused

これらは/dev/null、デバイスにデータを書き込もうとする試みから来ているため、単純にリダイレクトできません/dev/tcp。したがって、サブコマンド内のすべての出力をキャプチャします。つまり、サブコマンド(...cmds...)の出力をリダイレクトします。


これは素晴らしいです。一番上まで投票されることを望みます。これを閉じる前に誤ってスクロールしてしまったため、私はこれをページのずっと下までしか読んでいません。
Still.Tony

@ Okuma.Tony-はい、それは常にQの問題であり、多くの回答があります8-)。しかし、フィードバックをありがとう、それはありがたいです。
slm

46

私はそれが見つかったcurlと同じように仕事を得ることtelnet、およびcurlさえリスナーが期待するプロトコルを教えてくれます。

への最初の引数として、ホスト名とポートからHTTP URIを作成しcurlます。curl接続できる場合、プロトコルの不一致を報告して終了します(リスナーがWebサービスでない場合)。curl接続できない場合、タイムアウトします。

たとえば、ホスト10.0.0.99のポート5672は、ファイアウォールによって閉じられているか、ブロックされています。

$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host

ただし、別のシステムからは、ホスト10.0.0.99のポート5672に到達でき、AMQPリスナーを実行しているように見えます。

$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP

異なるメッセージを区別することが重要です。最初の失敗はcurl、ポートに接続できなかったためです。2番目の失敗は成功テストですcurlが、AMQPリスナーではなくHTTPリスナーが期待されます。


5
curlが利用できない場合、wgetが利用できる可能性があります。wget -qS -O- http://ip.add.re.ss:port同じことを効果的に行う必要があります。
CVn

4
これは、ホスト名(exなど)でも機能します。curl myhost:22
에이바14

これは間違っている可能性があります。Tomcatサービスを実行していますが、404エラーが発生しています。#curl -k 192.168.194.4:6443 <html> <head> <title> Apache Tomcat / 7.0.34-エラーレポート</ title> <style> <!-H1 --- HR {color:#525D76;} -> </ style> </ head> <body> <h1> HTTPステータス404-/ </ h1> <HR size = "1" noshade = "noshade"> <p> <b> type </ b>ステータスレポート</ p> <p> <b>メッセージ</ b> <u> / </ u> </ p> <p> <b>説明</ b> <u>要求されたリソースは利用できません。 </ u> </ p> <HR size = "1" noshade = "noshade"> <h3> Apache Tomcat / 7.0.34 </ h3> </ body> </ html>

同様のアプローチで私の投稿を参照してください。
ケノーブ

12
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

それがあなたの問題を解決することを願っています:)


1
はい、これはより良いです-閉じられたポートのためにほとんどすぐにタイムアウトします。
ピーターモーテンセン

1
これは常にTCPを使用しますか、それともUDPをチェックする方法がありますか?
kmoe


6

これらの答えはどれも私には役に立たなかったので、私は丸一日苦労しました。問題は、最新バージョンのフラグがncなくなったの-zに対し、TCPを介した直接アクセス(@lornixおよび@slmによる)がホストに到達できない場合に失敗することです。私は最終的にこのページを見つけましたが最終的に1つではなく2つの実用的な例を見つけました:

  1. nc -w1 127.0.0.1 22 </dev/null

    -wフラグがタイムアウトを処理し、フラグが</dev/null置き換えられます-z

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    timeoutコマンドはタイムアウトを処理し、残りは@slmからのものです)

次に、&&and / or ||(または$?)を使用して結果を抽出します。うまくいけば、誰かがこの情報を役に立つと思うでしょう。


4

@kenorbと@Azukikuruからの回答を組み合わせて、ポートのオープン/クローズ/ファイアウォールをテストできます。

timeout 1 bash -c '</dev/tcp/127.0.0.1/22 && echo Port is open || echo Port is closed' || echo Connection timeout

ポートに到達するためのcurlを使用した別のアプローチ

curl telnet://127.0.0.1:22

3

以下は、システムにインストールされているものに応じていずれかの方法を選択する関数です。

# Check_port <address> <port> 
check_port() {
if [ "$(which nc)" != "" ]; then 
    tool=nc
elif [ "$(which curl)" != "" ]; then
     tool=curl
elif [ "$(which telnet)" != "" ]; then
     tool=telnet
elif [ -e /dev/tcp ]; then
      if [ "$(which gtimeout)" != "" ]; then  
       tool=gtimeout
      elif [ "$(which timeout)" != "" ]; then  
       tool=timeout
      else
       tool=devtcp
      fi
fi
echo "Using $tool to test access to $1:$2"
case $tool in
nc) nc -v -G 5 -z -w2 $1 $2 ;;
curl) curl --connect-timeout 10 http://$1:$2 ;;
telnet) telnet $1 $2 ;;
gtimeout)  gtimeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
timeout)  timeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
devtcp)  </dev/tcp/${1}/${2} && echo Port is open || echo Port is closed ;;
*) echo "no tools available to test $1 port $2";;
esac

}
export check_port

2

それはあなたの箱で利用可能ではないはずですが、で試してくださいnmap


4
nmap優れたツールですが、これらのシステムでは使用できません。ダウンロードnmap、コンパイル、ホームディレクトリへのインストール、他のすべてのシステムへのコピーではなく、ほとんどのLinuxインストールで利用可能な既存のツールを使用する方法を見つけたいと思っていました。
スティーブHHH

1

参照用に、@ peperunasの回答を拡張します。

nmapを使用してテストする方法は次のとおりです。

nmap -p 22 127.0.0.1

(上記の例では、デモンストレーションのためにlocalhostを使用しています)


0

システム上よりも多くテストする必要がある場合は、そのようなタスクにテストツールdda-serverspec(https://github.com/DomainDrivenArchitecture/dda-serverspec-crate)を使用できます。あなたの期待を定義することができます

{:netcat [{:host "mywebserver.com" :port "443"}
          {:host "telnet mywebserver.com" :port "80"}
          {:host "telnet mywebserver.com" :port "8443"}]}

localhostまたはリモートホスト(sshで接続)に対してこれらの期待をテストします。リモートテストの場合、ターゲットを定義する必要があります。

{:existing [{:node-name "test-vm1"
             :node-ip "35.157.19.218"}
            {:node-name "test-vm2"
             :node-ip "18.194.113.138"}]
 :provisioning-user {:login "ubuntu"}}

次のコマンドでテストを実行できます java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

ボンネットの下では、上記のようにnetcatを使用しています...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.