netcat
またはnmap
にアクセスできないため、bash
および/dev/udp/
特殊ファイルを使用してポートをテストしようとしています。
私は次のようなことをすることができます:
echo "" > /dev/udp/example.com/8000
ただし、UDPを使用する場合、$?
は常に0
になります。それはecho ""
コマンドの戻り値が正しいためだと思いますか?
私は基本的に、nmap
とnetcat
で実行できることを複製しようとしています:
nmap -sU -p 8000 example.com | grep open >/dev/null && echo 'open'
nc -z -u example.com 8000 && echo 'open'
/dev/udp
でこれをどのように実行しますか?
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ポートの状態がわかりません。
一般的にはできません。
TCPとは異なり、UDPはコネクションレスです。 TCPの場合のように何もしないで接続するだけでは、ポートが開いていることを検出できません。むしろ、データをポートに送信して何が起こるかを確認する必要があり、現実の世界で実装されているUDPの詳細により、結果の解釈が困難になります。 nmap
のような高度なパケットレベルのツールでさえ、特定のUDPポートをリッスンするプログラムがあるかどうかを確実に判断することはできません。 nmap
は、UDPポートを3つのグループに分類します。
nmap
は応答を取得する方法を理解していません。たぶん、ユーザーが不運になって、すべてのパケットが送信中に失われたのかもしれません。