Proxy avec netcat pour toujours

16

Je procède au proxy d'un port de serveur TCP VNC avec netcat. La machine proxy exécute linux.

Voici la commande que j'utilise:

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

10.1.1.116 est la machine "distante" avec le service VNC d'origine exécuté sur le port 5902. Après cette commande, le service VNC est disponible sur localhost pour les autres machines.

Mais après chaque session VNC, le "serveur proxy" netcat s'arrête, c'est ainsi que fonctionne netcat.

Comment puis-je faire en sorte que netcat continue de faire fonctionner le "service proxy" après la fin d'une session VNC?


Pour contourner ce problème, je mets la ligne de commande netcat dans une boucle infinie:

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

Mais je préférerais une solution netcat "officielle" qui n'interrompt pas du tout le service.


J'ai lu sur le paramètre "-" mais je ne sais pas si cela correspond au cas et je n'ai pas encore pu l'appliquer correctement.


Remarque additionnelle:

Bien sûr, je peux le faire avec le tunneling ssh de différentes manières, mais je voulais une solution sans surcharge de chiffrement pour la rendre aussi réactive que possible pour le client VNC. Sinon, une autre solution proxy serait OK.

Le client doit être VNC, aucun autre protocole n'est possible.

Alojz Janez
la source

Réponses:

24

L' -koption devrait faire l'affaire.

Depuis la page de manuel 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.

J'ai remarqué que le netcat-traditionalpaquet sur Debian / Ubuntu ne continue pas à écouter comme il se doit. Dans ce cas, utilisez netcat-openbsdplutôt le package et réessayez!

Vous pouvez également utiliser socat, qui est plus ciblé sur votre cas d'utilisation d'un serveur proxy. Un exemple de TCP-forwarder aléatoire de la page de manuel socatqui nécessite bien sûr quelques modifications.

   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
la source
@AlojzJanez Oui, c'est assez évident, pour être honnête. Faites de la lecture des pages de manuel une habitude. :)
gertvdijk