Cloudflare Tunnel позволяет опубликовать локальный сервер в интернете без белого IP и без открытых входящих портов. Соединение инициируется изнутри сети — сервер недоступен напрямую.
Как работает Cloudflare Tunnel
- Демон
cloudflaredна вашем сервере создаёт исходящее зашифрованное соединение с Cloudflare - Cloudflare принимает трафик на своём edge для вашего домена
- Трафик передаётся через туннель на ваш сервер
- Нет открытых портов 80/443 на сервере
Установка cloudflared
# Ubuntu/Debian
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb
# Авторизоваться
cloudflared tunnel login
Создание туннеля
# Создать туннель
cloudflared tunnel create my-server
# Создать конфиг ~/.cloudflared/config.yml
tunnel: your-tunnel-id
credentials-file: /root/.cloudflared/your-tunnel-id.json
ingress:
- hostname: mysite.example.com
service: http://localhost:80
- hostname: api.example.com
service: http://localhost:3000
- service: http_status:404
Привязка домена и запуск
# Создать DNS-запись
cloudflared tunnel route dns my-server mysite.example.com
# Запустить туннель
cloudflared tunnel run my-server
# Добавить в автозапуск
sudo cloudflared service install
sudo systemctl enable cloudflared
Случаи использования
- Публикация dev-сервера для демонстрации клиенту
- Хостинг сайта на домашнем интернете без белого IP
- Защита сервера: нет открытых портов = нет прямых атак
- Self-hosted сервисы (Gitea, NextCloud, Home Assistant) с HTTPS
Что такое Cloudflare Tunnel
Cloudflare Tunnel создаёт зашифрованный исходящий туннель от вашего сервера к Cloudflare. Не нужно открывать порты 80/443 — всё идёт через туннель.
Конфигурационный файл
# ~/.cloudflared/config.yml
tunnel: TUNNEL_ID
credentials-file: /root/.cloudflared/TUNNEL_ID.json
ingress:
- hostname: myapp.yourdomain.com
service: http://localhost:3000
- hostname: api.yourdomain.com
service: http://localhost:8080
- service: http_status:404
Запуск как сервис
cloudflared service install
systemctl enable --now cloudflared
Типичные ошибки Cloudflare Tunnel
| Ошибка | Причина | Что делать |
|---|---|---|
| failed to connect to the edge: context deadline exceeded | Исходящий трафик с сервера заблокирован файрволлом — cloudflared не может достучаться до edge Cloudflare | Разрешите исходящие соединения на портах 443 и 7844 (QUIC) в файрволле |
| Unauthorized: Failed to get tunnel | Файл credentials-file указывает на неверный tunnel ID, либо токен туннеля был отозван в дашборде | Пересоздайте туннель: cloudflared tunnel create my-server и обновите config.yml |
| Error 502 Bad Gateway при заходе на сайт | Сервис, указанный в ingress (например http://localhost:80), не запущен или слушает другой порт | Проверьте, что локальный сервис реально работает: curl http://localhost:80 |
| no ingress rules were defined | В config.yml нет обязательного завершающего правила по умолчанию | Добавьте последней строкой в ingress: - service: http_status:404 |
Сравнение Cloudflare Tunnel и прямого подключения
| Критерий | Cloudflare Tunnel | Прямое подключение с открытым портом |
|---|---|---|
| Публичный IP | Не нужен | Обязателен |
| Открытые входящие порты | Ни одного | 80/443 открыты для всего интернета |
| Задержка | Чуть выше — дополнительный переход через edge Cloudflare | Минимальная, прямой путь до сервера |
| DDoS-защита | Включена автоматически | Нужно настраивать отдельно |
Когда Cloudflare Tunnel не подходит
- Высоконагруженный production с большим постоянным трафиком — дополнительный хоп через edge заметен на задержке и стоимости
- Клиентам нужен mTLS с собственным сертификатом напрямую до сервера — туннель терминирует TLS на стороне Cloudflare
- Приложение использует протоколы за пределами HTTP/TCP с нестандартной маршрутизацией — поддержка через ingress не всегда одинакова для всех типов трафика
- Критична независимость от аптайма стороннего провайдера — туннель добавляет Cloudflare как единую точку отказа между клиентом и сервером
Для защиты именно веб-админки по модели Zero Trust, а не просто скрытия IP, есть отдельная статья «Cloudflare Access: защита админки по модели Zero Trust». Общее устройство сети Cloudflare разобрано в статье «Cloudflare: что это такое и зачем нужен бесплатный план».
Проверка результата
Убедитесь, что туннель поднят и трафик реально идёт через него:
# Статус туннеля и подключённые edge-соединения
cloudflared tunnel info my-server
# Туннель работает как systemd-сервис без сбоев
systemctl status cloudflared
# Домен отвечает через туннель, а не напрямую
curl -sI https://mysite.example.com | head -5
# Логи демона в реальном времени при диагностике
journalctl -u cloudflared -f
Если позже понадобится сравнить туннель с обычным VPN-доступом, вот статья про WireGuard VPN на VPS: быстрая установка и настройка.
Частые вопросы
Что происходит с сайтом, если процесс cloudflared на сервере останавливается?
Если служба cloudflared останавливается, исходящее соединение с edge Cloudflare пропадает, и сайт или сервис, опубликованный через туннель, становится недоступен снаружи — альтернативного маршрута к серверу просто не существует. Поэтому демон запускают как системную службу с автозапуском, чтобы он поднимался заново после перезагрузки или сбоя, а не оставался выключенным.
Нужен ли платный тариф Cloudflare, чтобы пользоваться Tunnel?
Нет, Cloudflare Tunnel полностью работает на бесплатном плане Cloudflare без дополнительной оплаты. Платные функции Cloudflare касаются других возможностей сети — расширенной защиты, аналитики или правил Zero Trust, а сам туннель и демон cloudflared остаются бесплатными независимо от выбранного тарифа аккаунта.
Можно ли опубликовать через один туннель сразу несколько разных сервисов на разных поддоменах?
Да, один и тот же туннель умеет обслуживать сразу несколько сервисов — для этого в конфигурационном файле просто перечисляют несколько правил ingress, каждое со своим доменным именем и адресом локального сервиса. Единственное требование — обязательное завершающее правило по умолчанию в конце списка, иначе конфигурация не загрузится.
Нужно ли открывать порт на домашнем роутере, чтобы Tunnel заработал?
Нет, в этом и состоит смысл Tunnel — соединение всегда инициируется изнутри сети самим сервером, поэтому входящие порты на роутере не открываются вовсе. Домашний интернет без публичного IP и без доступа к настройкам NAT продолжает работать точно так же, как с обычным провайдером.