web-dev-qa-db-fra.com

Comment Netcat sait-il si un port UDP est ouvert?

Je peux donc utiliser cette commande netcat pour vérifier si un port UDP est ouvert:

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

Contrairement à TCP, UDP est sans connexion (tirer et oublier). Donc, à un niveau élevé, quelqu'un sait-il comment Netcat sait que le port UDP est ouvert? Demande-t-il une réponse ou quelque chose comme ça?

52
Patrick McMahon

A en juger par la sortie spécifique Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded! vous utilisez openbsd-netcat.

En regardant le code pour cela le test consiste à se lier au socket UDP, c'est-à-dire qu'il y a une connexion ouverte:

              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 génère environ 3 écritures sur le socket ouvert. Il y a une note que cela ne fonctionne pas pour IPv6 et échoue après environ 100 ports vérifiés.

Donc, bien que l'autre suggestion puisse être valable, je ne pense pas que cela se produise dans ce cas particulier.

17
rocky

En fait, ce n'est pas le cas. Vous pouvez vérifier en faisant:

$ 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!
$ 

Donc, avec UDP, ce n'est pas quelque chose que vous pouvez vraiment vérifier à moins qu'il ne vous donne des informations.

19
Sandri_Nenes

Eh bien, j'ai une opinion différente:

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.

Donc, sur cette base, vous pouvez vérifier si la connexion entre a et b sur ce port udp est possible. Plus tard, vous pourrez continuer à vérifier en utilisant tcpdump.

12
crashoverbike

Un message ICMP signale qu'un port, même UDP, est fermé. Donc, si un hôte envoie ce message, le port peut être supposé fermé.

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

9
phk