Woher weiß netcat, ob ein UDP-Port offen ist?

49

Mit diesem Befehl kann ich prüfen, ob ein UDP-Port geöffnet ist:

$  nc -vz -u 10.1.0.100 53
Connection to 10.1.0.100 53 port [udp/domain] succeeded!

Im Gegensatz zu TCP ist UDP verbindungslos (fire and forget). Weiß jemand auf hohem Niveau, wie netcat weiß, dass der UDP-Port offen ist? Bittet es um eine Antwort oder so?

Patrick McMahon
quelle

Antworten:

17

Gemessen an der spezifischen Ausgabe verwenden Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!Sie openbsd-netcat.

Betrachtet man den Code dafür, soll der Test an den UDP-Socket binden, dh es besteht eine offene Verbindung:

              if (vflag || zflag) {
                            /* For UDP, make sure we are connected. */
                            if (uflag) {
                                    if (udptest(s) == -1) {
                                            ret = 1;
                                            continue;
                                    }
                            }

                            /* Don't look up port if -n. */
                            if (nflag)
                                    sv = NULL;
                            else {
                                    sv = getservbyport(
                                        ntohs(atoi(portlist[i])),
                                        uflag ? "udp" : "tcp");
                            }

                            fprintf(stderr,
                                "Connection to %s %s port [%s/%s] "
                                "succeeded!\n", host, portlist[i],
                                uflag ? "udp" : "tcp",
                                sv ? sv->s_name : "*");

udptest Probleme um 3 schreibt an den offenen Socket. Es gibt einen Hinweis, dass dies für IPv6 nicht funktioniert und nach etwa 100 überprüften Ports fehlschlägt.

Obwohl der andere Vorschlag gültig sein mag, glaube ich nicht, dass dies in diesem speziellen Fall passiert.

felsig
quelle
So udptestist die Funktion, die ich suche und die meine Frage beantwortet. Über den von Ihnen angegebenen Link "* udptest () * Schreibe ein paar Mal, um festzustellen, ob der UDP-Port vorhanden ist"
Patrick McMahon,
Ja, ich habe das gerade überprüft und auch die Schriften gesehen. Überarbeitete Antwort.
Rocky
@PatrickMcMahon - Wenn dies Ihre Frage beantwortet, akzeptieren Sie sie, indem Sie auf das große Häkchen klicken.
cas
17

In der Tat nicht. Sie können Folgendes überprüfen:

$ nc -vz -u 8.8.8.8 53 
Connection to 8.8.8.8 53 port [udp/domain] succeeded!
$ nc -vz -u 8.8.8.8 54
Connection to 8.8.8.8 54 port [udp/*] succeeded!
$ nc -vz -u 8.8.8.8 59
Connection to 8.8.8.8 59 port [udp/*] succeeded!
$ 

Mit UDP können Sie das also nicht wirklich überprüfen, es sei denn, es gibt Ihnen Informationen zurück.

Sandri_Nenes
quelle
9

Es gibt eine ICMP-Nachricht, die signalisiert, dass ein Port, auch ein UDP-Port, geschlossen ist. Wenn also ein Host diese Nachricht sendet, kann davon ausgegangen werden, dass der Port geschlossen ist.

https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable

phk
quelle
4
Beachten Sie, dass Sie einen offenen Port von einem Firewall-Port nicht zuverlässig von einem verlorenen Paket unterscheiden können, da UDP verbindungslos ist.
Mark
Sehr richtig. Und theoretisch wäre es auch möglich, dass man das Paket bekommt und der Port nicht wirklich geschlossen ist.
Phk
9

Naja ich hab andere meinung:

a:~# nc -luk 10.12.0.12 667 // listen on UDP port 667
b:~# nc -uv 10.12.0.12 667  // check if port is open 
nc: 10.12.0.12 (10.12.0.12) 667 [667] open
I love stackexchange // send a message
a:~# nc -luk 10.12.0.12 667
I love stackexchange // receive the message.

Auf dieser Grundlage können Sie überprüfen, ob die Verbindung zwischen a und b auf diesem UDP-Port möglich ist. Später können Sie die Überprüfung mit tcpdump fortsetzen.

Crashoverbike
quelle
1
Ah ja das gefällt mir. Auf diese Weise können Sie testen, ob Sie Zugriff auf beide Knoten haben. Ich denke, als ich die Frage stellte, wollte ich wissen, wie man eine Black Box testet oder einen externen Knoten prüft. Die Ergebnisse dieser Vorgehensweise können von netcat nicht garantiert werden.
Patrick McMahon
Könnten Sie bitte die IP-Adresse erweitern 10.12.0.12? Warum wird es auf beiden Computern verwendet?
Sopalajo de Arrierez