跳转到内容
搜索文档

解析器策略

最后更新 查看 MarkdownAgent 设置

默认情况下,Gateway 将 DNS 请求发送到 Cloudflare 的公共 DNS 解析器 1.1.1.1 进行解析。企业用户可以转而创建 Gateway 策略,将 DNS 查询路由到自定义解析器。

flowchart TD
    %% Accessibility
    accTitle: Gateway 如何路由 DNS 查询
    accDescr: 描述 Cloudflare Gateway 将 DNS 查询从终端通过 DNS 和解析器策略路由回用户的顺序的流程图。

    %% Flowchart
    user(["用户"])-->endpoint[/"Gateway DNS 终端"/]

    endpoint-->query["DNS 策略(查询)"]

    query-->resolver["解析器策略"]

    resolver--"路由到 </br>自定义解析器"-->response["DNS 策略(响应)"]

    response--"返回响应"-->user

即使您的解析器的 IP 地址重叠,Gateway 也会根据匹配策略将用户流量路由到您配置的 DNS 解析器。

使用场景

如果您需要访问非公开路由的域(例如私有网络服务或内部资源),可以使用解析器策略。如果您需要访问受保护的 DNS 服务或希望简化多个位置的 DNS 管理,也可以使用解析器策略。

内部 DNS

Cloudflare 内部 DNS 允许您管理私有网络上内部资源的 DNS 记录。在内部 DNS 中配置的 DNS 区域只能由 Gateway 解析器进行查询。通过解析器策略,您可以根据查询的上下文(例如地理位置的已知源 IP)确定 Gateway 如何解析您组织的 DNS 查询以解析为内部资源。

要开始使用解析器策略解析内部 DNS 查询,请参阅快速入门

本地域回退(Local Domain Fallback)

当您的 DNS 服务器可从 Cloudflare 网络访问时(例如,通过 Cloudflare Tunnel、IPsec/GRE 隧道或公共互联网),请使用解析器策略。当 DNS 服务器仅能从用户设备访问时,请使用本地域回退(Local Domain Fallback)

如果为同一台设备同时配置了本地域回退(Local Domain Fallback)和解析器策略,Cloudflare 将首先应用客户端的本地域回退规则。如果您使用 Cloudflare One 客户端将 DNS 查询引导至 Gateway 并使用解析器策略路由它们,则查询的源 IP 将是 Cloudflare One 客户端分配的 IP 地址。

解析器连接

解析器策略支持 TCP 和 UDP 连接。自定义解析器可以通过 IPv4 或 IPv6 指向互联网,或指向私有网络服务,例如 Magic 隧道。策略默认使用端口 53。您可以通过在策略中自定义端口来更改解析器使用的端口。

您可以通过启用 DNS 防火墙(DNS Firewall)来保护您的权威域名服务器免受 DDoS 攻击。

Cloudflare Tunnel

您可以使用 Cloudflare Tunnel 配置到连接到 Cloudflare 的私有解析器的连接。为确保 cloudflared 能够将 UDP 流量路由到您的解析器,请通过 QUIC 连接您的隧道。

有关使用 Cloudflare Tunnel 将私有 DNS 解析器连接到 Cloudflare 的更多信息,请参阅私有 DNS(Private DNS)

Cloudflare WAN

要启用连接到通过 Cloudflare WAN 连接到 Cloudflare 的私有解析器,请联系您的账户团队。

可用的 DNS 终端

解析器策略可以路由来自以下 DNS 终端的查询以进行解析:

Gateway 无论使用何种终端都将对您的查询进行过滤、解析和日志记录。

创建解析器策略

要创建解析器策略:

  1. Cloudflare 仪表板中,转到 Zero Trust > Traffic policies(流量策略)> Resolver policies(解析器策略)

  2. 选择 Add a policy(添加策略)

  3. 为您期望的流量创建一个表达式。例如,您可以解析内部服务的主机名:

    选择器 运算符
    Host(主机) in(属于) internal.example.com

    确保您的目标不受本地域回退的限制。

  4. Select DNS resolver(选择 DNS 解析器) 中,选择 Configure custom DNS resolvers(配置自定义 DNS 解析器)。

  5. 输入自定义 DNS 解析器的 IP 地址。当您输入 IP 地址时,Gateway 将在 Zero Trust 中配置的虚拟网络中进行搜索。

  6. Network(网络) 中,选择是公开路由查询(路由到互联网)还是私有路由查询(路由到私有网络服务)。

  7. (可选)为每个 IP 地址输入自定义端口。

  8. 选择 Create policy(创建策略)

自定义解析器将保存到您的账户中以备后用。您可以在一个策略中添加最多 10 个 IPv4 和 10 个 IPv6 地址。

  1. 向您的 cloudflare_api_token 添加以下权限:

    • Zero Trust Write
  2. 使用 cloudflare_zero_trust_gateway_policy 资源创建解析器策略:

    resource "cloudflare_zero_trust_gateway_policy" "resolver_policy" {
    	name        = "Example resolver policy"
    	enabled     = true
    	account_id  = var.cloudflare_account_id
    	description = "TERRAFORM MANAGED resolver policy"
    	action      = "resolve"
    	traffic     = "dns.fqdn in {\"internal.example.com\"}"
    	identity    = "identity.email in {\"jdoe@example.com\"}"
    	precedence  = 1
    	rule_settings = {
    			dns_resolvers = {
    			# 您可以在一个策略中添加最多 10 个 IPv4 和 10 个 IPv6 地址。
    				ipv4 = [{
    					ip = "192.0.2.24"
    					port = 53
    					route_through_private_network = true
    					vnet_id = cloudflare_zero_trust_tunnel_cloudflared_virtual_network.staging_vnet.id
    				}]
    				ipv6 = [{
    					ip = "2001:DB8::"
    					port = 53
    					route_through_private_network = true
    					vnet_id = cloudflare_zero_trust_tunnel_cloudflared_virtual_network.staging_vnet.id
    				}]
    			}
    	}
    }

当用户的查询与解析器策略匹配时,Gateway 将按以下顺序将查询发送到您列出的解析器:

  1. 公共解析器
  2. 账户默认虚拟网络后面的私有解析器
  3. 自定义虚拟网络后面的私有解析器

Gateway 将缓存最快的解析器,以用于后续查询。解析器优先级针对每个数据中心在每个用户的基础上进行缓存。

有关创建 DNS 策略的更多信息,请参阅 DNS 策略

选择器

内容类别

使用此选择器可过滤属于特定 内容类别 的域名。

UI 名称 API 示例 评估阶段
Content Categories(内容类别) any(dns.content_category[*] in {1}) DNS 解析前

DNS 解析器 IP

使用此选择器可将策略应用于到达与已注册 DNS 位置对齐的 Gateway 解析器 IP 地址的 DNS 查询。对于大多数 Gateway 客户,这是一个 IPv4 任播地址,使用此 IPv4 地址创建的策略将适用于所有 DNS 位置。然而,每个 DNS 位置都有一个专用的 IPv6 地址,并且某些 Gateway 客户已获得专用的 IPv4 地址——这两者都可用于将策略应用于特定的已注册 DNS 位置。

UI 名称 API 示例 评估阶段
DNS Resolver IP(DNS 解析器 IP) any(dns.resolved_ip[*] == 198.51.100.0) DNS 解析前

DoH 子域

使用此选择器可匹配通过 DNS-over-HTTPS (DoH) 到达且发往为每个 DNS 位置配置的 DoH 端点的 DNS 查询。例如,您可以通过选择 DoH 子域名 (DoH Subdomain) 选择器并输入值 abcdefg,来使用 DoH 端点为 abcdefg.cloudflare-gateway.com 的 DNS 位置。

UI 名称 API 示例 评估阶段
DoH Subdomain(DoH 子域名) dns.doh_subdomain == "abcdefg" DNS 解析前

域(Domain)

使用此选择器可匹配某个域名及其所有子域名。例如,您可以匹配 example.com 及其子域名,如 www.example.com

UI 名称 API 示例 评估阶段
Domain(域名) any(dns.domains[*] == "example.com") DNS 解析前

Gateway 策略不支持直接使用包含非拉丁字符的 domain。要使用包含非拉丁字符的 domain,请将其添加到列表中。

主机

使用此选择器仅匹配指定的主机名。例如,您可以匹配 test.example.com,但不能匹配 example.comwww.test.example.com

UI 名称 API 示例 评估阶段
Host(主机) dns.fqdn == "example.com" DNS 解析前

Gateway 策略不支持直接使用包含非拉丁字符的 hostname。要使用包含非拉丁字符的 hostname,请将其添加到列表中。

位置

使用此选择器将策略应用于特定的 Gateway DNS 位置或一组位置。

UI 名称 API 示例 评估阶段
Location(位置) dns.location in {"location_uuid_1" "location_uuid_2"} DNS 解析前

查询记录类型

使用此选择器选择您要对其应用策略的 DNS 资源记录类型。例如,您可以匹配某个域的 A 记录,但不能匹配 MX 记录。

