Это бесплатная программа, которая есть в стандартных репозиториях популярных дистрибутивов.
Autossh отслеживает SSH соединение, и если оно разрывается, переподключает. Я не знаю, где это может быть полезно, кроме как в случаях использования туннелей или проброса портов через SSH. Покажу на примере, как это работает.
Допустим, у вас есть какой-то сервер в интернете с внешним IP адресом. И вы хотите превратить его в jump хост, подключаясь через него к другим серверам в закрытом сегменте без прямого доступа к ним через интернет.
Настраиваем доступ с закрытых хостов к внешнему серверу через ключи. Проверяем в ручном режиме, что они работают. Для SSH туннелей как на внешнем сервере, так и на внутренних, можно создать отдельного пользователя. Это необязательно, но так будет удобнее и безопаснее. Shell ему можно не назначать, указав nologin.
Сначала просто проверяем соединение:
# autossh -M 0 -N -p 22777 -f -q -i /home/userssh/.ssh/id_rsa \
-o "ExitOnForwardFailure=yes" -o "ServerAliveInterval=30" \
-o "ServerAliveCountMax=3" -R 9033:localhost:22 \
Синтаксис тут один в один как у обычной службы sshd в том, что касается ssh соединения. То есть выполняем стандартный обратный проброс через ssh. Локальный порт 22 пробрасываем на удалённый хост 1.1.1.1 на порт 9033. Опции autossh можете посмотреть в его описании. Не буду на этом подробно останавливаться.
Теперь можно подключиться к внешнему серверу и на нём подключиться к внутреннему серверу:
# ssh -p 9033 root@localhost
Окажетесь на закрытом сервере, на котором запустили autossh.
Теперь сделаем всё красиво, запуская autossh через systemd под отдельной учётной записью. Создаём юнит /etc/systemd/system/autossh.service:
Description=SSH Reverse Tunnel
ExecStart=/usr/bin/autossh -M 0 -N -p 22777 -f -q -i /home/userssh/.ssh/id_rsa -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" -R 9033:localhost:22 userssh@1.1.1.1
ExecStop=/usr/bin/pkill -9 -u userssh
Запускаем и добавляем в автозагрузку:
# systemctl daemon-reload
# systemctl start autossh.service
# systemctl enable autossh.service
Проверяем на внешнем сервере:
# netstat -tulnp | grep 9033
tcp 0 0 127.0.0.1:9033 0.0.0.0:* LISTEN 19814/sshd: userssh
tcp6 0 0 ::1:9033 :::* LISTEN 19814/sshd: userssh
Всё работает. Заходим на внешний сервер и через его консоль подключаемся к закрытым серверам. Подобным образом можно настроить постоянное подключение NFS сервера по SSH.
По необходимости можно ограничивать разрешённые команды по ssh, либо настроить логирование действий.