如何使用密钥建立 SSH 隧道

fod*_*don 1 ssh ssh-tunnel

需要通过本地端口 9990 上的 SSH 隧道访问远程服务器上的端口 9999,以避免防火墙。

我正在使用此命令来建立 SSH 隧道:

ssh -N -i share.pem -L 9990:`ecshare`:9999 ubuntu@`ecshare`
Run Code Online (Sandbox Code Playgroud)

其中 ecmy 包含 ec2 实例的 ip。作为基准,我可以使用以下命令 ssh 并获取远程 shell:

ssh -i share.pem ubuntu@`ecshare`
Run Code Online (Sandbox Code Playgroud)

但是,当我在本地提示上尝试此操作时:

curl -i -X GET http://localhost:9990
Run Code Online (Sandbox Code Playgroud)

我在隧道启动的外壳上得到了这个:

channel 2: open failed: connect failed: Connection refused
Run Code Online (Sandbox Code Playgroud)

当我在远程 shell 上尝试此命令时:

curl -i -X GET http://localhost:9999
Run Code Online (Sandbox Code Playgroud)

...我得到了服务器的响应。

为什么连接被拒绝?

Esa*_*nen 10

尽管使用了身份验证方法,但 SSH 隧道的工作方式相同。这里的问题不在于使用公钥身份验证,而在于了解如何使用 SSH 隧道的基础知识。

-L 9990:example.com:9999所连接到远程侧的公共网络接口,而您连接到localhost:9999您的curl测试。您提到的需要避免的防火墙可能位于远程端,首先阻止您使用http://example.com:9999/

您应该改用-L 9990:localhost:9999使其使用本地环回。

<code>example.com</code> 和 <code>localhost</code> 在远程端的区别。

此图形象化了您的情况。该-L [ bind_address:]port:host:hostport...

...通过分配一个套接字来侦听port本地端的工作,可以选择绑定到指定的bind_address. 每当与此端口建立连接时,该连接就会通过安全通道转发,并从远程机器建立到host端口的连接。hostport