Post

Cloudflare Tunnel (Zero Trust): як безпечно відкрити Homelab та Docker в інтернет без білої IP та прокидання портів

Cloudflare Tunnel (Zero Trust): як безпечно відкрити Homelab та Docker в інтернет без білої IP та прокидання портів

🇬🇧 Read this article in English


Рано чи пізно кожен, хто розгортає власний Homelab або домашній міні-сервер (Proxmox, TrueNAS чи звичайний старий ПК із Docker), стикається з головною проблемою: як отримати доступ до своїх сервісів ззовні, коли ви не вдома?

Більшість іде класичним шляхом, який має купу болючих обмежень:

  1. «Сірий» IP від провайдера (CGNAT): у 90% домашніх користувачів немає публічної статичної IP-адреси. Провайдери або взагалі не дають відкривати порти, або вимагають за білий IP щомісячну платню.
  2. Прокидання портів (Port Forwarding) на роутері — це небезпечно: відкривши порти 80 та 443 на домашньому роутері, ви світите свою справжню домашню адресу всьому інтернету. Як ми бачили на прикладі нашого Cowrie Honeypot, ботнети починають сканувати вас уже за 3 хвилини. Будь-яка вразливість у роутері чи веб-сервері — і зловмисник опиняється всередині вашої домашньої мережі.
  3. VPN (наприклад, Tailscale) — ідеальний, але не для всіх: Tailscale чудовий для адміністрування, проте ви не можете просто дати посилання друзям чи рідним на домашній Immich без необхідності ставити клієнтський додаток на їхні телефони.

Ідеальне вирішення цієї дилеми — Cloudflare Tunnel (раніше відомий як Argo Tunnel) у зв’язці з платформою Cloudflare Zero Trust.

Схема архітектури Cloudflare Zero Trust Tunnel Мал. 1. Архітектура Cloudflare Tunnel: вихідне зашифроване з’єднання без відкритих портів на роутері, фільтрація трафіку через Cloudflare Edge та вхід за власним доменом


Як це працює: магія вихідного тунелю

Замість того, щоб відкривати «вхідні двері» (Inbound Ports) на вашому домашньому роутері, утиліта cloudflared у Docker-контейнері встановлює вихідне (Outbound) зашифроване з’єднання до найближчого дата-центру Cloudflare.

Коли ви або хтось інший вводите у браузері vault.yourdomain.com:

  1. Запит приходить на глобальну прикордонну мережу Cloudflare (Edge Network).
  2. Cloudflare перевіряє безпеку, фільтрує DDoS-атаки та шкідливих ботів.
  3. Якщо налаштовано Zero Trust Access, користувачеві показується екран авторизації (наприклад, вхід через Google чи одноразовий PIN на пошту).
  4. Трафік через захищений тунель передається безпосередньо у ваш локальний Docker-контейнер.

Результат:

  • 0 відкритих портів на роутері. Фаєрвол повністю закритий.
  • Працює за будь-яким типом підключення: домашній інтернет за CGNAT, мобільний модем 4G/5G або Starlink.
  • Справжня домашня IP-адреса на 100% прихована.
  • Автоматичний безкоштовний SSL/TLS сертифікат.

Що потрібно для початку?

  1. Власний домен (купити можна у будь-якого реєстратора від $2–$3 на рік).
  2. Безкоштовний акаунт Cloudflare, куди переведено DNS-сервери вашого домену.
  3. Будь-який сервер або ПК із встановленим Docker.

Крок 1. Створення тунелю в панелі Cloudflare Zero Trust

Сучасний спосіб налаштування не вимагає копатися в текстових конфігах — усе робиться через зручний хмарний дашборд:

  1. У панелі Cloudflare перейдіть у бічне меню Zero Trust (або відкрийте one.dash.cloudflare.com).
  2. Якщо ви вперше тут — створіть безкоштовну організацію (на безкоштовному тарифі доступно до 50 користувачів!).
  3. Перейдіть до розділу Networks ➔ Tunnels.
  4. Натисніть Add a tunnel і виберіть тип Cloudflare (cloudflared).
  5. Задайте зрозуміле ім’я (наприклад, homelab-docker).
  6. Натисніть Save tunnel.

Крок 2. Запуск контейнера cloudflared у Docker

На наступному екрані Cloudflare запропонує обрати середовище. Оберіть Docker. Панель покаже команду з унікальним секретним токеном тунелю:

1
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token ВАШ_ТОКЕН_ТУТ

Але для стабільної роботи краще оформити це як службу в docker-compose.yml.

Створимо папку на домашньому сервері:

1
2
mkdir -p /opt/cloudflared
cd /opt/cloudflared

Створюємо файл docker-compose.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run
    environment:
      - TUNNEL_TOKEN=eyJhIjoiYmMy...ВАШ_СЕКРЕТНИЙ_ТОКЕН...
    # Підключаємо до спільної мережі з іншими контейнерами:
    networks:
      - web-network

networks:
  web-network:
    external: true

Порада від профі: якщо помістити cloudflared в одну користувацьку мережу Docker (web-network) разом із вашими іншими сервісами (наприклад, Uptime Kuma чи Vaultwarden), вам навіть не потрібно відкривати порти на хості через ports:! Контейнери зможуть спілкуватися всередині Docker за своїми внутрішніми іменами (http://vaultwarden:80).

Запускаємо контейнер:

1
docker compose up -d

Поверніться у веб-інтерфейс Cloudflare: через кілька секунд статус конектора зміниться на зелений HEALTHY.


Крок 3. Маршрутизація піддоменів (Public Hostnames)

Тепер прив’яжемо наші домашні сайти до домену. Натисніть вкладку Public Hostname у налаштуваннях тунелю і додайте потрібні маршрути:

Приклад 1: Uptime Kuma

  • Subdomain: status
  • Domain: yourdomain.com
  • Type: HTTP
  • URL: uptime-kuma:3001 (або 192.168.1.100:3001, якщо сервіс на іншій машині).

Приклад 2: Менеджер паролів Vaultwarden

  • Subdomain: vault
  • Domain: yourdomain.com
  • Type: HTTP
  • URL: vaultwarden:80

Приклад 3: Галерея фото Immich

  • Subdomain: photos
  • Domain: yourdomain.com
  • Type: HTTP
  • URL: immich-server:2283

Натисніть Save Hostname. Cloudflare автоматично створить потрібний CNAME-запис у вашому DNS, випустить валідний SSL-сертифікат і зв’яже піддомен із локальним контейнером.

Спробуйте відкрити https://status.yourdomain.com з мобільного інтернету — сайт відкриється миттєво!


Крок 4. Секретна зброя: Cloudflare Access (Zero Trust SSO)

Уявіть, що у вас є критичні панелі керування (наприклад, Proxmox, Portainer або Beszel). Виставляти їх у відкритий інтернет страшно: раптом хтось підбере пароль або знайде 0-day вразливість?

За допомогою Cloudflare Access ви можете повісити поверх сайту захисний екран:

  1. У панелі Zero Trust перейдіть до Access ➔ Applications.
  2. Натисніть Add an application ➔ оберіть Self-hosted.
  3. Вкажіть ім’я (наприклад, Beszel Admin) та піддомен mon.yourdomain.com.
  4. Створіть правило доступу (Policy):
    • Action: Allow.
    • Rule: Include ➔ Emails — введіть вашу особисту пошту (наприклад, myemail@gmail.com).
    • Або підключіть вхід в один клік через Google / GitHub OAuth.
  5. Збережіть.

Як це виглядає на практиці:
Коли будь-хто заходить на mon.yourdomain.com, сервер навіть не віддає сторінку входу Beszel. Замість цього з’являється брендована сторінка Cloudflare із вимогою ввести пошту та 6-значний PIN-код (або увійти через Google).

Ботнети та автоматизовані сканери на кшталт Shodan просто натикаються на закриту стіну!


⚠️ Підводні камені, про які варто знати

Хоча Cloudflare Tunnel здається магією, є кілька нюансів:

  1. Обмеження на потокове відео (Пункт 2.8 TOS):
    Cloudflare у своїх безкоштовних правилах чітко забороняє ганяти сотні гігабайтів не-HTML трафіку (наприклад, важкий стрімінг 4K-відео з Plex чи Jellyfin). Якщо зловживати цим, акаунт можуть заблокувати. Для медіасерверів краще використовувати прямий Tailscale.
  2. Розмір завантаження файлу (Upload Limit):
    За замовчуванням максимальний розмір одного HTTP-запиту на безкоштовному тарифі Cloudflare становить 100 МБ. Якщо ви завантажуєте 10-гігабайтний архів через Nextcloud або 4K-відео в Immich одним шматком, запит обірветься з помилкою 413 Request Entity Too Large.
    Рішення: увімкнути чанкове завантаження (chunked uploads) у налаштуваннях клієнта додатку.
  3. Хмара бачить незашифрований трафік (SSL Termination):
    Оскільки Cloudflare виступає зворотним проксі, на їхніх серверах трафік розшифровується для інспекції WAF і знову шифрується у тунель. Якщо для вас принциповий 100% End-to-End шифрування без довіри до посередника — дивіться в бік власного Wireguard/Tailscale.

Що обрати: Tailscale чи Cloudflare Tunnel?

Найкращий підхід, яким користуються досвідчені сисадміни — це гібридна модель:

ЗавданняЩо використовувати?Чому?
Доступ для сім’ї та друзів (Immich, Vaultwarden, сайти)Cloudflare TunnelНе треба ставити додатки, гарний домен, SSL з коробки
Панелі з Zero Trust SSO (Beszel, Portainer)Cloudflare Tunnel + AccessЗахист одноразовим паролем на пошту або Google
Адміністрування хоумлабу (SSH, TrueNAS, Proxmox)TailscaleПрямий доступ до локальної підмережі без публічних доменів
Важкий медіастрімінг (Plex, Jellyfin)TailscaleЖодних лімітів швидкості та заборон у правилах

Підсумок

Cloudflare Tunnel — це один із найпотужніших інструментів для кожного, хто захоплюється self-hosted сервісами. Він повністю нівелює проблему сірих IP-адрес і дозволяє за 5 хвилин отримати захищену інфраструктуру корпоративного рівня абсолютно безкоштовно.

Спробуйте налаштувати свій перший тунель — і забудьте про муки з прокиданням портів на домашньому роутері раз і назавжди!

This post is licensed under CC BY 4.0 by the author.