Я проксирую порт TCP-сервера VNC с помощью netcat. Прокси-машина работает под управлением Linux.
Я использую эту команду:
mkfifo backpipe
nc -l 5902 0<backpipe | nc 10.1.1.116 5902 1>backpipe
10.1.1.116 - это «удаленный» компьютер с исходной службой VNC, работающей на порту 5902. После этой команды служба VNC становится доступной на локальном хосте для других машин.
Но после каждого сеанса VNC "прокси-сервер" netcat останавливается, как работает netcat.
Как я могу заставить netcat поддерживать работу «прокси-службы» после завершения сеанса VNC?
В качестве обходного пути я помещаю командную строку netcat в бесконечный цикл:
mkfifo backpipe
while true; do nc -l 5902 0<backpipe | nc 10.1.1.116 5902 1>backpipe; done
Но я бы предпочел «официальное» решение netcat, которое вообще не прерывает работу службы.
Я читал о параметре «-», но не уверен, подходит ли он для случая, и я еще не смог правильно его применить.
Дополнительные примечания:
Конечно, я могу сделать это с помощью ssh-туннелирования по-разному, но мне нужно было решение без накладных расходов на шифрование, чтобы сделать его максимально быстрым для клиента VNC. В противном случае подойдет другое решение для прокси.
Клиент должен быть VNC, другие протоколы невозможны.
В -k
вариант должен сделать свое дело.
На странице руководства 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.
Я заметил netcat-traditional
пакет в Debian / Ubuntu не слушает должным образом. В этом случае используйте netcat-openbsd
пакет и попробуйте еще раз!
В качестве альтернативы используйте socat
, который больше ориентирован на ваш вариант использования прокси-сервера. Пример случайного TCP-пересылки из справочной страницы socat
который, конечно, требует некоторых изменений.
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.