我试图转发从远程服务器的networkingstream量到我的本地机器,以testing一些API集成(tropo,贝宝等)。 基本上,我试图设置类似tunnlr.com提供的东西。
$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仅仅用于隧道更优雅的解决scheme。 任何帮助是极大的赞赏。 谢谢!
编辑 (添加服务器信息)
服务器的详细信息:Ubuntu 10.10 maverick(标准安装)
编辑 (nginx选项)
在@Marcel Gbuild议的情况下,nginx选项将0.0.0.0:7777更改为127.0.0.1:7777。 仍然在寻找非nginx解决scheme。
编辑 (最终解决scheme的更新)
正如@sciurus指出的那样,请确保您的sshd_config文件中的GatewayPorts yes
。 我最初有configuration文件中的这一行,但我需要发出一个/etc/init.d/ssh reload
而不是restart
(至less在Ubuntu上似乎这样)。
在本地机器上使用最后的命令: ssh -nNT -R '*:8888:localhost:5000' user@server
然后服务器应该用lsof -i tcp:888
指示它正在监听*:8888
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守护进程configuration(它应该是/ etc / ssh / sshd_config )将GatewayPorts设置为客户端指定并重新加载它。 这对于其他系统能够连接到您的隧道是必要的。 没有它,只有运行在你的服务器上的程序才能使用它。
现在你只需要修改你的ssh命令来监听端口8888而不是端口7777.这可能看起来像
ssh -nNT -R '*:8888:localhost:5000' user@server
星号告诉sshd在所有接口上监听端口8888,而不仅仅是回送接口。 如果您没有更改GatewayPort,这将失败。
我第二sciurus的答案,但如果由于某种原因,你需要使用nginx …我的猜测是,你的上游定义是打破。
你创build你的ssh反向隧道的方式只能监听本地主机(127.0.0.1和:: 1),所以你可能想尝试给出下面的上游定义:
upstream tunnel { server 127.0.0.1:7777; }
只是为了logging:我从来没有configurationnginx我的自我,所以这只是一个猜测。