База знаний

Cloudflare DNS, Workers и Tunnels — три сервиса, которые должен знать каждый разработчик

DNS-управление, проксирование и оранжевое облако. Серверный код на Edge без серверов. Доступ к локальному серверу без белого IP. Три ключевых сервиса Cloudflare в одном руководстве.

Опубликовано

Три сервиса Cloudflare, которые закрывают большинство задач разработчика на бесплатном тарифе: DNS для управления доменами и проксирования, Workers для серверного кода без серверов, Tunnels для доступа к локальным машинам из интернета. Каждый из них работает самостоятельно, но вместе они дают полную инфраструктуру для проекта любого масштаба.


Часть 1. Cloudflare DNS


Что такое Cloudflare DNS

DNS (Domain Name System) — это система, которая превращает доменные имена (mysite.ru) в IP-адреса серверов. Cloudflare DNS — один из самых быстрых и надёжных DNS-хостингов в мире. Он бесплатный, без ограничений по количеству записей и доменов.

Когда вы переносите домен на Cloudflare DNS, вы получаете:

  • Быстрое разрешение имён (серверы в 330+ дата-центрах)
  • Бесплатную DDoS-защиту на уровне DNS
  • Возможность проксирования трафика через Cloudflare (CDN, WAF, SSL)
  • Удобную панель управления записями
  • Интеграцию со всеми остальными сервисами Cloudflare
📌
Cloudflare DNS — это фундамент. Без переноса домена на Cloudflare невозможно использовать Workers, Pages, Tunnels и другие сервисы в полном объёме.

Типы DNS-записей

Каждая DNS-запись — это инструкция для интернета: куда отправлять запросы к вашему домену.

ТипДля чегоПример значения
AУказывает IPv4-адрес сервера203.0.113.50
AAAAУказывает IPv6-адрес сервера2001:db8::1
CNAMEАлиас — перенаправляет на другой доменmysite.pages.dev
MXПочтовый сервер для доменаmx1.mailprovider.com
TXTТекстовая запись (SPF, DKIM, верификация)v=spf1 include:_spf.google.com ~all
NSNameserver-серверы доменаanna.ns.cloudflare.com
SRVСлужебная запись (порт + приоритет)Для VoIP, игровых серверов
CAAКакие центры сертификации могут выпускать SSLletsencrypt.org

Оранжевое облако: проксирование vs DNS-only

Ключевая фича Cloudflare DNS — переключатель проксирования (оранжевое / серое облако).

flowchart LR
    A["Посетитель"] --> B{"Оранжевое облако?"}
    B -->|Да| C["Cloudflare CDN"]
    C --> D["Ваш сервер"]
    B -->|Нет| D

🟠 Оранжевое облако (Proxied)

Трафик идёт через Cloudflare:

  • IP сервера скрыт — видны только IP Cloudflare
  • Работает CDN — статика кэшируется и раздаётся быстрее
  • Включается DDoS-защита, WAF, Bot Fight Mode
  • Автоматический SSL-сертификат
  • Работают Page Rules, Redirect Rules, Transform Rules

⚪ Серое облако (DNS only)

Cloudflare работает как обычный DNS — возвращает реальный IP сервера:

  • Нет CDN, нет защиты, нет SSL от Cloudflare
  • Посетитель подключается напрямую к серверу
  • IP сервера виден всем

Когда что использовать

ЗаписьОблакоПочему
A / CNAME для сайта🟠 ОранжевоеCDN, защита, SSL
A / CNAME для API🟠 ОранжевоеЗащита, скрытие IP
MX (почта)⚪ СероеПочтовые серверы не работают через прокси
A для SSH / FTP⚪ СероеCloudflare проксирует только HTTP/HTTPS
CNAME для Tunnel🟠 ОранжевоеTunnel работает через прокси
TXT (SPF, DKIM)TXT не поддерживает проксирование
⚠️
Никогда не включайте оранжевое облако для MX-записей. Почта перестанет работать. Cloudflare проксирует только HTTP/HTTPS-трафик.

Перенос домена на Cloudflare DNS

Перенос означает: вы меняете nameservers у регистратора домена, чтобы Cloudflare стал авторитетным DNS-сервером.

