У меня есть удаленный сервер, который находится за двумя шлюзами, как показано на рисунке. gw1
открыт для внешнего мира, а gw2
доступен только из gw1
. Сервер
доступен только с gw2
и может быть одним из нескольких возможных серверов. Я хочу настроить переадресацию портов через ssh
таким образом, чтобы 443
с моей клиентской машины автоматически перенаправлялись на 2000
на gw1
. Проблема не в этом. У меня:
HostName gw1
User user
ForwardAgent yes
LocalForward 443 localhost:2000
И это прекрасно работает. Теперь я хочу, чтобы 2000
из gw1
были перенаправлены на 443
на сервере
через 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 оттуда на сервер1.
Что это даст: ProxyCommand ProxyCommand
говорит ssh сначала подключиться к gw1, а стандартный вывод труб - к nc gw2 22
, который переадресует этот поток на gw2 на порт 22. Это создает туннель для стандартного входа на клиенте через gw1 в gw2:22. ssh затем открывает вторую сессию ssh через этот туннель в gw2. Как только это установлено, LocalForward
переадресует порт 443 на сервер1 (%h
- имя хоста, которое вы указали в командной строке).
Смотрите man ssh_config, чтобы прочитать о Match и ProxyCommand.
Обратите внимание, что хотя команда ssh server1
, на самом деле она соединяет ssh только до gw2, а затем просто переадресует порт 443 оттуда. Оболочка откроется на gw2, а не на server1. Поэтому вы можете вместо этого запустить ssh -N server1
, чтобы не открывать оболочку, так как на самом деле целью является только переадресация порта. К сожалению, в .ssh/config нет эквивалента -N, но Вы можете добавить что-то вроде LocalCommand wait
, чтобы добиться того же самого - оболочка просто будет ждать, пока не будет прервана, и не будет приглашения оболочки.