
У меня есть удаленный сервер, который находится за двумя шлюзами, как показано на рисунке. 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-адрес сервера в качестве параметра, так как он каждый раз может быть разным?
решение1
Предположим, что вам не важен порт 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
это имя хоста, которое вы указали в командной строке).
Подробнее о Match и ProxyCommand читайте в man ssh_config.
Обратите внимание, что хотя команда и есть ssh server1
, она на самом деле подключает ssh только до gw2, а затем просто перенаправляет порт 443 оттуда. Оболочка откроется на gw2, а не на server1. Поэтому вы можете ssh -N server1
вместо этого запустить , чтобы не открывать оболочку, поскольку цель на самом деле просто перенаправить порт. К сожалению, в .ssh/config нет эквивалента -N, но вы можете добавить что-то вроде , LocalCommand wait
чтобы добиться того же самого — оболочка просто будет ждать прерывания, и не будет приглашения оболочки.