Linux

永遠使用 netcat 代理

  • June 15, 2016

我正在使用 netcat 代理 VNC TCP 伺服器埠。代理機器執行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-traditionalDebian/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.

引用自:https://serverfault.com/questions/457433