TunnelHunt

autossh: постоянный SSH-туннель, переподключение и systemd

4 мин чтения

Настройка autossh с ServerAliveInterval и systemd: восстановление SSH-туннеля, проверка подключения и диагностика Broken pipe без обещаний вечного uptime.

autossh: постоянный SSH-туннель, переподключение и systemd

autossh перезапускает SSH-клиент, когда соединение завершается или перестаёт отвечать. Это помогает восстановить обратный туннель после сетевого сбоя. Но autossh не запускает ваше веб-приложение и не сохраняет доступность компьютера во время сна.

В этом руководстве локальное приложение слушает порт 3000, а TunnelHunt выдаёт для него публичный HTTPS-адрес. Для обычного VPS параметры SSH будут другими: не переносите специальный порт 80 из примера TunnelHunt на произвольный сервер.

Сначала проверьте обычное соединение

curl -i http://127.0.0.1:3000/
ssh -p 2222 -o ExitOnForwardFailure=yes -R 80:127.0.0.1:3000 tunnelhunt.ru

Откройте выданную HTTPS-ссылку. При первом подключении проверьте ключ сервера и завершите необходимый интерактивный вход. После успешной проверки остановите SSH через Ctrl+C.

Если обычный SSH не подключается, autossh только повторит ту же ошибку. Проверьте ключ, порт, сеть и лимит активных туннелей.

Установка autossh

На macOS с Homebrew:

brew install autossh

На Debian или Ubuntu:

sudo apt update
sudo apt install autossh

Проверьте, что утилита доступна: autossh -V. Для других систем используйте пакет вашего дистрибутива или исходники autossh.

Команда с автоматическим восстановлением

autossh -M 0 -p 2222 \
  -o ServerAliveInterval=30 \
  -o ServerAliveCountMax=3 \
  -o ExitOnForwardFailure=yes \
  -R 80:127.0.0.1:3000 tunnelhunt.ru

-M 0 отключает отдельный мониторинговый порт autossh. Состояние соединения проверяет сам SSH: при отсутствии входящих данных ServerAliveInterval=30 задаёт интервал проверки, а ServerAliveCountMax=3 ограничивает число пропущенных ответов. Неотвечающий сервер обычно будет обнаружен примерно за 90 секунд, после чего autossh сможет запустить новое соединение.

ExitOnForwardFailure=yes завершает SSH при отказе создать проброс. Эта опция не проверяет, что HTTP-приложение на порту 3000 исправно отвечает. Параметры подробно описаны в руководстве OpenSSH.

Восстановление соединения и постоянный адрес — разные задачи

Случайный субдомен может измениться при переподключении. Для вебхуков зарезервируйте доступный на вашем тарифе субдомен в панели и используйте тот же SSH-ключ:

autossh -M 0 -p 2222 \
  -o ServerAliveInterval=30 \
  -o ServerAliveCountMax=3 \
  -o ExitOnForwardFailure=yes \
  -R my-dev:80:127.0.0.1:3000 tunnelhunt.ru

Замените my-dev на собственный зарезервированный адрес. Резервирование имени не гарантирует доступность приложения: оно только позволяет повторно использовать тот же адрес.

Автозапуск на Linux через systemd

Сначала проверьте подключение под тем пользователем, от которого будет работать служба. Его SSH-ключ и запись сервера в known_hosts должны быть готовы. Служба не сможет спросить пароль ключа в интерактивном терминале; продумайте способ аутентификации для этого окружения.

Создайте /etc/systemd/system/tunnelhunt.service:

[Unit]
Description=TunnelHunt reverse SSH tunnel
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=your_user
Environment=AUTOSSH_GATETIME=0
ExecStart=/usr/bin/autossh -M 0 -p 2222 -o BatchMode=yes -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o ExitOnForwardFailure=yes -R my-dev:80:127.0.0.1:3000 tunnelhunt.ru
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Замените your_user, my-dev и путь /usr/bin/autossh, если command -v autossh показывает другой. AUTOSSH_GATETIME=0 разрешает повторные попытки, даже если первоначальное соединение завершилось быстро. BatchMode=yes позволяет получить ошибку в журнале вместо ожидания пароля.

sudo systemctl daemon-reload
sudo systemctl enable --now tunnelhunt.service
systemctl status tunnelhunt.service
journalctl -u tunnelhunt.service -n 50 --no-pager

active (running) означает, что процесс службы работает. Дополнительно проверьте публичный HTTP-адрес. Запуск вашего приложения настройте отдельно.

Как проверить восстановление

В тестовом окружении с работающим приложением кратковременно отключите сеть, затем верните подключение. Дождитесь обнаружения сбоя и новой SSH-сессии. Проверьте журнал службы и повторите запрос к публичному URL.

Используйте отдельную тестовую сессию: проверка разрывает доступ и может вызвать повторную доставку вебхуков. Убедитесь, что повтор одного события не создаёт повторную операцию в приложении.

Частые проблемы

Симптом Возможная причина и действие
Permission denied (publickey) У пользователя службы нет нужного ключа; проверьте вход вручную от его имени
Host key verification failed Нет проверенной записи в known_hosts или ключ сервера изменился; выясните причину, не отключайте проверку
remote port forwarding failed Имя недоступно, старая сессия ещё активна или достигнут лимит
Служба работает, но ссылка отвечает ошибкой Проверьте локальное приложение через curl
После сна ноутбука сайт недоступен Во время сна autossh не выполняется; для непрерывной работы нужен включённый хост

Остановить и отключить автозапуск:

sudo systemctl disable --now tunnelhunt.service

Для настройки самого приложения используйте инструкцию публичного доступа к localhost, а для анализа входящих событий — руководство по повтору вебхуков.

Готовы запустить свой первый туннель?

Начните использовать TunnelHunt бесплатно уже сегодня и откройте доступ к локальному серверу всего одной командой.

Зарегистрироваться бесплатно →