2013-07-19 16:54:10 +0000 2013-07-19 16:54:10 +0000
369
369

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

昔は、リモートホストのポートが開いているかどうかを確認するために telnet を使用していました。telnet hostname port はどのホストのどのポートにも接続しようとし、生の TCP ストリームにアクセスできるようにしていました。

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

リモートシステムのポートが開いているかどうかをテストする別の方法はありますか?

回答 (13)

418
418
418
2013-12-03 21:34:41 +0000

冗長でナイス! マニュアルページから。 シングルポート:

nc -zv 127.0.0.1 80

複数のポート:

nc -zv 127.0.0.1 22 80 8080

ポートの範囲:

nc -zv 127.0.0.1 20-30
297
297
297
2013-07-22 10:37:11 +0000

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

Taa Daa!

104
104
104
2013-07-19 18:07:26 +0000

Netcatは便利なツールです:

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

ポート123が開いていれば0を、閉じていれば1を出力します。

61
61
61
2014-09-02 17:59:36 +0000

socat のような他のツールを使わない最も簡単な方法は、上の @lornix の回答にあるような方法です。これは、例えば他のサーバがコマンドラインからアクセス可能なポートを持っているかどうかをテストしたい場合に、Bash の中でどのようにして psuedo-device /dev/tcp/... を利用するかの実際の例を追加したものです。

Examples

私のネットワーク上に 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/...) の中に取り込み、サブコマンドの出力をリダイレクトします。

48
48
48
2013-07-19 17:05:30 +0000

私が見つけたのは、curltelnetと似たような方法で仕事をしてくれるかもしれないということと、curlはリスナーがどのプロトコルを期待しているのかさえ教えてくれるということです。もし curl が接続できた場合、プロトコルの不一致を報告して終了します (リスナーがウェブサービスでない場合)。

例えば、ホスト10.0.0.99のポート5672は、ファイアウォールによって閉じられているかブロックされています。 0.0.0.99に到達することができ、AMQPリスナーを実行しているように見えます。最初の失敗は、curlがポートに接続できなかったためである。2番目の失敗は成功テストであるが、curlはAMQPリスナーではなくHTTPリスナーを期待していた。

13
13
13
2015-06-02 06:27:59 +0000
[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!

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

11
11
11
2016-03-16 11:21:40 +0000

ここにワンライナーがあります:

</dev/tcp/localhost/11211 && echo Port is open || echo Port is closed

&001

(https://superuser.com/a/622641/87805)で説明されているBash構文を使用しています。詳細については、[ 上級バッシュスクリプトガイド: 第29章。

8
8
8
2017-05-31 08:45:09 +0000

これらの回答のどれも私には効きそうになかったので、丸一日苦戦していました。問題は、ncの最新バージョンにはもはや-zフラグがなく、TCP経由での直接アクセスは(@lornixと@slmによると)ホストに到達できない場合に失敗するということです。私は最終的に このページ を見つけました。そこには、1つではなく two の作業例があります。うまくいけば、誰かがこの情報が役に立つことに気づくでしょう。

6
6
6
2018-08-10 12:20:04 +0000

Kenorb と @Azukikuru の答えを組み合わせることで、ポートのオープン/クローズ/ファイアウォールをテストすることができます。

4
4
4
2019-02-12 20:21:11 +0000

ここでは、システムにインストールされているものに応じてメソッドを選択する関数があります:

# 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
2
2
2013-07-19 17:01:16 +0000

お使いの箱では使えないはずですが、nmapで試してみてください。

1
1
1
2019-08-07 23:17:13 +0000

参考までに、@peperunasさんの回答を展開します:

テストにnmapを使用する方法は、次のとおりです:

nmap -p 22 127.0.0.1

(上記の例ではデモのためにlocalhostを使用しています)

0
0
0
2018-10-26 13:49:54 +0000

システム以外のテストが必要な場合は、テストツール 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"}]}

を定義し、ローカルホストまたはリモートホスト (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

で実行することができます。

関連する質問

6
10
3
12
5