web-dev-qa-db-ja.com

bashの `/ dev / udp`を使用して、ポートが開いているかどうかはどうすればわかりますか?

netcatまたはnmapにアクセスできないため、bashおよび/dev/udp/特殊ファイルを使用してポートをテストしようとしています。

私は次のようなことをすることができます:

echo "" > /dev/udp/example.com/8000

ただし、UDPを使用する場合、$?は常に0になります。それはecho ""コマンドの戻り値が正しいためだと思いますか?

私は基本的に、nmapnetcatで実行できることを複製しようとしています:

nmap -sU -p 8000 example.com | grep open >/dev/null && echo 'open'
nc -z -u example.com 8000 && echo 'open'

/dev/udpでこれをどのように実行しますか?

14

Tcpの場合、$?をチェックするだけです。接続に失敗した場合、$?0にはなりません。

$ >/dev/tcp/google.com/81
bash: connect: Network is unreachable
bash: /dev/tcp/google.com/81: Network is unreachable
$ echo $?
1

接続が失敗したことをbashが認識するまでには時間がかかります。 timeout を使用してbashをトリガーできます:

$ timeout 1 bash -c '>/dev/tcp/google.com/80' &&
  echo Port open ||
  echo Port close
Port open

Udpポートのテストはより複雑です。

厳密に言えば、udpにはopen状態はありません(もちろん、udpはstatelessプロトコルです)。 udpの状態は、listeningまたはnotの2つだけです。状態がnotの場合、 ICMP Destination Unreachable を取得します。

残念ながら、ファイアウォールまたはルーターはこれらのICMPパケットをドロップすることが多いため、udpポートの状態がわかりません。

13
cuonglm

一般的にはできません。

TCPとは異なり、UDPはコネクションレスです。 TCPの場合のように何もしないで接続するだけでは、ポートが開いていることを検出できません。むしろ、データをポートに送信して何が起こるかを確認する必要があり、現実の世界で実装されているUDPの詳細により、結果の解釈が困難になります。 nmapのような高度なパケットレベルのツールでさえ、特定のUDPポートをリッスンするプログラムがあるかどうかを確実に判断することはできません。 nmapは、UDPポートを3つのグループに分類します。

  1. 絶対に開いています。パケットをポートに送信すると、宛先マシンからのデータ応答が誘発されました。
  2. 完全に閉鎖されています。パケットをポートに送信すると、宛先マシンから「ICMP Destination Unreachable」メッセージが引き出されました。
  3. 開くか、フィルタリングします。パケットをポートに送信しても、何の応答もありませんでした。たぶん、パケットをドロップしているファイアウォールがあるかもしれません。多分聞いているプログラムがあり、nmapは応答を取得する方法を理解していません。たぶん、ユーザーが不運になって、すべてのパケットが送信中に失われたのかもしれません。
10
Mark