Заворачиваем 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

Что означают переменные в этом файле

Создаём конфигурационный файл для туннеля

Путь до файла:

/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

Здесь те же переменные, что и в шаблоне:

Как видно, параметры из шаблона и из конфигурационного файла полностью совпадают — один в один.

Дальше работаем с ним как и с любым другим systemd-сервисом.

Единственное на что еще может стоит обратить внимание: если при каждом просмотре systemctl status вы видите, что сервис работает всего несколько секунд — скорее всего, проблема с подключением или в настройках туннеля.