我试图将网络流量从远程服务器转发到本地计算机,以测试一些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)
curl http://server.com:8888
出现错误时curl: (7) couldn't connect to host
。我仍然可以从服务器的外壳卷曲localhost:8888,它会命中本地计算机。