需要通过本地端口 9990 的 SSH 隧道访问远程服务器上的端口 9999,以避开防火墙。
我正在使用此命令来建立 SSH 隧道:
ssh -N -i share.pem -L 9990:`ecshare`:9999 ubuntu@`ecshare`
其中 ecmy 包含 ec2 实例的 ip。作为基准,我可以使用以下命令通过 ssh 获取远程 shell:
ssh -i share.pem ubuntu@`ecshare`
但是,当我在本地提示上尝试这个时:
curl -i -X GET http://localhost:9990
我在启动隧道的 shell 上得到了这个信息:
channel 2: open failed: connect failed: Connection refused
当我在远程 shell 上尝试此命令时:
curl -i -X GET http://localhost:9999
...我收到了服务器的响应。
为什么连接被拒绝?
答案1
无论使用何种身份验证方法,SSH 隧道的工作方式都是一样的。这里的问题不是使用公钥认证但了解基础知识如何使用 SSH 隧道。
在测试中,您-L 9990:example.com:9999
连接到的是远程端的公共网络接口。您提到的需要避开的防火墙可能位于远程端,阻止您使用。localhost:9999
curl
http://example.com:9999/
您应该使用-L 9990:localhost:9999
来让它使用本地环回。
-L [ bind_address:]port:host:hostport
此图表直观地显示了您的情况。...
port
...通过分配一个套接字在本地进行监听,可选择绑定到指定的bind_address
。每当与此端口建立连接时,该连接都会通过安全通道转发,并连接到host
端口hostport
从远程机器。