Cloudflare Tunnel - это Zero Trust туннель который обеспечивает безопасный доступ к локальным ресурсам через Интернет без необходимости в публичных IP-адресах или открытых портах брандмауэра. Имеет ряд ограничений и особенностей таких как ограничение разовой передачи данных (100 Мб за файл на бесплатном плане) более низкая надежность и легкая блокируемость.
Как это работает?
Туннели Cloudflare работают путем установки приложения/сервиса Cloudflare под названием Cloudflared, этот сервис создает обратный туннель, который взаимодействует с серверами Cloudflare и подключается к ближайшему ЦОД Cloudflare. Это устанавливает безопасное соединение между Cloudflare и нашей локальной машиной. Теперь наше устройство может взаимодействовать с Cloudflare.

Создание туннеля
Давайте создадим туннель и выставим тестовое приложение в общедоступный интернет. Вначале необходимо перенести управление вашим доменом в Cloudflare, если вы еще это не сделали, то как это сделать можно прочитать здесь. Далее открывем Cloudflare Dash, в левом меню выбираем Zero Trust. Перейдя в панель управления ZeroTrust, выберете в левом меню Networks > Tunnels

Выбираем тип туннеля Cloudflared и нажимаем Next

Задаем имя туннеля и снова нажимаем Next

В этом примере я буду публиковать Uptime Kuma. В поле Subdomain указываем субдомен на котором будет доступен ваш сервис. DNS-запись создастся автоматически для вашего домена при создании туннеля, но при удалении туннеля нужно будет удалять ее вручную. Поле Type оставляем без изменений HTTP. При использовании в docker контейнере, в поле URL вписываем container_name:port и нажимаем кнопку Next

На следующем шаге вы выбираем операционную систему Docker и копируем токен, он понадобится далее.
Подключение к туннелю
Создаем .env файл и вместо your_tunnel_token вставляем полученный ранее токен:
nano .env
TUNNEL_TOKEN='your_tunnel_token'
Затем создаем docker-compose файл
version: "3.8"
services:
uptime-kuma:
restart: unless-stopped
ports:
- 3001:3001
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/app/data
container_name: uptime-kuma
image: louislam/uptime-kuma:1
cf-tunnel:
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel --no-autoupdate run
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN}
Запускаем контейнер:
docker compose up -d
Если туннель успешно запустился, то в списке туннелей вы увидите статус HEALTHY

Перейдите на URL-адрес который вы задали при настройке и проверьте, что он доступен.
Так же его можно использование в связке с обратным прокси сервером, например traefik, для публикации сразу нескольких сервисов, для этого необходимо добавить к docker-compose файл Traefik следующее содержимое:
services:
cf-tunnel:
image: cloudflare/cloudflared:latest
container_name: cf-tunnel
command: tunnel --no-autoupdate run
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN}
networks:
- proxy
restart: unless-stopped
networks:
proxy:
external: true
Заключение
Мы успешно выставили сервис мониторинга Uptime Kuma в Интернет с помощью туннеля Cloudflare, безопасно, через публичную запись DNS и без использования статического белого IP адреса.
