INTEGRITY Документация

Маршруты

По умолчанию узел Mesh доступен только по своему собственному Mesh IP. Чтобы сделать доступными другие устройства в подсети за узлом (серверы, базы данных, принтеры, устройства IoT, на которых нельзя запустить Cloudflare One Client : добавьте маршрут к узлу. Узел Mesh поддерживает два типа маршрутов:

Когда вы добавляете маршрут, узел Mesh выступает в роли шлюза: трафик, предназначенный для анонсируемого CIDR или имени хоста, направляется на этот узел, который доставляет его нужному хосту в локальной сети (или отправляет в публичный интернет).

Поддерживаются маршруты CIDR как для IPv4, так и для IPv6. Для маршрутов IPv6 требуется, чтобы узел Mesh профиль устройства настроено на использование MASQUE; они не будут работать, если профиль устройства использует WireGuard.

Когда использовать маршруты

flowchart LR
  subgraph subnet["Subnet 10.0.0.0/24"]
    node["Mesh node <br> 10.0.0.1"]
    db["Database <br> 10.0.0.50"]
    printer["Printer <br> 10.0.0.100"]
  end
  client["Client device <br> 100.96.0.10"] --> CF((Cloudflare)) --> node
  node --> db
  node --> printer

Управлять маршрутами CIDR

Используйте маршруты CIDR, чтобы перенаправлять трафик с узла Mesh на устройства в вашей локальной сети.

Добавьте маршрут

  1. В панели управления Cloudflare перейдите в Сеть > Mesh.

    Перейдите в Mesh ↗
  2. Выберите свой узел Mesh.

  3. Перейдите в Маршруты на вкладке.

  4. Выберите Добавить маршрут.

  5. Введите приватный CIDR, который нужно маршрутизировать через этот узел (например, 10.0.0.0/24).

  6. (Необязательно) добавьте описание маршрута.

  7. Выберите Добавить маршрут.

Необходимые разрешения API-токена

Хотя бы одно из следующих права доступа токена требуется:
  • Cloudflare One Networks Write
  • Cloudflare Tunnel Write
Создать маршрут туннеля
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/teamnet/routes" \
	--request POST \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"network": "10.0.0.0/24",
		"tunnel_id": "{mesh_node_id}",
		"comment": "Staging subnet"
	}'

Измените маршрут

  1. Перейдите в Сеть > Mesh > выберите свой узел > Маршруты на вкладке.
  2. Выберите значок редактирования рядом с маршрутом, который нужно изменить.
  3. Обновите CIDR или описание.
  4. Выберите Save.

Необходимые разрешения API-токена

Хотя бы одно из следующих права доступа токена требуется:
  • Cloudflare One Networks Write
  • Cloudflare Tunnel Write
Обновите маршрут туннеля
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/teamnet/routes/$ROUTE_ID" \
	--request PATCH \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"network": "10.0.0.0/24",
		"comment": "Updated description"
	}'

Удалите маршрут

  1. Перейдите в Сеть > Mesh > выберите свой узел > Маршруты на вкладке.
  2. Выберите значок удаления рядом с маршрутом.
  3. Подтвердите удаление.

Необходимые разрешения API-токена

Хотя бы одно из следующих права доступа токена требуется:
  • Cloudflare One Networks Write
  • Cloudflare Tunnel Write
Удалите маршрут туннеля
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/teamnet/routes/$ROUTE_ID" \
	--request DELETE \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"

Настройте Split Tunnels

Чтобы трафик доходил до анонсируемого вами CIDR, диапазон должен маршрутизироваться через Cloudflare как на узле Mesh, так и на клиентских устройствах.

На узле Mesh

В профиле устройства узла Mesh убедитесь, что анонсируемые маршруты CIDR проходят через Cloudflare:

Например, если вы анонсируете 10.0.0.0/24 и ваш список исключений Split Tunnel содержит 10.0.0.0/8, вам нужно удалить 10.0.0.0/8 и повторно добавьте части 10.0.0.0/8 диапазон, который вы не хотите маршрутизировать через Cloudflare.

На клиентских устройствах