Шаг 1. Добавьте домен

  1. Откройте dash.cloudflare.com
  2. Нажмите Add a site
  3. Введите домен → выберите Free
  4. Cloudflare просканирует существующие DNS-записи

Шаг 2. Проверьте записи

Cloudflare импортирует записи автоматически, но проверьте:

  • A-запись основного домена (IP сервера)
  • CNAME для www
  • MX-записи (облако должно быть серым)
  • TXT-записи (SPF, DKIM, верификация Google/Yandex)

Шаг 3. Замените nameservers

Cloudflare выдаст два NS-адреса. Зайдите в панель регистратора и замените:

РегистраторГде менять
Reg.ruДомены → Управление → DNS-серверы
NamecheapDomain List → Manage → Nameservers → Custom DNS
GoDaddyMy Products → DNS → Nameservers → Change
BegetДомены → DNS
TimeWebДомены и поддомены → NS серверы

Шаг 4. Дождитесь активации

Обычно 10–30 минут, максимум 24 часа. Cloudflare пришлёт email.

После активации:

  • DNS управляется через Cloudflare
  • Автоматически выпускается SSL-сертификат
  • Все сервисы Cloudflare доступны для этого домена

Практические настройки DNS

Подключение сайта к серверу

Тип: A
Имя: @
Значение: 203.0.113.50
Облако: 🟠 (Proxied)
Тип: CNAME
Имя: www
Значение: mysite.ru
Облако: 🟠 (Proxied)

Подключение Cloudflare Pages

Тип: CNAME
Имя: @
Значение: my-project.pages.dev
Облако: 🟠 (Proxied)

Настройка почты (Gmail через Google Workspace)

Тип: MX
Имя: @
Значение: aspmx.l.google.com
Приоритет: 1
Облако: ⚪ (DNS only)
Тип: TXT
Имя: @
Значение: v=spf1 include:_spf.google.com ~all

Email Routing (пересылка на Gmail)

Тип: MX
Имя: @
Значение: (Cloudflare подставит автоматически)
Облако: ⚪ (DNS only)

Настраивается в разделе Email → Email Routing — Cloudflare сам создаст нужные записи.

Подключение Tunnel

Тип: CNAME
Имя: nas
Значение: <tunnel-id>.cfargotunnel.com
Облако: 🟠 (Proxied)
💡
Если создаёте Tunnel через дашборд — Cloudflare автоматически создаст CNAME-запись. Вручную добавлять не нужно.

Полезные фичи DNS

DNSSEC

Защита от подмены DNS-ответов. Включается одной кнопкой: DNS → Settings → Enable DNSSEC. После включения нужно добавить DS-запись у регистратора (Cloudflare покажет параметры).

Always Use HTTPS

Перенаправляет все HTTP-запросы на HTTPS. Включается в SSL/TLS → Edge Certificates → Always Use HTTPS.

Wildcard-записи

Запись *.mysite.ru перенаправляет все поддомены на один IP или CNAME. Полезно для мультитенантных приложений.


Часть 2. Cloudflare Workers


Что такое Workers

Cloudflare Workers — платформа для запуска серверного кода на Edge-серверах Cloudflare. Код выполняется на ближайшем к пользователю сервере из 330+ дата-центров.

Проще говоря: вы пишете функцию на JavaScript или TypeScript, деплоите её — и она работает по всему миру без серверов, без контейнеров, без DevOps.

Зачем нужен

  • API-прокси — скрыть ключи от клиента, добавить CORS
  • Редиректы — сложная логика перенаправлений без Page Rules
  • Обработка вебхуков — принять данные от Telegram, Stripe, GitHub
  • Telegram-бот — бот целиком на Workers, без сервера
  • SSR — серверный рендеринг для фронтенд-фреймворков
  • A/B тестирование — разные версии страницы для разных пользователей
  • Геолокация — контент на основе страны или города посетителя

Быстрый старт: первый Worker за 5 минут

Шаг 1. Установите wrangler

npm install -g wrangler
wrangler login

Шаг 2. Создайте проект

npm create cloudflare@latest my-worker
cd my-worker

Выберите Hello World шаблон.

Шаг 3. Напишите код

Откройте src/index.ts (или index.js):

