Заметки по работе с 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 клиента в фоне.