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?

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.


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.


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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.