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

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 бесплатно уже сегодня и откройте доступ к локальному серверу всего одной командой.
Зарегистрироваться бесплатно →По теме

Как открыть localhost в интернете: публичный HTTPS через SSH
11 сентября 2026 г.
Пошагово открываем локальный сайт из интернета без настройки роутера: SSH-туннель, проверка ссылки, Docker, Vite и диагностика ошибок.

Аналог ngrok для localhost: TunnelHunt, тарифы и переход на SSH
30 мая 2025 г.
Сравнение TunnelHunt и ngrok: Free и Pro, постоянный адрес, лимиты трафика, оплата в рублях, Replay и TCP. Проверка перехода на SSH-туннель.

Почему для туннелей достаточно одного лишь SSH
21 мая 2025 г.
Многие сервисы для туннелирования требуют установки специальных клиентов. Мы в TunnelHunt считаем, что это излишне, и вот почему.

Telegram-бот локально: webhook, secret_token и отладка на localhost
5 июня 2025 г.
Запустите Telegram-бота на localhost: выберите polling или webhook, настройте HTTPS и secret_token, проверьте getWebhookInfo и исправьте ошибки доставки.