Назад | Перейти на главную страницу

передача параметров удаленной переадресации порта ssh

У меня есть удаленный сервер, который находится за двумя шлюзами, как показано на рисунке. gw1 открыт для внешнего мира, пока gw2 доступен только из gw1. Server доступен только из gw2 и это может быть один из нескольких возможных серверов. Я хочу настроить проброс портов через ssh такой, что 443 с моей клиентской машины автоматически перенаправляется на 2000 на gw1. Проблема не в этом. У меня есть:

HostName gw1
User user
ForwardAgent yes
LocalForward 443 localhost:2000

И это прекрасно работает. Теперь я хочу 2000 из gw1 быть направленным 443 на Server через gw2 когда я ssh к gw2. Я могу сделать:

HostName gw2
LocalForward 2000 Server:443

Могу ли я передать IP-адрес сервера в качестве параметра, поскольку он каждый раз может отличаться?

Предположим, вам наплевать на порт 2000. На самом деле ваша цель просто перенаправить порт 443 от клиента к серверу. И предположим, что у вас есть хосты server1, server2, server3, ... в роли сервера. Если вы добавите это в свой .ssh / config:

Match host server*
ProxyCommand ssh gw1 nc gw2 22
LocalForward 443 %h:443

Тогда например ssh server1 подключится через gw1 к gw2 и перенаправит оттуда 443 на server1.

Что это значит: ProxyCommand сообщает ssh сначала подключиться к gw1 и направить стандартный вывод в nc gw2 22, который перенаправляет этот поток на gw2 через порт 22. Это создает туннель для стандартного ввода на клиенте через gw1 на gw2: 22. Затем ssh открывает второй сеанс ssh через этот туннель с gw2. Как только это будет установлено, LocalForward перенаправляет порт 443 на server1 (%h имя хоста, указанное вами в командной строке).

См. Man ssh_config, чтобы узнать о Match и ProxyCommand.

Обратите внимание, что хотя команда ssh server1, это действительно только подключает ssh до gw2, а затем просто перенаправляет порт 443 оттуда. Оболочка откроется на gw2, а не на server1. Так что вы можете захотеть бежать ssh -N server1 вместо этого, чтобы не открывать оболочку, поскольку цель действительно просто переадресовать порт. К сожалению, в .ssh / config нет эквивалента -N, но вы можете добавить что-то вроде LocalCommand wait для достижения того же самого - оболочка будет просто ждать, пока не будет прервана, и не будет приглашения оболочки.