Ssh

反向 SSH 隧道

  • March 8, 2011

我正在嘗試將 Web 流量從遠端伺服器轉發到我的本地電腦,以測試一些 API 集成(tropo、paypal 等)。基本上,我正在嘗試設置類似於 tunnlr.com 提供的東西。

我已經使用命令啟動了 ssh 隧道

$ssh –nNT –R :7777:localhost:5000 user@server

然後我可以看到伺服器現在正在偵聽埠 7777

user@server:$netstat -ant | grep 7777

tcp        0      0 127.0.0.1:7777          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:7777                :::*                    LISTEN  


$user@server:curl localhost:7777
Hello from local machine

所以效果很好。curl 請求實際上是從本地機器提供的。

現在,如何啟用 server.com:8888 通過該隧道路由?

我試過像這樣使用nginx:

upstream tunnel {
   server 0.0.0.0:7777;
}
server {
 listen 8888;
 server_name server.com;
 location / {
   access_log /var/log/nginx/tunnel-access.log;
   error_log /var/log/nginx/tunnel-error.log;
   proxy_pass http://tunnel;
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_redirect off;
 }
}

從 nginx 錯誤日誌中我看到:

[error] 11389#0: *1 connect() failed (111: Connection refused)

我一直在尋找嘗試使用iptables,但沒有取得任何進展。 iptables似乎比僅僅為了隧道而執行 nginx 是一個更優雅的解決方案。任何幫助是極大的讚賞。謝謝!

編輯(添加伺服器資訊)

伺服器詳情:Ubuntu 10.10 maverick(標準安裝)

編輯(nginx 選項)

正如@Marcel G 建議的那樣,nginx 選項通過將 0.0.0.0:7777 更改為 127.0.0.1:7777 起作用。雖然仍在尋找非 nginx 解決方案。

編輯(最終解決方案的更新)

正如@sciurus 指出的那樣,請確保GatewayPorts yes在您的 sshd_config 文件中。我最初在配置文件中有這一行,但我需要發出 a/etc/init.d/ssh reload而不是restart(至少在 ubuntu 上看起來是這樣)。

在本地機器上使用的最終命令: ssh -nNT -R '*:8888:localhost:5000' user@server

然後伺服器應該表明它正在監聽 *:8888lsof -i tcp:888

user@server:~$ sudo lsof -i tcp:8888
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    14711 user    8u  IPv4 1791013      0t0  TCP *:8888 (LISTEN)
sshd    14711 user    9u  IPv6 1791014      0t0  TCP *:8888 (LISTEN)

沒有必要使用 nginx。

在您的 ssh 守護程序配置中(應該是*/etc/ssh/sshd_config*)將GatewayPorts設置為clientspecified並重新載入它。這是其他系統能夠連接到您的隧道所必需的。沒有它,只有在您的伺服器上執行的程序才能使用它。

現在您需要做的就是修改您的 ssh 命令以偵聽埠 8888 而不是埠 7777。這可能看起來像

ssh -nNT -R '*:8888:localhost:5000' user@server

星號告訴 sshd 在所有介面上偵聽埠 8888,而不僅僅是環回介面。如果您沒有更改GatewayPorts ,這將失敗。

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