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

Чтобы открыть сайт по адресу http://localhost:3000/, запустите на своём компьютере HTTP-сервер, который слушает порт 3000. Ниже создадим тестовую страницу на Python, проверим её в браузере, затем подключим обратный SSH-туннель для доступа с телефона и из интернета. У существующего приложения используйте порт из его настроек и вывода терминала.
Когда локальный сервер уже запущен на порту 3000, публичная ссылка создаётся так:
ssh -p 2222 -R 80:localhost:3000 tunnelhunt.ru
TunnelHunt выдаст публичный HTTPS-адрес: запросы к нему будут приходить на локальный порт, пока работает SSH-соединение. Ниже — полный пример, который можно проверить без собственного приложения, а затем применить к своему проекту.
Что нужно для публичной ссылки
Для публичной ссылки нужны интернет, SSH-клиент и локальный веб-сервер. Проверьте наличие SSH:
ssh -V
В macOS и Linux он обычно уже установлен. В Windows проверьте команду в PowerShell; если она не найдена, установите компонент OpenSSH Client в дополнительных компонентах Windows.
TunnelHunt использует аутентификацию по SSH-ключу. Если ключа ещё нет, создайте отдельный ключ командой ssh-keygen -t ed25519 и следуйте подсказкам. Не перезаписывайте существующий ключ. Если использовали нестандартное имя файла, добавьте к команде подключения -i /путь/к/ключу.
Для запуска с лимитами Free войдите в кабинет и добавьте публичный SSH-ключ. Копируйте файл с окончанием .pub; приватный ключ остаётся на вашем компьютере. Без привязки ключа к аккаунту соединение работает как анонимное: сессия до 15 минут и 100 МБ трафика в месяц. У Free — до 4 часов и 1 ГБ.
Шаг 1. Как запустить сайт на localhost:3000
Для этого примера нужен Python 3. Создайте отдельную папку с единственным публичным файлом index.html:
<!doctype html>
<html lang="ru">
<meta charset="utf-8">
<title>Проверка туннеля</title>
<h1>TunnelHunt работает</h1>
</html>
Откройте терминал в этой папке и запустите:
python3 -m http.server 3000 --bind 127.0.0.1
В Windows вместо python3 может потребоваться py -3. Откройте http://127.0.0.1:3000. Должен появиться текст «TunnelHunt работает».
Сервер Python раздаёт файлы из текущей папки. Поэтому запускайте его именно в папке тестового сайта, где нет ключей, .env, исходников или личных документов.
Как зайти на localhost в браузере и с телефона
На компьютере, где запущен этот сервер, введите http://localhost:3000/ в адресную строку браузера. В этом примере сервер привязан к IPv4-адресу 127.0.0.1: если имя localhost разрешилось в IPv6 и страница не открывается, используйте http://127.0.0.1:3000/. Оставьте терминал с Python работающим. Если браузер пишет «Не удаётся получить доступ к сайту», сначала проверьте, что сервер запущен и порт совпадает с адресом.
localhost — адрес текущего устройства, поэтому на телефоне он указывает на сам телефон. Адрес http://127.0.0.1:3000/, скопированный с компьютера, тоже не откроет на телефоне ваш сайт. Чтобы проверить сайт через мобильный интернет, создайте публичную HTTPS-ссылку на следующем шаге. Для доступа с того же компьютера туннель не требуется.
Шаг 2. Создайте публичный адрес
В другом терминале выполните:
ssh -p 2222 -o ExitOnForwardFailure=yes -R 80:127.0.0.1:3000 tunnelhunt.ru
При первом соединении SSH предложит проверить ключ сервера. После успешного подключения в терминале появится выданный адрес вида https://имя-туннеля.tunnelhunt.ru.
Здесь 2222 — порт SSH-сервера TunnelHunt; 80 выбирает HTTP-туннель; 127.0.0.1:3000 — локальное приложение. Публичный URL работает по HTTPS, хотя тестовый сервер принимает обычный HTTP. SSH-терминал оставьте открытым.
Шаг 3. Проверьте доступ с другой сети
Откройте выданную ссылку на телефоне через мобильный интернет. Вы должны увидеть ту же тестовую страницу. В терминале Python появится запись входящего запроса.
Можно проверить и через терминал, заменив адрес на выданный вам:
curl -i https://YOUR-SUBDOMAIN.tunnelhunt.ru/
Ожидаемый результат — статус 200 и HTML вашего файла. Заголовок Server может отличаться от локального ответа: запрос проходит через прокси.
Первый запуск завершён, когда выполнены три проверки: локальный адрес отдаёт страницу, SSH показывает публичный URL, а запрос к этому URL возвращает тот же текст. При ошибке проверяйте шаги именно в этом порядке; наличие ссылки в терминале ещё не подтверждает ответ приложения.
Теперь замените тестовый сервер своим приложением или укажите его порт в SSH-команде. Для React/Vite это часто 5173, для Next.js — 3000; точный порт смотрите в выводе вашего dev-сервера.
Почему белый IP и проброс порта на роутере не нужны
SSH-клиент сам устанавливает исходящее соединение с публичным сервером. Внешние пользователи обращаются к этому серверу, а он передаёт запросы обратно по уже открытому соединению. Поэтому публичный IP нужен серверу туннелей, а вашему компьютеру достаточно возможности подключаться к нему.
Это подходит и для подключения за NAT. Однако корпоративная сеть может блокировать исходящий порт 2222: в таком случае нужно согласовать доступ или использовать разрешённую сеть.
Если приложение работает в Docker
Когда SSH запущен на хосте, сначала опубликуйте порт контейнера на loopback-интерфейсе хоста. Например, если приложение внутри контейнера слушает порт 8080:
services:
app:
image: your-app-image
ports:
- "127.0.0.1:3000:8080"
Приложение внутри контейнера должно слушать интерфейс, доступный Docker, обычно 0.0.0.0:8080. На хосте проверьте http://127.0.0.1:3000, затем используйте ту же SSH-команду. Подробнее — в руководстве по Docker.
Почему ссылка открывается, а приложение не работает
| Симптом | Что проверить |
|---|---|
Connection refused при локальной проверке |
Сервер не запущен или указан другой порт |
SSH пишет Permission denied (publickey) |
Клиент не предложил подходящий ключ; проверьте ssh -v и параметр -i |
remote port forwarding failed |
Лимит туннелей, недоступный адрес или отказ сервера; изучите вывод SSH |
Публичный адрес отвечает 502 |
Сначала повторите запрос к локальному порту; проверьте, что процесс не остановился |
Vite сообщает Blocked request |
Добавьте конкретное имя выданного домена в server.allowedHosts |
| Страница есть, запросы API не работают | В браузере посетителя localhost указывает на его компьютер. Используйте относительный /api через dev-proxy или отдельный публичный URL API |
| CORS-ошибка | Настройте разрешённый origin на API; сам туннель правила CORS не отменяет |
Для Vite указывайте точный hostname без https://. Не разрешайте все произвольные хосты ради устранения ошибки. Полная настройка allowedHosts, фиксированного порта и WebSocket разобрана в руководстве Vite через HTTPS-туннель. Параметры сверяйте с документацией Vite.
Как сохранить адрес и остановить доступ
Для разовой демонстрации достаточно Free. Если адрес нужен снова завтра, Pro за 199 ₽/месяц включает резервирование поддомена, 50 ГБ трафика в месяц и до 5 активных туннелей. Случайный адрес при новом соединении может измениться.
После активации Pro откройте «Туннели», зарезервируйте свободное имя и в настройках этого туннеля привяжите добавленный SSH-ключ. Перезапустите SSH с тем же ключом: сервер выбирает связанный с ним свободный зарезервированный адрес. Не меняйте 80 на имя домена в команде; проверьте фактически выданный URL в терминале. Автоматическое восстановление соединения настраивается отдельно — через autossh.
Чтобы завершить демонстрацию, остановите SSH командой Ctrl+C. Проверьте публичную ссылку: она больше не должна отдавать ваш тестовый сайт. Туннель не превращает ноутбук в постоянно работающий хостинг — сон, отключение интернета и остановка приложения делают его недоступным.
Следующие сценарии: вебхуки Telegram, n8n на localhost и сравнение с ngrok.
Откройте свой localhost по HTTPS
Добавьте SSH-ключ в кабинет, запустите команду из инструкции и проверьте выданную ссылку. Для повторных демонстраций можно закрепить поддомен на Pro.
Первый запуск: добавьте публичный SSH-ключ, запустите локальное приложение и команду SSH из статьи, затем откройте выданный HTTPS-адрес. Если ответа нет, пройдите проверку localhost и туннеля.
Free: 1 ГБ трафика в месяц, 1 туннель, сессия до 4 часов. Pro: 199 ₽/месяц, 50 ГБ, до 5 туннелей и резервирование поддомена. Компьютер, приложение и SSH-соединение должны работать; постоянный адрес сохраняет имя, а не доступность выключенного сервера.
Готовы запустить свой первый туннель?
Начните использовать TunnelHunt бесплатно уже сегодня и откройте доступ к локальному серверу всего одной командой.
Зарегистрироваться бесплатно →По теме

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

autossh: постоянный SSH-туннель, переподключение и systemd
16 июня 2026 г.
Настройка autossh на Linux и macOS: переподключение SSH, постоянный адрес по ключу, автозапуск через systemd и проверка HTTP после сбоя.

GitHub webhooks на localhost: подпись SHA-256, ping и повтор доставки
21 октября 2026 г.
Принимаем GitHub webhook локально в Flask: X-Hub-Signature-256, HTTPS-туннель, события ping/push, Recent deliveries и проверка повторов.

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