TunnelHunt

Как запустить localhost и открыть сайт в интернете через SSH

6 мин чтения

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

Как открыть localhost в интернете: публичный HTTPS через SSH

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

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