DNS 过滤器

注意

DNS 过滤器处于积极开发阶段,应被视为 alpha 版本,尚未准备好用于生产环境。

  • 此过滤器应使用类型 URL type.googleapis.com/envoy.extensions.filters.udp.dns_filter.v3.DnsFilterConfig 配置。

  • v3 API 参考

概述

DNS 过滤器允许 Envoy 将转发 DNS 查询作为任何已配置域的权威服务器进行解析。过滤器的配置指定了 Envoy 将响应的名称和地址,以及将外部查询发送到未知域所需的配置。

过滤器支持本地和外部 DNS 解析。如果对名称的查找与静态配置的域或预置的集群名称不匹配,Envoy 可以将查询转交给外部解析器以获取答案。用户可以选择指定 Envoy 用于外部解析的 DNS 服务器。用户可以通过省略客户端配置对象来禁用外部 DNS 解析。

过滤器支持 每过滤器配置。以下是一个示例配置,说明了如何使用过滤器。

示例配置

listener_filters:
  name: envoy.filters.udp.dns_filter
  typed_config:
    "@type": "type.googleapis.com/envoy.extensions.filters.udp.dns_filter.v3.DnsFilterConfig"
    stat_prefix: "dns_filter_prefix"
    client_config:
      resolution_timeout: 5s
      dns_resolution_config:
        dns_resolver_options:
          use_tcp_for_dns_lookups: false
          no_default_search_domain: false
        resolvers:
        - socket_address:
            address: "8.8.8.8"
            port_value: 53
        - socket_address:
            address: "8.8.4.4"
            port_value: 53
      max_pending_lookups: 256
    server_config:
      inline_dns_table:
        virtual_domains:
          - name: "www.domain1.com"
            endpoint:
              address_list:
                address:
                - 10.0.0.1
                - 10.0.0.2
          - name: "www.domain2.com"
            endpoint:
              address_list:
                address:
                  - 2001:8a:c1::2800:7
          - name: "www.domain3.com"
            endpoint:
              address_list:
                address:
                - 10.0.3.1
          - name: "www.domain4.com"
            endpoint:
              cluster_name: cluster_0
          - name: "voip.domain5.com"
            endpoint:
              service_list:
                services:
                  - service_name: "sip"
                    protocol: { number: 6 }
                    ttl: 86400s
                    targets:
                    - host_name: "primary.voip.domain5.com"
                      priority: 10
                      weight: 30
                      port: 5060
                    - host_name: "secondary.voip.domain5.com"
                      priority: 10
                      weight: 20
                      port: 5060
                    - host_name: "backup.voip.domain5.com"
                      priority: 10
                      weight: 10
                      port: 5060

在此示例中,Envoy 被配置为响应对五个域的客户端查询。对于任何其他查询,它将向上游转发到外部解析器。过滤器将返回与输入查询类型匹配的地址。如果查询是针对类型 A 记录,并且未配置任何 A 记录,Envoy 将不返回任何地址,并适当地设置响应代码。相反,如果存在与查询类型匹配的记录,则返回每个配置的地址。这对 AAAA 记录也是如此。仅支持 A、AAAA 和 SRV 记录。如果过滤器解析其他记录类型的查询,过滤器将立即响应,指示该类型不受支持。过滤器还可以将对 DNS 名称的查询重定向到集群的端点。“www.domain4.com”在配置中演示了这一点。除了地址列表之外,集群名称是 DNS 名称的有效端点。

DNS 过滤器还支持响应对服务记录的查询。“domain5.com”的记录说明了支持响应 SRV 记录所需的配置。配置中填充的目标名称必须是完全限定的域名,除非目标是集群。对于非集群目标,每个引用的目标名称都必须在 DNS 过滤器表中定义,以便 Envoy 可以解析目标主机的 IP 地址。对于集群,Envoy 将为每个集群端点返回一个地址。

每个服务记录的协议可以通过名称或数字定义。如示例中配置的那样,过滤器将成功响应对“_sip._tcp.voip.domain5.com”的 SRV 记录请求。如果指定了数值,Envoy 将尝试将该数字解析为名称。协议的字符串值按原样使用。在服务和协议之前都添加了一个下划线,以符合 RFC 中概述的约定。

过滤器还可以从外部 DNS 表中获取其域配置。与静态配置中出现的相同实体可以作为 JSON 或 YAML 存储在单独的文件中,并使用 external_dns_table DataSource 指令进行引用。

示例外部 DnsTable 配置

listener_filters:
  name: "envoy.filters.udp.dns_filter"
  typed_config:
    '@type': 'type.googleapis.com/envoy.extensions.filters.udp.dns_filter.v3.DnsFilterConfig'
    stat_prefix: "my_prefix"
    server_config:
      external_dns_table:
        filename: "/home/ubuntu/configs/dns_table.json"

在文件中,可以按如下方式定义表

DnsTable JSON 配置

{
  "virtual_domains": [
    {
      "name": "www.suffix1.com",
      "endpoint": {
        "address_list": {
          "address": [ "10.0.0.1", "10.0.0.2" ]
        }
      }
    },
    {
      "name": "www.suffix2.com",
      "endpoint": {
        "address_list": {
          "address": [ "2001:8a:c1::2800:7" ]
        }
      }
    }
  ]
}

通过使用此配置,可以独立于 Envoy 配置来配置 DNS 响应。