Обратный туннель для доступа к внешнему API на межсетевом сервере, доступном только через бастион

Если название звучит запутанно, это так, и я очень запутался. Вот ситуация:

  1. У меня есть прод-сервер prod1 это брандмауэр входящего / исходящего трафика из / во весь внешний Интернет
  2. Кроме того, единственный способ, которым я могу использовать 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, могут блокировать вас от этого). Вам нужны эти привилегии или, скорее, вы должны выбрать другой локальный порт, и это делает его еще менее прозрачным для вашего приложения.

Другие вопросы по тегам