UI 名称 API 示例 评估阶段
Query Record Type(查询记录类型) dns.query_rtype == "TXT" DNS 解析前

安全类别

使用此选择器匹配属于特定安全类别的域(以及可选的 IP 地址)。

UI 名称 API 示例 评估阶段
Security Categories(安全类别) any(dns.security_category[*] in {1}) DNS 解析前

源大陆

使用此选择器根据查询到达 Gateway 的大陆进行过滤。

地理位置是根据设备的公网 IP 地址(通常由用户的 ISP 分配)决定的。要指定大洲,请在字段中输入其两位字母代码:

大洲 代码
非洲 AF
南极洲 AN
亚洲 AS
欧洲 EU
北美洲 NA
大洋洲 OC
南美洲 SA
Tor 网络 T1
UI 名称 API 示例 评估阶段
Source Continent IP Geolocation(源大陆 IP 地理位置) dns.src.geo.continent == "North America" DNS 解析前

源国家

使用此选择器根据查询到达 Gateway 的国家进行过滤。

地理位置是根据设备的公网 IP 地址(通常由用户的 ISP 分配)决定的。要指定国家/地区,请在字段中输入其 ISO 3166-1 Alpha-2 代码

UI 名称 API 示例 评估阶段
Source Country IP Geolocation(源国家/地区 IP 地理位置) dns.src.geo.country == "RU" DNS 解析前

源 IP

使用此选择器将策略应用于 DNS 查询的源 IP 地址。例如,这可以是您组织用于向 Gateway 发送查询的存根解析器(stub resolver)的 WAN IP 地址。

UI 名称 API 示例 评估阶段
Source IP(源 IP) dns.src_ip == 198.51.100.0 DNS 解析前

用户

使用这些选择器来匹配身份属性。

UI 名称 API 示例 评估阶段
User Email(用户电子邮件) identity.email == "user@example.com" DNS 解析前
User Name(用户名) identity.name == "Test User" DNS 解析前
User Group IDs(用户组 ID) any(identity.groups[*].id in {"group_id"}) DNS 解析前
User Group Names(用户组名称) any(identity.groups[*].name in {"group_name"}) DNS 解析前
User Group Emails(用户组电子邮件) any(identity.groups[*].email in {"group@example.com"}) DNS 解析前
SAML Attributes(SAML 属性) any(identity.saml_attributes["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"] in {"Test User"}) DNS 解析前

比较运算符

比较运算符是 Gateway 将流量与选择器进行匹配的方式。当您在仪表板策略生成器中选择 Selector(选择器) 时,Operator(运算符) 下拉菜单将显示该选择器的可用选项。

运算符 含义
is(等于) 等于所定义的值
is not(不等于) 不等于所定义的值
in(属于) 匹配至少一个所定义的值
not in(不属于) 不匹配任何所定义的值
in list(在列表中) 在预定义的列表值中
not in list(不在列表中) 不在预定义的列表值中
matches regex(匹配正则表达式) 正则表达式计算结果为 true
does not match regex(不匹配正则表达式) 正则表达式计算结果为 false
greater than(大于) 超过所定义的数字
greater than or equal to(大于或等于) 超过或等于所定义的数字
less than(小于) 低于所定义的数字
less than or equal to(小于或等于) 低于或等于所定义的数字

字段中,当使用等值比较运算符(例如 is)时,您可以输入单个值;当使用包含比较运算符(例如 in)时,您可以输入多个值。此外,您可以使用正则表达式来为受支持的选择器指定值范围。

正则表达式

正则表达式使用 Rust 进行评估。Rust 的实现与其他地方使用的正则表达式库略有不同。有关更多信息,请参阅我们的通配符指南。要评估您的正则表达式是否匹配,可以使用 Rustexp

如果您想匹配多个值,可以使用管道符号(|)作为 OR 运算符。您不需要在管道符号之前使用转义字符(\)。例如,当 hostname 匹配 .*whispersystems.org.*signal.org 时,以下表达式的计算结果为 true:

选择器 运算符
Hostmatches regex.*whispersystems.org|.*signal.org

除了正则表达式外,您还可以使用逻辑运算符来匹配多个值。

逻辑运算符

要在表达式中评估多个条件,请选择 And(与) 逻辑运算符。这些表达式可以使用 Or(或) 逻辑运算符进行进一步比较。

运算符 含义
And(与) 匹配表达式中的所有条件
Or(或) 匹配表达式中的任一条件

Or(或) 运算符仅适用于同一表达式组中的条件。例如,您无法将流量中的条件与 Identity 中的条件进行比较。

这篇文档对您有帮助吗?