如果标题听起来令人困惑,确实如此,而且我非常困惑。情况如下:
- 我有一台生产服务器
prod1
,它对所有来自/到所有外部互联网的传入/传出流量进行了防火墙保护 - 此外,我通过 SSH 连接到该服务器的唯一方法是先通过 SSH 连接到内部堡垒
bastion.foo.com
,然后使用 sshconfig 例如 sshProxyCommand ssh -W %h:%p bastion.foo.com
。
我希望prod1
能够curl -I https://api.com
通过某种方式通过我的 ssh 连接隧道到达该服务器(当然,只有当我已连接时)来访问 API 端点(例如,它使用端口 443,因为它是 https)。阅读了一些博客文章后,我认为 RemoteForward 就是答案:
Host prod1
HostName ...
User ...
IdentityFile ...
RemoteForward 443 api.com:443
ProxyCommand ssh -W %h:%p bastion.foo.com
但当我听到ssh prod1
服务器说的第一句话是:
警告:监听端口 443 的远程端口转发失败
我该怎么做?我走在正确的道路上吗?
答案1
确实有可爱的图画这RemoteForward
在 openssh 中解释过。但是,在您的用例中,远程转发可能比您描述的更复杂。
您至少需要进行一些更改,/etc/hosts
以使其对您的应用程序至少有一点透明:
127.0.0.1 api.com
或者更改您的应用程序以直接连接到 localhost 而不是 api.com。
请注意,
仅当以 root 身份登录远程计算机时才可以转发特权端口。
来自man ssh_config(5)
。这意味着,如果没有 root 权限,您就无法绑定端口 443(或者其他机制,如 SELinux 也会阻止您这样做)。您需要这些权限,或者您应该选择不同的本地端口,这会让您的应用程序更加不透明。