export default {
  async fetch(request) {
    return new Response("Привет из Cloudflare Workers!", {
      headers: { "Content-Type": "text/plain;charset=UTF-8" },
    });
  },
};

Шаг 4. Запустите локально

wrangler dev

Откройте http://localhost:8787 — вы увидите ответ Worker.

Шаг 5. Деплой

wrangler deploy

Worker доступен по адресу https://my-worker.<your-subdomain>.workers.dev.

💡
workers.dev-домен выдаётся бесплатно. Но вы можете привязать Worker к своему домену через Routes в дашборде.

Практические примеры

API-прокси (скрыть ключи от клиента)

Клиент вызывает ваш Worker, Worker обращается к внешнему API с секретным ключом:

export default {
  async fetch(request, env) {
    const apiUrl = "https://api.example.com/data";
    const response = await fetch(apiUrl, {
      headers: {
        "Authorization": `Bearer ${env.API_KEY}`,
        "Content-Type": "application/json",
      },
    });

    return new Response(response.body, {
      headers: {
        "Content-Type": "application/json",
        "Access-Control-Allow-Origin": "*",
      },
    });
  },
};

Секрет API_KEY хранится в Settings → Variables (зашифрован).

Редирект с логикой

export default {
  async fetch(request) {
    const url = new URL(request.url);

    // Редирект старых URL
    const redirects = {
      "/old-page": "/new-page",
      "/blog/2024": "/archive/2024",
    };

    if (redirects[url.pathname]) {
      return Response.redirect(
        `${url.origin}${redirects[url.pathname]}`, 301
      );
    }

    // Геолокация: русскоязычных — на /ru
    const country = request.cf?.country;
    if (url.pathname === "/" && country === "RU") {
      return Response.redirect(`${url.origin}/ru`, 302);
    }

    return fetch(request);
  },
};

Простой Telegram-бот

export default {
  async fetch(request, env) {
    if (request.method !== "POST") {
      return new Response("OK");
    }

    const update = await request.json();
    const chatId = update.message?.chat?.id;
    const text = update.message?.text;

    if (chatId && text) {
      await fetch(
        `https://api.telegram.org/bot${env.BOT_TOKEN}/sendMessage`,
        {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify({
            chat_id: chatId,
            text: `Вы написали: ${text}`,
          }),
        }
      );
    }

    return new Response("OK");
  },
};

Установите вебхук:

https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://my-bot.workers.dev

KV — key-value хранилище

Workers KV — глобальное хранилище ключ-значение. Данные реплицируются по всем Edge-серверам. Идеально для конфигурации, кэша и небольших данных.

Создание KV namespace

wrangler kv namespace create MY_KV

Добавьте привязку в wrangler.toml:

[[kv_namespaces]]
binding = "MY_KV"
id = "<namespace-id>"

Использование в коде

export default {
  async fetch(request, env) {
    // Записать
    await env.MY_KV.put("user:123", JSON.stringify({
      name: "Sergey",
      plan: "free"
    }));

    // Прочитать
    const user = await env.MY_KV.get("user:123", "json");

    // Удалить
    await env.MY_KV.delete("user:123");

    return Response.json(user);
  },
};

Лимиты KV (бесплатный тариф)

ПараметрFreePaid ($5/мес Workers)
Чтений в день100 000Безлимитно
Записей в день1 000Безлимитно
Хранилище1 ГББезлимитно
Макс. размер значения25 МБ25 МБ
Макс. размер ключа512 байт512 байт
💡
KV оптимизирован для чтения. Записи eventual-consistent — изменение может стать видимым на всех серверах через 30–60 секунд. Для частых записей используйте Durable Objects или D1.

Другие хранилища Workers

ХранилищеТипДля чегоБесплатно
KVKey-valueКонфиги, кэш, сессии1 ГБ, 100K чтений/день
R2Object storageФайлы, картинки, бэкапы10 ГБ, egress бесплатно
D1SQLiteРеляционные данные5 ГБ
Durable ObjectsStatefulЧаты, счётчики, координацияТолько платный план

Привязка Worker к своему домену

