反向SSH隧道


8

我试图将网络流量从远程服务器转发到本地计算机,以测试一些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)

Answers:


9

无需使用nginx。

在ssh守护程序配置中(应该为/ etc / ssh / sshd_config),将GatewayPorts设置为clientspecified并重新加载它。这是其他系统能够连接到您的隧道所必需的。没有它,只有在服务器上运行的程序才能使用它。

现在,您需要做的就是修改ssh命令以侦听端口8888而不是端口7777。这看起来像

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

星号告诉sshd在所有接口上侦听端口8888,而不仅仅是回送接口。如果您没有更改GatewayPorts,这将失败。


好的,我切换到您的建议,当我curl http://server.com:8888出现错误时curl: (7) couldn't connect to host。我仍然可以从服务器的外壳卷曲localhost:8888,它会命中本地计算机。
克里斯

顺便说一句,在尝试您提供的新命令之前,我停止了nginx。
克里斯

@chris是否在服务器的sshd_config中启用了GatewayPorts?如果没有,请启用它。启动隧道后,确保ssh监听的不只是回送地址;您可以将netstat和grep替换为lsof -i tcp:8888
sciurus

太棒了!所以我GatewayPorts yes进入了sshd_config,我想我只执行了/etc/init.d/ssh重新启动,但是这次我做了reload。我不确定有什么区别,但是现在完全可以了!!感谢一百万@sciurus。
克里斯

1

我第二次回答sciurus的问题,但是如果由于某些原因需要使用nginx ...我的猜测是您的上游定义已被破坏。

创建ssh反向隧道的方式仅在localhost(127.0.0.1和:: 1)上侦听,因此您可能想尝试以下上游定义:

upstream tunnel {
    server 127.0.0.1:7777;
}

仅作记录:我尚未配置nginx我的自我,所以这只是一个猜测。


谢谢!这实际上使它起作用。如果可能的话,我仍然不愿意只使用nginx来使隧道工作,但是很高兴知道这是可能的
chris
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.