反向 SSH 隧道
我正在嘗試將 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
然後伺服器應該表明它正在監聽 *:8888
lsof -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 ,這將失敗。