bashの `/ dev / udp`を使用して、ポートが開いているかどうかを知るにはどうすればよいですか?


14

私はへのアクセス権がありません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ますか?


1
UDPは配信を保証しないため、bashがメッセージの送信に成功したと判断した場合でも、メッセージは途中で破棄された可能性があります。失敗した送信をテストした方法(失敗した接続ではなく、UDPは接続ではありません)?
ジル 'SO-悪であるのをやめる'

回答:


13

tcpの場合は、単にチェックし$?ます。接続に失敗した場合、次の$?ようにはなりません0

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

bash接続が失敗したことを認識するまで時間がかかります。タイムアウトを使用してトリガーできますbash

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

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

厳密に言えば、udpにはオープン状態はありません(もちろん、udpはステートレスプロトコルです)。udpの状態は、listenまたはnotの 2つのみです。状態がそうでない場合、ICMP Destination Unreachableを取得します

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


UDPに焦点を当てるように私の質問を言い換えました。忍者の編集に対する私の謝罪。私はそれが似ていると思ったので、区別しませんでした。それを片付けてくれてありがとう。
ベルミンフェルナンデス

10

一般的にはできません。

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

  1. 間違いなく開いています。ポートにパケットを送信すると、宛先マシンからデータ応答が引き出されました。
  2. 間違いなく閉じた。ポートにパケットを送信すると、宛先マシンから「ICMP Destination Unreachable」メッセージが出されました。
  3. 開くか、フィルタリングします。ポートにパケットを送信しても応答がまったくありませんでした。パケットをドロップしているファイアウォールがあるかもしれません。リスニングするプログラムがありnmap、応答を取得する方法を理解していないだけかもしれません。たぶん、ユーザーが不運になり、すべてのパケットが転送中に失われた可能性があります。

についての素晴らしい情報nmap。おかげで、これは多くの混乱を明らかにしています。
ベルミンフェルナンデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.