Woher weiß ich mit bashs `/ dev / udp`, ob der Port offen ist?

14

Ich habe keinen Zugriff auf netcatoder nmapso, ich versuche, bashund die /dev/udp/speziellen Dateien zu verwenden, um Ports zu testen.

Ich könnte etwas machen wie:

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

Ist $?aber immer 0bei Verwendung von UDP. Ich nehme an, das liegt daran, dass der Rückgabewert des echo ""Befehls korrekt ist.

Ich versuche im Grunde zu replizieren, was ich kann nmapund netcat:

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

Wie würde ich das machen /dev/udp?

Belmin Fernandez
quelle
1
UDP garantiert keine Zustellung. Selbst wenn Bash glaubt, dass die Nachricht erfolgreich gesendet werden konnte, wurde die Nachricht möglicherweise unterwegs zerstört. Wie haben Sie einen fehlgeschlagenen Sendevorgang getestet (keine fehlgeschlagene Verbindung: UDP ist keine Verbindung)?
Gilles 'SO- hör auf böse zu sein'

Antworten:

13

Für TCP nur überprüfen $?. Wenn die Verbindung fehlschlägt, $?wird nicht 0:

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

Es wird einige Zeit dauern, bashbis Sie feststellen, dass die Verbindung fehlgeschlagen ist. Sie können Timeout verwenden , um Folgendes auszulösen bash:

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

Udp port zu testen ist komplexer.

Genau genommen gibt es bei udp keinen offenen Zustand (natürlich ist udp ein zustandsloses Protokoll). Es gibt nur zwei Zustände mit udp, die zuhören oder nicht . Ist dies nicht der Fall, erhalten Sie ein ICMP-Ziel, das nicht erreichbar ist .

Leider lassen Firewall oder Router diese ICMP-Pakete häufig fallen, sodass Sie nicht sicher sind, welchen Status der UDP-Port hat.

cuonglm
quelle
Ich habe meine Frage umformuliert, um mich auf UDP zu konzentrieren. Ich entschuldige mich für die Ninja-Bearbeitung. Ich dachte, es wäre ähnlich, also machte ich keinen Unterschied. Vielen Dank für die Aufklärung.
Belmin Fernandez
10

Im Allgemeinen können Sie nicht.

Im Gegensatz zu TCP ist UDP verbindungslos. Sie können nicht erkennen, dass ein Port offen ist, indem Sie einfach eine Do-Nothing-Verbindung zu ihm herstellen, wie Sie es mit TCP können. Stattdessen müssen Sie Daten an den Port senden, um zu sehen, was passiert, und die in der realen Welt implementierten Details von UDP erschweren die Interpretation der Ergebnisse. Selbst hochentwickelte Tools auf Paketebene wie nmapkönnen nicht mit Sicherheit sagen, ob ein Programm einen bestimmten UDP-Port abhört. nmapklassifiziert UDP-Ports in drei Gruppen:

  1. Auf jeden Fall offen. Das Senden eines Pakets an den Port löste eine Datenantwort vom Zielcomputer aus.
  2. Auf jeden Fall geschlossen. Das Senden eines Pakets an den Port löste eine "ICMP Destination Unreachable" -Nachricht vom Zielcomputer aus.
  3. Entweder offen oder gefiltert. Das Senden eines Pakets an den Port löste überhaupt keine Antwort aus. Vielleicht gibt es eine Firewall, die die Pakete fallen lässt. Vielleicht gibt es ein Programm, das zuhört und nmapnur nicht herausgefunden hat, wie man eine Antwort bekommt. Vielleicht hatte der Benutzer gerade Pech und alle Pakete gingen während des Transports verloren.
Kennzeichen
quelle
Tolle Informationen über nmap. Vielen Dank, das klärt viel Verwirrung.
Belmin Fernandez