Netcat deja de escuchar el tráfico UDP

8

Estoy usando netcat en algunas máquinas Linux (vea esta otra pregunta ), pero veo un comportamiento inesperado.

A diferencia de la guía en la respuesta aceptada, no estoy usando el túnel UDP para hacer consultas DNS. Tengo un servidor remoto en el que puedo iniciar sesión, pero no instalar el software, y estoy tratando de canalizar el tráfico UDP desde mi computadora al servidor, y luego configurar un túnel separado para enviar respuestas UDP desde el servidor a mi máquina .

El túnel que va de mi máquina al servidor funciona perfectamente, sin embargo, en el lado del servidor, la instancia de netcat que está escuchando la respuesta del servidor UDP cerrará el escucha después de recibir la primera respuesta. Por lo tanto, puedo enviar una solicitud y obtener 1 respuesta, pero cualquier solicitud posterior lo hace al servidor, pero las respuestas no se reciben. Usando netstat puedo ver que antes de que se reciba la respuesta, netcat está escuchando, pero el puerto se cierra después de recibir la respuesta.

La instancia de netcat en mi máquina parece manejar todo bien. Ambas máquinas ejecutan netcat v1.10-38. ¿Alguna idea de lo que está pasando?

pesado
fuente

Respuestas:

2

Entonces hay varias cosas llamadas netcat; ubuntu incluso tiene / etc / alternativas symbolic-link-hackery para ello.

Creo que parte de su problema es que UDP no hace sesiones; He copiado en parte el archivo /usr/share/doc/netcat-traditional/README.gz a continuación, que explica muy bien.

Las conexiones UDP se abren en lugar de TCP cuando se especifica -u. Estas no son realmente "conexiones" per se ya que UDP es un protocolo sin conexión, aunque netcat usa internamente el mecanismo de "socket UDP conectado" que la mayoría de los núcleos soportan. Aunque netcat afirma que una conexión UDP saliente está "abierta" inmediatamente, no se envían datos hasta que se lee algo de la entrada estándar. Solo después de eso es posible determinar si realmente hay un servidor UDP en el otro extremo, y a menudo simplemente no se puede saber. La mayoría de los protocolos UDP utilizan tiempos de espera y reintentos para hacer lo suyo y, en muchos casos, no se molestarán en responder, por lo que debe especificar un tiempo de espera y esperar lo mejor.

De acuerdo, tal vez esa no sea una gran explicación, pero es lo que pude encontrar.

Si aún no lo ha hecho, es posible que desee experimentar con cualquier opción de netcat que pueda encontrar que tenga que ver con esperar ... ¿ha experimentado con:

  • usando -l y -u para asegurarse de que está en modo "escucha"

  • -vv para ver exactamente qué está pasando

  • -q -1 ... que debería "esperar para siempre" incluso después de recibir EOF (con suerte, ¿escuchando de nuevo?)

pbr
fuente
55
así que esta es una respuesta aceptada ahora, pero no sabemos cuáles de los consejos resultaron útiles :(
törzsmókus
2

Puedes usar socatpara eso. Tiene muy buena opción fork:

fork Después de establecer una conexión, maneja su canal en un proceso hijo y mantiene el proceso padre intentando producir más conexiones, ya sea escuchando o conectándose en un bucle (ejemplo).

Cliente (sí, esto se ejecuta desde el cliente):

$ ssh -L 7753:localhost:7753 YourServer.com "/usr/bin/socat tcp4-listen:7753,reuseaddr,fork UDP:8.8.8.8:53"

Cliente:

$ sudo socat udp4-listen:53,reuseaddr,fork tcp:localhost:7753
$ dig @127.0.0.1 google.com
Andrey Arapov
fuente