Serwer proxy z netcat na zawsze

16

Pośredniczę w serwerze VNC TCP z serwerem Netcat. Maszyna proxy działa pod Linuksem.

Oto polecenie, której używam:

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

10.1.1.116 to „zdalna” maszyna z oryginalną usługą VNC działającą na porcie 5902. Po tym poleceniu usługa VNC jest dostępna na hoście lokalnym dla innych komputerów.

Ale po każdej sesji VNC „serwer proxy” netcat zatrzymuje się, tak działa netcat.

Jak sprawić, by netcat utrzymywał „usługę proxy” po zakończeniu sesji VNC?


Aby obejść ten problem, umieszczam wiersz polecenia netcat w nieskończonej pętli:

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

Wolałbym jednak „oficjalne” rozwiązanie netcat, które w ogóle nie przerywa usługi.


Przeczytałem o parametrze „-”, ale nie jestem pewien, czy pasuje to do przypadku i nie byłem jeszcze w stanie go poprawnie zastosować.


Dodatkowe uwagi:

Oczywiście mogę to zrobić z tunelowaniem ssh na różne sposoby, ale chciałem rozwiązania bez narzutu szyfrowania, aby było możliwie jak najbardziej responsywne dla klienta VNC. W przeciwnym razie inne rozwiązanie proxy byłoby OK.

Klient musi być VNC, żadne inne protokoły nie są możliwe.

Alojz Janez
źródło

Odpowiedzi:

24

-kOpcja powinna załatwić sprawę.

Ze strony 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.

Zauważyłem, że netcat-traditionalpakiet na Debianie / Ubuntu nie słucha tak, jak powinien. W takim przypadku skorzystaj z netcat-openbsdpakietu i spróbuj ponownie!

Alternatywnie, użyj socat, który jest bardziej ukierunkowany na twoją skrzynkę użytkową serwera proxy. Przykład losowego przekazywania TCP, którego strona podręczna socatwymaga oczywiście pewnych modyfikacji.

   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
źródło
@AlojzJanez Tak, to trochę oczywiste, szczerze mówiąc. Spraw, by czytanie podręczników stało się nawykiem. :)
gertvdijk 12.12.12