У меня есть удаленный сервер, который находится за двумя шлюзами, как показано на рисунке. 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
для достижения того же самого - оболочка будет просто ждать, пока не будет прервана, и не будет приглашения оболочки.