Proxy con netcat per sempre


16

Sto eseguendo il proxy di una porta del server TCP VNC con netcat. La macchina proxy esegue Linux.

Questo è il comando che uso:

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

10.1.1.116 è la macchina "remota" con il servizio VNC originale in esecuzione sulla porta 5902. Dopo questo comando il servizio VNC è disponibile su localhost per altre macchine.

Ma dopo ogni sessione VNC il "server proxy" netcat si interrompe, ed è così che funziona netcat.

Come posso fare in modo che netcat mantenga in esecuzione il "servizio proxy" dopo che una sessione VNC è stata terminata?


Per ovviare a questo problema, sto inserendo la riga di comando netcat in un loop infinito:

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

Preferirei una soluzione netcat "ufficiale" che non interrompa affatto il servizio.


Ho letto del parametro "-" ma non sono sicuro che si adatti al caso e non sono stato ancora in grado di applicarlo correttamente.


Note aggiuntive:

Ovviamente posso farlo con il tunneling ssh in diversi modi, ma volevo una soluzione senza il sovraccarico di crittografia per renderlo il più reattivo possibile per il client VNC. Una soluzione proxy diversa sarebbe OK altrimenti.

Il client deve essere VNC, non sono possibili altri protocolli.

Risposte:


24

L' -kopzione dovrebbe fare il trucco.

Dalla manpage di 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.

Ho notato che il netcat-traditionalpacchetto su Debian / Ubuntu non continua ad ascoltare come dovrebbe. In tal caso invece usa il netcat-openbsdpacchetto e riprova!

In alternativa, utilizzare socat, che è più mirato al tuo caso d'uso di un server proxy. Un esempio di forwarder TCP casuale dalla manpage di socatcui necessita ovviamente alcune modifiche.

   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.

@AlojzJanez Sì, è abbastanza ovvio, a dire il vero. Prendi l'abitudine di leggere le manpage. :)
gertvdijk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.