Прыгаем по SSH хостам представьте себе ситуацию, когда у вас есть 1 ip адрес (linux-виртуалка), за которым находятся множество виртуальных машин. Как же заходить и манагерить все это дело? как напрямую залить файл по ssh? Обычно для этого каждой машине прокидывают свой порт и обращаются по этому порту, попадая на тачку напрямую. А теперь представим, что у вас таких инсталляций несколько десятков. Запутаться в таком способе очень и невероятно просто. Существует способ, который объединят в себе несколько возможностей ssh, позволяющий решить эту проблему.
Пример ssh_config файла:Host sever-1.web
Hostname 172.16.0.10
Host server-2.web
Hostname 172.16.0.20
Host jumper
HostName 1.2.3.4
User admin
Port 2222
ForwardAgent yes
LogLevel QUIET
Host *.web *.db
ProxyJump jumper
HostName %h.company.com
User bykva
Port 22
Host jumper - та самая виртуалка, за которой находятся хосты. Мы задаем ее адрес (ip или dns), пользователя, порт. А также одну из важных вещей - ssh-agent. Это технология, которая позволяет делегировать авторизацию на сервере за jumper на ту машину, с которой происходит подключение. Таким образом приватный ключ лежит только на вашей рабочей станции, а авторизовываться можно и на хостах, доступных через сервeр jumper.
Host *.web *.db - директива, которая говорит, чтобы подключения по регулярному выражению *.web обрабатывались с текущими параметрами: ProxyJump - указывает на то, что этот хост будет доступен через ssh-proxy сервер jumper. Hostname при этом будет составляться как конкатенация хоста к которому обращались и приписки вашего домена (ниже в примерах будет понятно о чем речь). Также можно указать порт и пользака под которым надо залогиниться. как видите и порты и пользователи везде можно указать разные.
Host sever-1.web - один из серверов, куда мы будем коннектиться. и в этой директиве мы переопределили Hostname на приватный ip-адрес.
Примеры:$ ssh server-1.web
ssh клиент видит соотвествие регулярке *.web и будет обрабатывать подключение согласно директиве
Host *.web *.db. Однако, поскольку есть четке указание Hostname, то jumper будет подключаться к
172.16.0.10.
$ ssh mysql-1.db
ssh клиент видит соотвествие регулярке *.web и будет обрабатывать подключение согласно директиве
Host *.web *.db. здесь у нас нет явного указания Hostname, поэтому jumper будет обращаться по адресу полученному из dns
mysql-1.db.company.comПросто, как 2 пальца об асфальт, а главное красиво. в итоге все ваши сервера доступны по адресам и для удобства разбиты на категории (субдомены).
Как видите такой пример подходит и для варианта "много серых серверов за 1 белым IP адресом", так и для варианта некоего SSH-VPN, когда у вас есть недоверенная сеть и куча серверов с белыми адресами. в итоге вы будете использовать ваш доверенный сервер, через который проксироваться на ваши другие сервера. на которых, к слову, можно ограничить доступ как раз с этого "ssh-vpn" сервера.
Настройка: 1. сгенерировать конфиг для всех ваших подключений, где прописать все сервера-jumper'ы и все хосты к которым вы подключаетесь и положить его по пути ~/.ssh/config
2. настроить на всех серверах авторизацию по ключам.
Да, это все что требуется.