Proxy con netcat para siempre

16

Estoy representando un puerto del servidor TCP VNC con netcat. La máquina proxy ejecuta Linux.

Este es el comando que uso:

mkfifo backpipe
nc -l 5902  0<backpipe | nc 10.1.1.116 5902 1>backpipe

10.1.1.116 es la máquina "remota" con el servicio VNC original ejecutándose en el puerto 5902. Después de este comando, el servicio VNC está disponible en localhost para otras máquinas.

Pero después de cada sesión de VNC, el "servidor proxy" de netcat se detiene, así es como funciona netcat.

¿Cómo puedo hacer que netcat mantenga el "servicio proxy" ejecutándose después de que se finalizó una sesión de VNC?


Como solución alternativa, estoy poniendo la línea de comando netcat en un bucle infinito:

mkfifo backpipe
while true; do   nc -l 5902  0<backpipe | nc 10.1.1.116 5902 1>backpipe; done

Pero preferiría una solución netcat "oficial" que no interrumpa el servicio en absoluto.


He leído sobre el parámetro "-" pero no estoy seguro de si esto se ajusta al caso y aún no pude aplicarlo correctamente.


Observaciones adicionales:

Por supuesto, puedo hacer esto con el túnel ssh de diferentes maneras, pero quería una solución sin la sobrecarga de cifrado para que sea lo más sensible posible para el cliente VNC. Una solución proxy diferente estaría bien de lo contrario.

El cliente debe ser VNC, no hay otros protocolos posibles.

Alojz Janez
fuente

Respuestas:

24

La -kopción debería hacer el truco.

De la página de manual de nc(1):

 -k      Forces nc to stay listening for another connection after its
         current connection is completed.  It is an error to use this
         option without the -l option.

He notado que el netcat-traditionalpaquete en Debian / Ubuntu no sigue escuchando como debería. En ese caso, utilice el netcat-openbsdpaquete y vuelva a intentarlo.

Alternativamente, use socat, que está más dirigido a su caso de uso de un servidor proxy. Un ejemplo de reenviador TCP aleatorio de la página de manual del socatcual necesita algunas modificaciones, por supuesto.

   socat -d -d -lmlocal2 \
   TCP4-LISTEN:80,bind=myaddr1,reuseaddr,fork,su=nobody,range=10.0.0.0/8 \
   TCP4:www.domain.org:80,bind=myaddr2

          TCP  port  forwarder,  each  side  bound to another local IP
          address (bind). This example  handles  an  almost  arbitrary
          number  of parallel or consecutive connections by fork'ing a
          new process after each accept() . It provides a little secu‐
          rity by su'ing to user nobody after forking; it only permits
          connections from the private  10  network  (range);  due  to
          reuseaddr,   it   allows   immediate  restart  after  master
          process's termination, even if some child  sockets  are  not
          completely  shut down.  With -lmlocal2, socat logs to stderr
          until successfully reaching the accept loop. Further logging
          is directed to syslog with facility local2.
gertvdijk
fuente
@AlojzJanez Sí, es algo obvio, para ser honesto. Haga de la lectura de las páginas del manual un hábito. :)
gertvdijk