Proxy com netcat para sempre

16

Estou proxy de uma porta do servidor TCP VNC com o 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 para, e é assim que o netcat funciona.

Como posso fazer com que o netcat mantenha o "serviço proxy" em execução após o encerramento de uma sessão VNC?


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.


Eu li sobre o parâmetro "-", mas não tenho certeza se isso se encaixa no caso e ainda não foi possível aplicá-lo corretamente.


Observações adicionais:

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

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

Alojz Janez
fonte

Respostas:

24

A -kopção 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.

Notei que o netcat-traditionalpacote no Debian / Ubuntu não fica ouvindo como deveria. Nesse caso, use o netcat-openbsdpacote e tente novamente!

Como alternativa, use socat, que é mais direcionado à sua base de dados de um servidor proxy. Um exemplo aleatório de encaminhador de TCP, da página de manual, socatque 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.
gertvdijk
fonte
@AlojzJanez Sim, é meio óbvio, para ser honesto. Faça das páginas de leitura um hábito. :)
gertvdijk