Повторите ту же конфигурацию Split Tunnel в профилях устройств, используемых вашими клиентскими устройствами, чтобы объявленный CIDR маршрутизировался через Cloudflare.

Маршрутизация обратного трафика

Узел Mesh пересылает входящий трафик от Cloudflare устройствам в подсети. Однако для обратный трафик (ответы от устройств подсети обратно клиентам Mesh), устройствам подсети нужен обратный маршрут к узлу Mesh.

flowchart LR
  client["Client device <br> 100.96.0.10"] -- request --> CF((Cloudflare)) -- request --> node["Mesh node <br> 10.0.0.1"]
  node --> db["Database <br> 10.0.0.50"]
  db -. "response: <br> needs route to node" .-> node -. response .-> CF -. response .-> client

Способ настройки зависит от того, где установлен узел Mesh:

Вариант 1: узел Mesh является шлюзом по умолчанию

Если узел Mesh является шлюзом по умолчанию для подсети (или установлен на маршрутизаторе), дополнительная настройка не требуется: весь трафик от устройств подсети автоматически проходит через этот узел.

Вариант 2: узел Mesh не является шлюзом по умолчанию

Если узел Mesh является обычным хостом в подсети, настройте маршрутизатор подсети так, чтобы трафик Mesh отправлялся через этот узел. Добавьте статический маршрут:

Это гарантирует, что ответы клиентам Mesh пересылаются на узел Mesh для доставки через Cloudflare.

Маршрутизация между сайтами

Когда у вас есть узлы Mesh на нескольких сайтах, устройства из одной подсети могут обращаться к устройствам в другой подсети через Cloudflare.

flowchart TD
  subgraph siteA["Site A — 10.0.0.0/24"]
    serverA["Server <br> 10.0.0.50"] --- nodeA["Mesh node <br> 10.0.0.1"]
  end
  subgraph siteB["Site B — 192.168.1.0/24"]
    serverB["Server <br> 192.168.1.50"] --- nodeB["Mesh node <br> 192.168.1.1"]
  end
  nodeA <--> CF((Cloudflare))
  nodeB <--> CF

Чтобы это работало:

  1. Каждый узел Mesh должен анонсировать локальную подсеть как Маршрут CIDR чтобы Cloudflare знал, на какой узел перенаправлять трафик.
  2. CIDR-адреса удалённой подсети должны маршрутизироваться через Cloudflare на каждом узле. В настройках вашего узла Mesh Split Tunnel конфигурации добавьте CIDR удаленного сайта в список включения (или удалите его из списка исключения).
  3. Маршрутизатору каждого сайта требуются статические маршруты, направляющие удалённые подсети на локальный узел Mesh:

Маршрутизатор сайта A:

Маршрутизатор сайта B:

Для производственных развертываний типа site-to-site рассмотрите возможность включения высокая доступность на каждом узле. HA обеспечивает отказоустойчивость для маршрутов CIDR, анонсируемых узлом: если активная реплика выходит из строя, Cloudflare продвигает резервный узел, чтобы трафик к подсети продолжал поступать.

Фильтрация DNS

Чтобы отфильтровать DNS-запросы из подсети с помощью Cloudflare Gateway:

  1. Настройте DNS на вашем маршрутизаторе: Направьте DNS вашего маршрутизатора на IP адреса резолвера Gateway:

    • 172.64.36.1
    • 172.64.36.2
  2. Добавление IP-маршрутов в маршрутизатор: На своём маршрутизаторе добавьте статические маршруты, направляющие IP адреса резолвера Gateway на локальный IP адрес узла Mesh. Это позволяет DNS трафику достигать Cloudflare через этот узел.

    • Назначение: 172.64.36.1Next hop: 10.0.0.1 (локальный узел Mesh)
    • Назначение: 172.64.36.2Next hop: 10.0.0.1
  3. Настройте Split Tunnels: Убедитесь, что следующие IP-адреса маршрутизируются через Mesh-узел в вашем Split Tunnels конфигурация:

    • Внутренний IP-адрес DNS-резолвера подсети
    • Диапазон изначально разрешённых IP-адресов Gateway: 172.64.128.0/20 (IPv4) и 2606:4700:0cf1:4000::/64 (IPv6)

