Заворачиваем ssh-тунели в systemd-сервис
Часто возникает необходимость держать постоянное SSH-соединение через туннель. Чтобы не возиться с его ручным восстановлением после перезагрузки системы, проще всего настроить туннель как systemd-сервис и использовать SSH-ключи вместо паролей.
Хорошая идея — оформить такой сервис в виде шаблона, который будет подтягивать параметры туннеля из конфигурационного файла. Это сильно упрощает жизнь: можно быстро добавлять, удалять, изменять туннели, запускать и останавливать их.
Для этого понадобится заранее настроенная работа через SSH-ключи — иначе всё работать не будет.
Создаём шаблон systemd-сервиса
Путь до файла:
/etc/systemd/system/secure-tunnel@.service
Содержимое:
[Unit] Description=Setup a secure tunnel to %I After=network.target [Service] Environment="LOCAL_ADDR=localhost" EnvironmentFile=/etc/default/secure-tunnel@%i ExecStart=/usr/bin/ssh -NT -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L ${LOCAL_ADDR}:${LOCAL_PORT}:${REMOTE_HOST}:${REMOTE_PORT} ${TUSER}@${TARGET} # Restart every >2 seconds to avoid StartLimitInterval failure RestartSec=5 Restart=always [Install] WantedBy=multi-user.target
Что означают переменные в этом файле
${LOCAL_ADDR}
— локальный IP, на который будет привязан туннель${LOCAL_PORT}
— порт на локальном интерфейсе${REMOTE_HOST}
— удалённый хост, до которого прокидываем соединение${REMOTE_PORT}
— порт на удалённой стороне${TARGET}
— SSH-шлюз, через который строится туннель${TUSER}
— имя пользователя для подключения к SSH-шлюзу
Создаём конфигурационный файл для туннеля
Путь до файла:
/etc/default/secure-tunnel@example_tunnel1
Этот файл содержит параметры конкретного туннеля. Пример содержимого:
TARGET=gateway1 TUSER=root LOCAL_ADDR=127.0.0.1 LOCAL_PORT=49998 REMOTE_PORT=443 REMOTE_HOST=10.1.1.1
Здесь те же переменные, что и в шаблоне:
LOCAL_ADDR
— IP-адрес на локальной машинеLOCAL_PORT
— локальный порт, на который привязываем туннельREMOTE_HOST
— хост на удалённой сторонеREMOTE_PORT
— порт на удалённой сторонеTARGET
— SSH-шлюзTUSER
— пользователь для подключения кTARGET
Как видно, параметры из шаблона и из конфигурационного файла полностью совпадают — один в один.
Дальше работаем с ним как и с любым другим systemd-сервисом.
Единственное на что еще может стоит обратить внимание: если при каждом просмотре systemctl status
вы видите, что сервис работает всего несколько секунд — скорее всего, проблема с подключением или в настройках туннеля.