尝试通过 ssh 隧道进行 https 调用(绕过防火墙)

尝试通过 ssh 隧道进行 https 调用(绕过防火墙)

我有一个堡垒服务器,它可以访问另一个外部世界无法访问的服务器。

我正在尝试这样做,以便我可以从我的本地主机进行 https web 调用以访问不可用服务器上的端点以进行测试。为此,我一直在尝试遵循以下答案:https://superuser.com/a/1447340/441810

因此我编辑了 /etc/hosts 文件并添加:

127.0.0.1 <firewalled-box>

然后我创建了隧道:

ssh -L 443:<firewalled-box>:443 me@<bastion>

但是,当我在本地机器上进行网络呼叫时……

curl -H 'Content-Type: application/json' -H 'Accept: application/json' https://<firewalled-box>/some/path/somewhere/fancy

我得到:

curl: (7) Failed to connect to <firewalled-box> port 443: Connection refused

答案1

诊断

Connection refused表示curl无法连接到它尝试连接的任何对象。在你的情况下,它尝试连接到你的(本地)SSH 客户端,除非你做错了什么,/etc/hosts并且curl实际上尝试连接到真正的(或假的但错误的)<firewalled-box>

我假设curl尝试连接到您的 SSH 客户端。看来您的客户ssh端没有监听或通信被阻止。

我怎么知道问题出在 和 之间curlssh而不是(或至少还不是) SSH 服务器和 之间<firewalled-box>

这是关于 SSH 端口转发的工作原理。在本地转发的情况下,需要在 SSH 服务器尝试连接到目标计算机之前建立与 SSH 客户端的连接。如果后者连接失败,则前者将被终止。但由于前者连接已经已确立的首先,连接过程(curl在您的情况下)将打印类似的内容Connection reset by peer,当然不是Connection refused

在您的情况下,表示无法建立Connection refused由 发起的连接。curl


解决方案

问题可能是因为非特权用户无法侦听低于以下端口1024。如果您运行ssh -L …并且端口无法使用,某些ssh实现将完全拒绝连接到 SSH 服务器,但有些实现只会打印警告并继续连接。如果<bastion>清除控制台或打印较长的欢迎消息,警告可能不会被注意到。

使用-o ExitOnForwardFailure=yes确保ssh连接后您可以收听。

如果罪魁祸首是端口号低,那么ssh以 root 身份运行将会有所帮助,尽管我不建议ssh以 root 身份运行。

也许您需要的只是在本地使用更高的数字,例如-L 1443:<firewalled-box>:443。然后curl应该连接到https://<firewalled-box>:1443/…

注意,正式的<firewalled-box>应该-L是机器理解的名称/地址<bastion>,而<firewalled-box>调用curl应该是本地机器理解的(感谢修改的/etc/hosts)。


选择

我建议使用动态端口转发,SOCKS。

  • 127.0.0.1 <firewalled-box>从您的 中删除/etc/hosts
  • 调用ssh -ND 7654 me@<bastion>
  • curl使用运行。如果您在传递给的地址中-x socks5://localhost:7654使用,则必须解析<firewalled-box>curl本地到有效的 IP 地址远程;所以无论如何你都有可能需要进行修改/etc/hosts

更多详细-D信息我的这个答案

相关内容