Cloudflare Tunnel (Zero Trust): як безпечно відкрити Homelab та Docker в інтернет без білої IP та прокидання портів
🇬🇧 Read this article in English
Рано чи пізно кожен, хто розгортає власний Homelab або домашній міні-сервер (Proxmox, TrueNAS чи звичайний старий ПК із Docker), стикається з головною проблемою: як отримати доступ до своїх сервісів ззовні, коли ви не вдома?
Більшість іде класичним шляхом, який має купу болючих обмежень:
- «Сірий» IP від провайдера (CGNAT): у 90% домашніх користувачів немає публічної статичної IP-адреси. Провайдери або взагалі не дають відкривати порти, або вимагають за білий IP щомісячну платню.
- Прокидання портів (Port Forwarding) на роутері — це небезпечно: відкривши порти 80 та 443 на домашньому роутері, ви світите свою справжню домашню адресу всьому інтернету. Як ми бачили на прикладі нашого Cowrie Honeypot, ботнети починають сканувати вас уже за 3 хвилини. Будь-яка вразливість у роутері чи веб-сервері — і зловмисник опиняється всередині вашої домашньої мережі.
- VPN (наприклад, Tailscale) — ідеальний, але не для всіх: Tailscale чудовий для адміністрування, проте ви не можете просто дати посилання друзям чи рідним на домашній Immich без необхідності ставити клієнтський додаток на їхні телефони.
Ідеальне вирішення цієї дилеми — Cloudflare Tunnel (раніше відомий як Argo Tunnel) у зв’язці з платформою Cloudflare Zero Trust.
Мал. 1. Архітектура Cloudflare Tunnel: вихідне зашифроване з’єднання без відкритих портів на роутері, фільтрація трафіку через Cloudflare Edge та вхід за власним доменом
Як це працює: магія вихідного тунелю
Замість того, щоб відкривати «вхідні двері» (Inbound Ports) на вашому домашньому роутері, утиліта cloudflared у Docker-контейнері встановлює вихідне (Outbound) зашифроване з’єднання до найближчого дата-центру Cloudflare.
Коли ви або хтось інший вводите у браузері vault.yourdomain.com:
- Запит приходить на глобальну прикордонну мережу Cloudflare (Edge Network).
- Cloudflare перевіряє безпеку, фільтрує DDoS-атаки та шкідливих ботів.
- Якщо налаштовано Zero Trust Access, користувачеві показується екран авторизації (наприклад, вхід через Google чи одноразовий PIN на пошту).
- Трафік через захищений тунель передається безпосередньо у ваш локальний Docker-контейнер.
Результат:
- 0 відкритих портів на роутері. Фаєрвол повністю закритий.
- Працює за будь-яким типом підключення: домашній інтернет за CGNAT, мобільний модем 4G/5G або Starlink.
- Справжня домашня IP-адреса на 100% прихована.
- Автоматичний безкоштовний SSL/TLS сертифікат.
Що потрібно для початку?
- Власний домен (купити можна у будь-якого реєстратора від $2–$3 на рік).
- Безкоштовний акаунт Cloudflare, куди переведено DNS-сервери вашого домену.
- Будь-який сервер або ПК із встановленим Docker.
Крок 1. Створення тунелю в панелі Cloudflare Zero Trust
Сучасний спосіб налаштування не вимагає копатися в текстових конфігах — усе робиться через зручний хмарний дашборд:
- У панелі Cloudflare перейдіть у бічне меню Zero Trust (або відкрийте one.dash.cloudflare.com).
- Якщо ви вперше тут — створіть безкоштовну організацію (на безкоштовному тарифі доступно до 50 користувачів!).
- Перейдіть до розділу Networks ➔ Tunnels.
- Натисніть Add a tunnel і виберіть тип Cloudflare (cloudflared).
- Задайте зрозуміле ім’я (наприклад,
homelab-docker). - Натисніть 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 ви можете повісити поверх сайту захисний екран:
- У панелі Zero Trust перейдіть до Access ➔ Applications.
- Натисніть Add an application ➔ оберіть Self-hosted.
- Вкажіть ім’я (наприклад,
Beszel Admin) та піддоменmon.yourdomain.com. - Створіть правило доступу (Policy):
- Action: Allow.
- Rule: Include ➔ Emails — введіть вашу особисту пошту (наприклад,
myemail@gmail.com). - Або підключіть вхід в один клік через Google / GitHub OAuth.
- Збережіть.
Як це виглядає на практиці:
Коли будь-хто заходить на mon.yourdomain.com, сервер навіть не віддає сторінку входу Beszel. Замість цього з’являється брендована сторінка Cloudflare із вимогою ввести пошту та 6-значний PIN-код (або увійти через Google).
Ботнети та автоматизовані сканери на кшталт Shodan просто натикаються на закриту стіну!
⚠️ Підводні камені, про які варто знати
Хоча Cloudflare Tunnel здається магією, є кілька нюансів:
- Обмеження на потокове відео (Пункт 2.8 TOS):
Cloudflare у своїх безкоштовних правилах чітко забороняє ганяти сотні гігабайтів не-HTML трафіку (наприклад, важкий стрімінг 4K-відео з Plex чи Jellyfin). Якщо зловживати цим, акаунт можуть заблокувати. Для медіасерверів краще використовувати прямий Tailscale. - Розмір завантаження файлу (Upload Limit):
За замовчуванням максимальний розмір одного HTTP-запиту на безкоштовному тарифі Cloudflare становить 100 МБ. Якщо ви завантажуєте 10-гігабайтний архів через Nextcloud або 4K-відео в Immich одним шматком, запит обірветься з помилкою 413 Request Entity Too Large.
Рішення: увімкнути чанкове завантаження (chunked uploads) у налаштуваннях клієнта додатку. - Хмара бачить незашифрований трафік (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 хвилин отримати захищену інфраструктуру корпоративного рівня абсолютно безкоштовно.
Спробуйте налаштувати свій перший тунель — і забудьте про муки з прокиданням портів на домашньому роутері раз і назавжди!