Worker работает на *.workers.dev, но можно привязать к своему домену:

  1. Откройте домен в Cloudflare → Workers Routes
  2. Добавьте маршрут: api.mysite.ru/* → выберите Worker
  3. Убедитесь, что DNS-запись для api.mysite.ru существует (A или CNAME с оранжевым облаком)

Теперь https://api.mysite.ru/любой-путь обрабатывается вашим Worker.


Лимиты Workers (бесплатный тариф)

ПараметрFreePaid ($5/мес)
Запросов в день100 00010 миллионов (включено)
CPU time / запрос10 мс30 с
Размер скрипта1 МБ10 МБ
Количество Workers100500
Cron Triggers55
Cold start< 1 мс< 1 мс
📌
100 000 запросов в день — это много. Для API-прокси, ботов, редиректов и обработки форм бесплатного тарифа хватает с большим запасом.

Часть 3. Cloudflare Tunnels


Что такое Tunnels

Cloudflare Tunnel (раньше Argo Tunnel) — сервис, который создаёт зашифрованное соединение между вашим локальным сервером и глобальной сетью Cloudflare. Без белого IP, без проброса портов, без настройки NAT.

Как это работает:

flowchart LR
    A["Посетитель"] --> B["Cloudflare CDN"]
    B --> C["Tunnel"]
    C --> D["cloudflared на вашем сервере"]
    D --> E["localhost:3000"]
  1. На вашем сервере запускается демон cloudflared
  2. Он устанавливает исходящее соединение с Cloudflare (не входящее!)
  3. Cloudflare привязывает поддомен к этому туннелю
  4. Посетитель заходит на app.mysite.ru → Cloudflare → туннель → ваш localhost

Весь трафик идёт через Cloudflare с SSL, CDN и защитой. Ваш IP скрыт. Порты закрыты.

💡
cloudflared устанавливает только исходящие подключения. Вам не нужно открывать порты на файрволе или роутере. Это безопаснее, чем проброс портов.

Зачем нужен Tunnel

  • Показать localhost заказчику — разрабатываете на ноутбуке, клиент видит результат по красивому URL
  • Домашний NAS — доступ к Synology, TrueNAS, Raspberry Pi из интернета без белого IP
  • Webhook для разработки — Telegram, Stripe, GitHub шлют вебхуки на ваш localhost
  • Self-hosted инструменты — Grafana, Gitea, n8n, Home Assistant доступны по HTTPS
  • Staging-сервер — показать staging-версию проекта без деплоя на хостинг
  • SSH без белого IP — безопасный доступ к серверу через Cloudflare Access

Быстрый старт: Tunnel за 5 минут

Вариант 1. Через дашборд (рекомендуется)

  1. Откройте dash.cloudflare.comZero TrustNetworksTunnels
  2. Нажмите Create a tunnel
  3. Выберите Cloudflared → задайте имя
  4. Скопируйте команду установки cloudflared для вашей ОС
  5. Запустите команду на сервере — туннель подключится
  6. Добавьте Public hostname: поддомен → http://localhost:3000

Готово. Ваш app.mysite.ru ведёт на localhost:3000.

Вариант 2. Через CLI

# Установите cloudflared
# macOS
brew install 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

# Windows
winget install Cloudflare.cloudflared
# Авторизуйтесь
cloudflared tunnel login

# Создайте туннель
cloudflared tunnel create my-tunnel

# Настройте DNS
cloudflared tunnel route dns my-tunnel app.mysite.ru

# Запустите
cloudflared tunnel --url http://localhost:3000 run my-tunnel

Конфигурация через файл

Для постоянной работы создайте ~/.cloudflared/config.yml:

tunnel: <tunnel-id>
credentials-file: /root/.cloudflared/<tunnel-id>.json

ingress:
  # Веб-приложение
  - hostname: app.mysite.ru
    service: http://localhost:3000

  # NAS
  - hostname: nas.mysite.ru
    service: https://192.168.1.100:5001
    originRequest:
      noTLSVerify: true

  # Grafana
  - hostname: grafana.mysite.ru
    service: http://localhost:3001

  # Обязательное правило по умолчанию
  - service: http_status:404

Запуск:

cloudflared tunnel run my-tunnel
📌
Один туннель может обслуживать несколько поддоменов. В ingress перечислите все hostname — cloudflared будет маршрутизировать запросы к нужному сервису.

Tunnel как системный сервис

Чтобы туннель запускался автоматически при старте сервера:

# Linux
sudo cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
# macOS
sudo cloudflared service install
sudo launchctl load /Library/LaunchDaemons/com.cloudflare.cloudflared.plist

Теперь туннель переживёт перезагрузку.


Quick Tunnel (без настройки)

Для быстрого показа localhost — без настройки домена, без авторизации:

cloudflared tunnel --url http://localhost:3000

Cloudflare выдаст временный URL вроде https://random-words.trycloudflare.com. Работает, пока запущена команда. Удобно для:

  • Быстрой демонстрации
  • Тестирования вебхуков
  • Показа прототипа коллеге
⚠️
Quick Tunnel — временный. URL меняется при каждом запуске. Для постоянного доступа используйте именованный туннель с привязкой к домену.

Практические сценарии

Домашний NAS (Synology)

  1. Установите cloudflared на NAS (Docker или пакет)
  2. Создайте туннель через дашборд
  3. Добавьте hostname: nas.mysite.ruhttps://localhost:5001
  4. Включите noTLSVerify: true (у Synology самоподписанный сертификат)
  5. Опционально: добавьте Cloudflare Access для авторизации

Webhook для разработки

  1. Запустите Quick Tunnel: cloudflared tunnel --url http://localhost:8080
  2. Получите URL
  3. Укажите его как webhook URL в Telegram / Stripe / GitHub
  4. Запросы приходят на ваш localhost

Home Assistant

  1. Создайте туннель
  2. Hostname: home.mysite.ruhttp://localhost:8123
  3. В configuration.yaml Home Assistant добавьте:
http:
  use_x_forwarded_for: true
  trusted_proxies:
    - 172.30.33.0/24
    - 0.0.0.0/0

n8n (self-hosted автоматизация)

  1. Hostname: n8n.mysite.ruhttp://localhost:5678
  2. Добавьте Cloudflare Access, чтобы закрыть доступ посторонним

Tunnel + Cloudflare Access

Cloudflare Access позволяет закрыть доступ к Tunnel за авторизацию. Бесплатно до 50 пользователей.

  1. Zero TrustAccessApplicationsAdd an application
  2. Тип: Self-hosted
  3. Домен: grafana.mysite.ru
  4. Политика: Allow → Emails ending in @mycompany.com

Теперь при заходе на grafana.mysite.ru Cloudflare покажет экран авторизации. Только разрешённые пользователи попадут дальше.


Tunnel vs альтернативы

ПараметрCloudflare TunnelngrokTailscale Funnel
ЦенаБесплатноБесплатно (лимиты)Бесплатно (лимиты)
Свой доменДаТолько платноНет
Несколько хостовДа (ingress)Один на туннельОдин
CDN и защитаВключеныНетНет
Access (авторизация)50 пользователей бесплатноOAuth (платно)Tailscale ACL
Постоянный URLДаТолько платноДа
Системный сервисДаДа (платно)Да

Общий чеклист


DNS

Домен добавлен в Cloudflare
Nameservers заменены у регистратора
DNS-записи проверены (A, CNAME, MX, TXT)
Оранжевое облако включено для веб-записей
Оранжевое облако выключено для MX
SSL/TLS режим: Full (Strict)
DNSSEC включён
Always Use HTTPS включён

Workers

wrangler установлен и авторизован
Первый Worker задеплоен
Секреты хранятся в Environment Variables
Worker привязан к домену (если нужно)
KV namespace создан (если нужно)

Tunnels

cloudflared установлен
Туннель создан и подключён
Public hostname настроен
cloudflared работает как сервис
Cloudflare Access настроен для приватных сервисов

Ссылки

DNS

Workers

Tunnels


По теме

База знаний: Cloudflare — бесплатная защита, ускорение и управление доменами для любого сайта

База знаний: Cloudflare Pages — бесплатный хостинг статических сайтов с деплоем из GitHub

База знаний: GitHub Pages — бесплатный хостинг статических сайтов прямо из GitHub


Если хотите разобраться, как настроить DNS, поднять Worker или пробросить Tunnel для вашего проекта — пишите в Telegram @pimenov.

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov.