我正在尝试将网络流量从远程服务器转发到我的本地计算机,以便测试一些 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,所以这只是一个猜测。