我有一个堡垒服务器,它可以访问另一个外部世界无法访问的服务器。
我正在尝试这样做,以便我可以从我的本地主机进行 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
端没有监听或通信被阻止。
我怎么知道问题出在 和 之间curl
,ssh
而不是(或至少还不是) 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
信息我的这个答案。