Proxy com netcat para sempre

15

Estou fazendo proxy de uma porta de servidor TCP VNC com netcat. A máquina proxy executa o linux.

Este é o comando que eu uso:

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

10.1.1.116 é a máquina "remota" com o serviço VNC original em execução na porta 5902. Após esse comando, o serviço VNC está disponível no host local para outras máquinas.

Mas após cada sessão do VNC, o "servidor proxy" do netcat pára, e é assim que o netcat funciona.

Como posso fazer com que o netcat mantenha o "serviço de proxy" em execução depois que uma sessão do VNC foi encerrada?

Como solução alternativa, estou colocando a linha de comando netcat em um loop infinito:

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

Mas eu preferiria uma solução netcat "oficial" que não interrompa o serviço.

Li sobre o parâmetro "-", mas não tenho certeza se isso se encaixa no caso e ainda não consegui aplicá-lo corretamente.

Observações adicionais:

É claro que posso fazer isso com tunelamento ssh de maneiras diferentes, mas queria uma solução sem a sobrecarga de criptografia para torná-la o mais responsiva possível para o cliente VNC. Uma outra solução proxy seria OK.

O cliente tem que ser VNC, nenhum outro protocolo é possível.

    
por Alojz Janez 12.12.2012 / 15:02

1 resposta

22

A opção -k deve fazer o truque.

Na 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.

Eu notei que o pacote netcat-traditional no Debian / Ubuntu não fica escutando como deveria. Nesse caso, use o pacote netcat-openbsd e tente novamente!

Como alternativa, use socat , que é mais direcionado ao seu uso de um servidor proxy. Um exemplo de TCP-forwarder aleatório da página manpage de socat , que precisa de algumas modificações, é claro.

   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.
    
por 12.12.2012 / 15:05