it-swarm.com.de

Woher weiß Netcat, ob ein UDP-Port geöffnet ist?

Mit diesem Befehl netcat kann ich also überprü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 (Feuer und Vergessen). Weiß also jemand auf hoher Ebene, woher Netcat weiß, dass der UDP-Port offen ist? Bittet es um eine Antwort oder so etwas?

52
Patrick McMahon

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

Betrachtet man den Code dafür , besteht der Test darin, sich an den UDP-Socket zu binden, d. H. 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 gibt ungefähr 3 Schreibvorgänge in den offenen Socket aus. Es gibt einen Hinweis, dass dies für IPv6 nicht funktioniert und fehlschlägt, nachdem etwa 100 Ports überprüft wurden.

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

17
rocky

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 es also nicht wirklich überprüfen, es sei denn, es gibt Ihnen Informationen zurück.

19
Sandri_Nenes

Nun, ich habe eine 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 an diesem udp-Port möglich ist. Später können Sie mit tcpdump weiter prüfen.

12
crashoverbike

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

9
phk