反向 SSH 隧道

反向 SSH 隧道

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

nginx 选项通过将 0.0.0.0:7777 更改为 127.0.0.1:7777 来工作,正如 @Marcel G 所建议的那样。但仍在寻找非 nginx 解决方案。

编辑(最终解决方案更新)

正如 @sciurus 指出的那样,请确保GatewayPorts yes在您的 sshd_config 文件中。我最初在配置文件中有此行,但我需要发出/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)

答案1

没有必要使用 nginx。

在你的 ssh 守护进程配置中(应该是/etc/ssh/sshd_config) 放网关端口客户指定并重新加载。这对于其他系统连接到您的隧道是必需的。如果没有它,只有您服务器上运行的程序才能使用它。

现在你需要做的就是修改 ssh 命令以监听端口 8888 而不是端口 7777。这可能看起来像

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

星号告诉 sshd 在所有接口上监听端口 8888,而不仅仅是环回接口。如果你没有更改网关端口

答案2

我赞同 sciurus 的回答,但如果由于某种原因您需要使用 nginx......我猜是您的上游定义被破坏了。

创建 ssh 反向隧道的方式仅监听本地主机(127.0.0.1 和 ::1),因此您可能需要尝试以下上游定义:

upstream tunnel {
    server 127.0.0.1:7777;
}

仅供记录:我从来没有自己配置过 nginx,所以这只是一个猜测。

相关内容