Probar la conectividad del puerto UDP

37

Estoy tratando de probar si puedo llegar a un puerto en particular en un servidor remoto (a los cuales tengo acceso) a través de UDP.

Ambos servidores tienen conexión a internet. Estoy usando netcat para tener un cierto puerto de escucha.

Luego uso nmap para verificar si ese puerto está abierto, pero no parece estarlo.

Iptables está desactivado.

¿Alguna sugerencia de por qué esto podría ser? Eventualmente voy a configurar un túnel VPN, pero debido a que soy muy nuevo en túneles, quiero asegurarme de tener conectividad en el puerto UDP 1194 antes de avanzar.

Bloquear
fuente
Respondí a la pregunta "Probar la conectividad del puerto UDP". Pero sugiero concentrarse en la parte más específica de "asegurarme de que OpenVPN reciba mis paquetes UDP", que podría lograrse fácilmente mirando los registros de OpenVPN.
Luke404

Respuestas:

46

No existe un puerto UDP "abierto", al menos no en el sentido en que la mayoría de la gente está acostumbrada a pensar (que responde algo como "OK, he aceptado tu conexión"). UDP no requiere sesión, por lo que "un puerto" (léase: el protocolo UDP en la pila de IP del sistema operativo) nunca responderá "éxito" por sí solo.

Los puertos UDP solo tienen dos estados: escuchar o no. Eso generalmente se traduce en "tener un socket abierto por un proceso" o "no tener ningún socket abierto". El último caso debería ser fácil de detectar ya que el sistema debería responder con un paquete ICMP de destino inalcanzable con código = 3 (puerto inalcanzable). Desafortunadamente, muchos servidores de seguridad podrían eliminar esos paquetes, por lo que si no recupera nada, no está seguro si el puerto está en este estado o no. Y no olvidemos que ICMP tampoco requiere sesión y no realiza retransmisiones: el paquete Port Unreachable podría perderse en algún lugar de la red.

Es posible que un puerto UDP en estado de "escucha" no responda (el proceso que escucha solo recibe el paquete y no transmite nada) o podría enviar algo de regreso (si el proceso actúa en la recepción y si actúa por respondiendo vía UDP a la IP del remitente original: puerto). De nuevo, nunca se sabe con seguridad cuál es el estado si no se recupera nada.

Dice que puede tener control del host receptor: eso le permite construir su propio protocolo para verificar la accesibilidad del puerto UDP: simplemente coloque un proceso en el host receptor que escuche en el puerto UDP dado y responda (o le envíe un correo electrónico, o simplemente enloquecer y unlink()todo en el sistema de archivos host ... cualquier cosa que llame su atención servirá).

Lucas404
fuente
Creo que lo estoy entendiendo ahora. Entonces, un netstat en el servidor con el puerto udp de escucha nunca mostrará el host remoto ... ¿Solo un tcpdump debería mostrar las solicitudes remotas?
Bloqueo de
Tanto netstat como tcpdump tienen la capacidad de volcar datos sobre usted, este último en una forma más legible para los humanos. Consulte sus páginas de manual para más detalles.
Luke404
56

Para probar si el puerto udp responde, use netcat.

Un ejemplo de la página del manual :

nc -v -u -z -w 3 example.host 20-30
    Send UDP packets to ports 20-30 of example.host, and report which ones
    did not respond with an ICMP packet after three seconds.

Por supuesto, si se está ejecutando un firewall DROP, que normalmente es el caso cuando se trata de puertas de enlace con conexión a Internet, no recibirá una respuesta ICMP.

motobói
fuente
1
Esta respuesta me dio un falso positivo, donde, en contraste, la respuesta de Sasha muestra lo que espero.
texas-bronius el
@ texas-bronius Si tiene acceso al otro servidor, probablemente sea mejor hacerlo a la manera de Sasha
motobói
27
  1. ambos en cliente y servidor instalan nc: yum install nc(para centos)
  2. en el servidor escucha el puerto UDP: nc -ul 6111
  3. en el cliente nc -u <server> 6111
  4. escriba cualquier cosa en el cliente y presione enter - debería ver este texto en el servidor

Nota: Cuando ejecuta el nc -ulcomando en el servidor, solo se conectará para la primera conexión que llegue a él. No puedo, como descubrí, cambiar entre servidores haciendo ping sin parar y reiniciar nc -ul. De hecho, si ^ C detiene el cliente ( nc -u ...), tampoco puede reiniciar el cliente sin primero reiniciar el servidor de escucha.

Sasha
fuente
1
Me gusta esta respuesta inteligente, porque alimenta mis propios entendimientos (¡y malentendidos!) De cómo UDP es "enviar y olvidar" y toda confirmación solo puede obtenerse de la configuración adecuada. Demasiados factores Esta respuesta proporciona una llamada y respuesta realmente simple y definitiva que funciona o no funciona, cambia la configuración, enjuaga y repite.
texas-bronius el
10

Probar los puertos UDP abiertos con nmap está lleno de peligros: no hay un apretón de manos de tres vías para indicar apertura. A menos que el proceso de escucha responda a lo que nmap envíe, no hay forma de que nmap diferencie entre un puerto abierto que no responde y un puerto filtrado.

Mucho más fácil es escuchar en un extremo con netcat y usar netcat en el otro extremo para enviar paquetes, y ver que llegan al otro extremo. Hazlo en ambos sentidos, solo asegúrate. También puede tcpdumpver los paquetes llegando a donde deben ir.

womble
fuente
Ya veo ... Entonces, ¿cómo sabe nmap exactamente un puerto abierto? ¿Envía datos a ese puerto y si recibe una respuesta, se considera abierto? Usaré una combinación de tcpdump y netcat. Gracias por su respuesta bien explicada.
Bloqueo
2

Puede escanear puertos udp utilizando el siguiente comando

nmap -sU -v <hostname or ip>
Koray Güclü
fuente
1

Puede hacer esto con netcat(nc) o iperf, suponiendo que tenga otra máquina para probar fuera de la red. Mi elección sería un nmapescaneo UDP desde un sistema fuera de su entorno. ¿Cuál fue su línea de comando nmap? ¿Hay algún firewall de hardware u otros dispositivos en la mezcla?

ewwhite
fuente
1

Tengo un enfoque simple. Si el servidor UDP no devuelve los datos esperados, simplemente dejo de recopilar dgrams, suponiendo que se haya apagado:

LINE: while(1)
{
    my $line;
    my $flags;

    local $SIG{ALRM} = sub {die "exceeded timeout for recv"};
    alarm 5;
    eval {
        $socket->recv($line,2024,$flags);
    };

    unless($line =~ /\{.*\}/){
        if($verbose){
            print STDERR "Invalid or empty dgram:\n",'"', $line, '"',"\n";
        }

        last LINE;
    }
}
David Waddell
fuente