Страница 1 из 1

Автоматический подъем и рестарт ssh-туннелей (systemd+autossh)

Добавлено: 07 сен 2022, 14:00
Chocobo
Появилась потребность держать активным пару туннелей чтоб локальный листенер одного хоста за натом был доступен на другом внешнем.
Можно бы поднять опенвпн сервер, объединить в одну подсеть и держать клиента поднятым, но ради одного-двух портов показалось как-то оверхедно)

С самим туннелированием все норм, например
ssh -NTC -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -R 8443:localhost:443 root@1.2.3.4 -p 22
делает искомое авторизуясь по ключам, поднимая на локалхосте удаленного сервера 1.2.3.4 порт 8443, который смотрит в туннель прямиком на 443 хоста до которого напрямую он бы не достучался.
но обработку обрывов и падений, плюс автостарт при запуске системы было решено добавить service-юнит и autossh.


/etc/systemd/system/autossh@.service

Код: Выделить всё

[Unit]
Description=Keeps an ssh tunnel to %I open
After=network-online.target ssh.service

[Service]
Environment="AUTOSSH_PORT=0"
Environment="AUTOSSH_GATETIME=0"
EnvironmentFile=/etc/default/autossh@%i
RestartSec=3
Restart=always

ExecStart=/usr/bin/autossh -NT -o "ExitOnForwardFailure=yes" $SSH_OPTIONS ${TARGET_HOST} $FORWARDS
TimeoutStopSec=10

[Install]
WantedBy=multi-user.target


/etc/default/autossh@https

Код: Выделить всё

TARGET_HOST=root@1.2.3.4
FORWARDS=-R 8443:localhost:443

SSH_OPTIONS=-o "ServerAliveInterval=10" -o "ServerAliveCountMax=3" -p 22
AUTOSSH_PORT=0
AUTOSSH_GATETIME=0
после чего systemctl daemon-reload и systemctl enable --now autossh@https

И будет подниматься сам, и рестартиться на события потери сети или падения ssh процессов какой либо из сторон.