Заметки по работе с SSH
За долгое время работы с SSH у меня накопилось немного заметок, которые позволяют улучшить качество работы ним.
Настройка alive
Часто при работе через разные VPN или не стабильные каналы связи у вас может возникать ситуация, что сессия подвисает, это лечится настройкой alive. С ним будет поддерживать соединение, а если оно разорвалось, вовремя его закрывать. Настраивается это в файле ~/.ssh/config
добавлением следующие настройки:
Host * ServerAliveInterval 600
Где 600 это время в секундах как часто отправлять alive пакеты. Я обычно использую значение 600 (10 минут), но если у вас не стабильный канал, или вы используете socks proxy то значение нужно уменьшать.
Работа через jump host (ssh proxy, бастион)
Часто требуется получить доступ в закрытый контур через промежуточный хост с SSH (иногда такой хост называют "бастион"). Например, доступ к виртуальным машинам не имеющим белого IP адреса через интернет. SSH позволяет проксировать соединения, для этого в файл ~/.ssh/config
вносим примерно такую конфигурацию:
Host ssh-proxy HostName ssh.proxy.example.com ForwardAgent yes User <ваше имя для доступа по SSH> IdentityFile ~/.ssh/id_rsa Host 192.168.1.* ProxyCommand ssh ssh-proxy -W [%h]:%p
Сначала мы определяем конфигурацию для доступа на наш jump хост (ssh-proxy
), потом для нашей подсети говорим использовать проксирование через ssh-proxy
. Прелесть данного способа заключается в том, что на jump хосте можно пользователям дать в качестве shell /usr/sbin/nologin (/sbin/nologin)
и пользователи не смогут ходить внутрь него, но проксирование будет работать.
Построение туннелей через jump host
Ну и самое распространенное на закуску, это построение туннелей. По идеологии это похоже на проксирование соединения, но работает для произвольного порта. Например, вам нужно подключиться к порту приложения в закрытом контуре.
ssh -N -L 127.0.0.1:2222:192.168.1.100:22 ssh-proxy
Где:
127.0.0.1:2222
локальный интерфейс и порт на которые будет проброшен удаленный порт.192.168.1.100:22
удаленный адрес и порт который будет проброшен на локальный интерфейс и порт.-N
не запускать удаленную команду, или, если говорить проще, не подключаться в консоль удаленного сервера.
Дополнительно можно еще использовать параметр -f
для запуска ssh клиента в фоне.