¿Cómo sabe netcat si un puerto UDP está abierto?

49

Entonces puedo usar este comando netcat para verificar si un puerto UDP está abierto:

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

A diferencia de TCP, UDP no tiene conexión (dispara y olvida). Entonces, en un nivel alto, ¿alguien sabe cómo netcat sabe que el puerto UDP está abierto? ¿Pide una respuesta o algo así?

Patrick McMahon
fuente

Respuestas:

17

A juzgar por el resultado específico Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!que está utilizando openbsd-netcat.

Mirando el código para eso, la prueba es enlazar al socket UDP, es decir, hay una conexión abierta:

              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 emite alrededor de 3 escrituras en el socket abierto. Hay una nota de que esto no funciona para IPv6 y falla después de verificar alrededor de 100 puertos.

Entonces, aunque la otra sugerencia puede ser válida, no creo que eso esté sucediendo en este caso particular.

rocoso
fuente
también lo udptestes la función que estoy buscando y responde a mi pregunta. Desde el enlace que proporcionó "* udptest () * Haga algunas escrituras para ver si el puerto UDP está allí"
Patrick McMahon
Sí, acabo de comprobar eso y también vi las escrituras. Respuesta revisada.
rocoso
@PatrickMcMahon: si esto responde a su pregunta, acéptela haciendo clic en la marca grande.
cas
17

De hecho, no lo hace. Puede verificar haciendo:

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

Entonces, con UDP, no es algo que realmente pueda verificar a menos que le devuelva información.

Sandri_Nenes
fuente
9

Hay un mensaje ICMP para indicar que un puerto, incluso uno UDP, está cerrado. Entonces, si un host envía este mensaje, se puede suponer que el puerto está cerrado.

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

phk
fuente
44
Tenga en cuenta que debido a que UDP no tiene conexión, no puede distinguir de manera confiable un puerto abierto de un puerto con firewall de un paquete perdido.
Mark
Muy cierto. Y, en teoría, también sería posible que obtenga el paquete y el puerto no esté realmente cerrado.
phk
9

Bueno, tengo una opinión diferente:

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.

Entonces, basándose en eso, puede verificar si la conexión entre ayb en ese puerto udp es posible. Más adelante puede continuar verificando usando tcpdump.

crashoverbike
fuente
1
Ah si, me gusta esto. Es una buena forma de probar si tiene acceso a ambos nodos. Supongo que cuando hacía la pregunta me dirigía a "cómo probar una caja negra" o a sondear un nodo externo. Los resultados de hacer exactamente eso, netcat no puede garantizar.
Patrick McMahon
¿Podría ampliar la dirección IP 10.12.0.12? ¿Por qué se usa en ambas computadoras?
Sopalajo de Arrierez