Gateway регистрирует DNS-запросы с указанием частного исходного IP-адреса устройства, с которого исходит запрос. Это можно использовать для создания политики Resolver для внутренних DNS-записей.

Маршруты хоста

Вместо анонсирования диапазона IP-адресов вы можете направлять трафик для определённого имени хоста на узел Mesh. Когда пользователь запрашивает это имя хоста, Cloudflare Gateway назначает исходный разрешённый IP-адрес и направляет трафик через узел.

Маршруты хоста заменяют виртуальные сети в качестве способа доступа к ресурсам: поскольку имя хоста уникально в глобальном масштабе, перекрывающиеся имена хостов не поддерживаются и имя хоста может быть маршрутизировано только на один узел или туннель одновременно.

  1. Запросы wiki.internal.local

  2. DNS-запрос
  3. Возвращает токен-IP, а затем переписывает адрес назначения на настоящий приватный IP-адрес.

    172.64.128.0/20
  4. Маршрут хоста
  5. Перенаправляет трафик на хост в локальной сети

  6. Частный хост

    wiki.internal.local · 10.0.0.50

Более подробно о потоке пакетов при маршрутизации по имени хоста см. в запись в блоге с анонсом.

Предварительные требования

Добавьте маршрут для имени хоста

  1. В панели управления Cloudflare перейдите в Сеть > Mesh.

    Перейдите в Mesh ↗
  2. Выберите свой узел Mesh.

  3. Перейдите в Маршруты на вкладке.

  4. Выберите Добавить маршрут, затем выберите Частное имя хоста.

  5. Введите полное доменное имя (FQDN), которое нужно маршрутизировать через этот узел (например, wiki.internal.local).

    Ограничения формата имени хоста

    • Ограничение символов: Должно быть короче 255 символов.
    • Поддерживаемые подстановочные знаки: Один подстановочный знак (*) допускается, и она должна представлять собой полную DNS-метку. Пример: *.internal.local
    • Неподдерживаемые подстановочные знаки: Следующие форматы подстановочных знаков не поддерживаются:
      • Частичные подстановочные знаки, такие как *-dev.internal.local или dev-*.internal.local.
      • Подстановочные знаки в середине, например foo*bar.internal.local или foo.*.internal.local.
      • Несколько подстановочных знаков в имени хоста, например *.*.internal.local.
    • Усечение подстановочных знаков: Начальные подстановочные знаки (*) обрезаются, и неявная точка (.) принимается по умолчанию. Например, *.internal.local сохраняется как internal.local но будет соответствовать всем поддоменам на уровне wildcard (охватывает foo.internal.local но не foo.bar.internal.local).
    • Удаление точек: Начальные и конечные точки (.) разрешены, но обрезаются.
  6. (Необязательно) добавьте описание маршрута.

  7. Выберите Добавить имя хоста.

Необходимые разрешения API-токена

Хотя бы одно из следующих права доступа токена требуется:
  • Cloudflare One Networks Write
  • Cloudflare Tunnel Write
Создать маршрут по имени хоста
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/zerotrust/routes/hostname" \
	--request POST \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"hostname": "wiki.internal.local",
		"tunnel_id": "{mesh_node_id}",
		"comment": "Internal wiki"
	}'

Настройте разрешение DNS

Для частный имя хоста, Gateway должен иметь возможность разрешить его в приватный IP-адрес. Как это настроить, зависит от того, используют ли DNS-разрешение и трафик приложения одинаковый connector или другой коннекторы.

Узел разрешает имя хоста (по умолчанию)

По умолчанию узел Mesh разрешает имя хоста через DNS-сервер, настроенный на его хост-машине (например, в /etc/resolv.conf в Linux): так же, как cloudflared делает. Если узел уже может разрешать имя хоста в приватный IP-адрес через этот резолвер, дополнительная настройка не требуется.

Если узел не может самостоятельно разрешить имя хоста, проще всего добавить запись в файл hosts узла (например, /etc/hosts в Linux), сопоставляющей имя хоста с его приватным IP-адресом. В отличие от Cloudflare Tunnel, узел Mesh не требуют запуска выделенного DNS-сервера:

/etc/hosts
10.0.0.50 wiki.internal.local

Split DNS: трафик DNS и трафик приложений используют разные коннекторы

Вам нужен только Gateway политика Resolver когда DNS-запрос должен быть отправлен на другой connector, чем трафик приложения. Внутренний DNS-сервер может находиться за одним узлом Mesh или Cloudflare Tunnel, тогда как приложение доступно через другой. В этом случае:

  1. Добавьте Маршрут CIDR для IP-адреса DNS-сервера, чтобы Gateway мог обращаться к нему через коннектор, на котором работает DNS-сервер (узел Mesh или Cloudflare Tunnel).
  2. Создайте политика Resolver который отправляет DNS-запросы для этого имени хоста (или его домена) на указанный внутренний DNS-сервер.

Для публичный имя хоста, разрешением занимается узел Mesh: Gateway отправляет DNS-запрос на узел, узел разрешает его через свой вышестоящий DNS-провайдер, а затем маршрутизирует пакет к пункту назначения и выполняет исходящий трафик, используя собственный публичный IP-адрес. Внутренний DNS-сервер или политика резолвера не требуются.

Защита трафика по имени хоста

После добавления маршрута для имени хоста защитите его с помощью Самостоятельно размещённое приложение Access или Политики Network Gateway. Подробности и примеры см. в Подключите частное имя хоста.

Ограничения

Начиная с Chrome 142, Local Network Access (LNA) ограничивает запросы с веб-сайтов к локальным IP-адресам. LNA реализован на уровне движка Chromium, поэтому это затрагивает все браузеры на основе Chromium (например, Microsoft Edge, Brave и Opera), а не только Google Chrome. Это может затронуть аккаунты, у которых Gateway диапазон исходных разрешённых IP-адресов по-прежнему выбирается из адресного пространства Carrier-Grade NAT (CGNAT) (100.64.0.0/10) например, устаревший диапазон по умолчанию 100.80.0.0/16, или пользовательский диапазон, настроенный в пространстве CGNAT. Такие браузеры относят подобные адреса к локальной сети. Когда сайт, загруженный с публичного IP-адреса, отправляет подзапросы к домену, который изначально был разрешён в IP-адрес из этого диапазона, браузер расценивает это как запрос из публичной сети в локальную и показывает пользователю запрос на разрешение доступа к устройствам локальной сети. Браузер блокирует запросы к этим доменам, пока пользователь не примет этот запрос.

Обычно это происходит, когда Политика Egress совпадает с часто используемыми доменами (например, cloudfront.net или github.com), из-за чего подзапросы с общедоступных страниц разрешаются в пространство CGNAT.

Учетные записи, использующие текущий стандартный начальный диапазон разрешенных IP-адресов (172.64.128.0/20) не затрагиваются, поскольку этот диапазон относится к публичному адресному пространству Cloudflare, а не к CGNAT. Если ваш аккаунт был создан до изменения этого значения по умолчанию или вы настроили собственный диапазон в пространстве CGNAT, обратитесь к Настройте начальные разрешённые IP-адреса и перейдите на диапазон адресов вне CGNAT, вместо того чтобы использовать следующие обходные пути для браузера.

Приведённые ниже обходные решения используют политики Google Chrome Enterprise. Если ваша организация использует другой браузер на основе Chromium, обратитесь к документации по корпоративным политикам этого браузера, чтобы найти аналогичный параметр.

Iframe

Если затронутый запрос исходит из iframe (например, из приложения, встроенного в сторонний портал), в iframe должен быть объявлен local-network-access разрешение, чтобы запрос браузера отображался в родительском фрейме:

Если iframe вложены друг в друга, каждый iframe в цепочке должен содержать соответствующий атрибут. Поскольку сторонние приложения сами управляют атрибутами своих iframe, конечный пользователь не всегда может это настроить.

Обходные пути

Чтобы избежать этой проблемы, выберите один из следующих вариантов: