====== Заворачиваем 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'' вы видите, что сервис работает всего несколько секунд — скорее всего, проблема с подключением или в настройках туннеля.