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