Обратный туннель для доступа к внешнему API на межсетевом сервере, доступном только через бастион
Если название звучит запутанно, это так, и я очень запутался. Вот ситуация:
- У меня есть прод-сервер
prod1
это брандмауэр входящего / исходящего трафика из / во весь внешний Интернет - Кроме того, единственный способ, которым я могу использовать SSH на этом сервере, - это сначала SSHing на внутренний бастион.
bastion.foo.com
тогда ssh с sshconfig напримерProxyCommand ssh -W %h:%p bastion.foo.com
,
На prod1
Я хочу иметь возможность попасть в конечную точку API, например curl -I https://api.com
(который использует порт 443 в качестве https) путем туннелирования через мое ssh-соединение с этим сервером (конечно, только когда я подключен). Прочитав несколько постов в блоге, я подумал, что RemoteForward был ответом:
Host prod1
HostName ...
User ...
IdentityFile ...
RemoteForward 443 api.com:443
ProxyCommand ssh -W %h:%p bastion.foo.com
Но когда я ssh prod1
Первое, что говорит сервер:
Предупреждение: переадресация удаленного порта для прослушивающего порта 443 не удалась
Как мне сделать то, что я пытаюсь сделать? Я на правильном пути?
1 ответ
Есть действительно милый рисунок, который объясняет RemoteForward
в опенш. Но удаленная пересылка, вероятно, более сложна в вашем случае, чем вы описываете.
Вам нужно изменить хотя бы /etc/hosts
чтобы сделать его хотя бы немного прозрачным для вашего приложения:
127.0.0.1 api.com
Или измените ваше приложение, чтобы подключаться к localhost напрямую, а не к api.com.
И обратите внимание, что
Привилегированные порты могут быть перенаправлены только при входе в систему как root на удаленной машине.
от man ssh_config(5)
, Это означает, что вы не можете связать порт 443 без прав root (или даже другие механизмы, такие как SELinux, могут блокировать вас от этого). Вам нужны эти привилегии или, скорее, вы должны выбрать другой локальный порт, и это делает его еще менее прозрачным для вашего приложения.