DNS 过滤器

Attention

DNS 过滤器还在开发中,应该被视为 alpha 且不是生产可用。

  • v3 API 参考

  • 这个过滤器应该使用名字 envoy.filters.udp_listener.dns_filter 来配置

概览

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

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

过滤器支持 per-filter 配置。 下面的示例配置说明了如何使用过滤器。

示例配置

listener_filters:
  name: envoy.filters.udp.dns_filter
  typed_config:
    "@type": "type.googleapis.com/envoy.extensions.filters.udp.dns_filter.v3alpha.DnsFilterConfig"
    stat_prefix: "dns_filter_prefix"
    client_config:
      resolution_timeout: 5s
      upstream_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:
        known_suffixes:
        - suffix: "domain1.com"
        - suffix: "domain2.com"
        - suffix: "domain3.com"
        - suffix: "domain4.com"
        - suffix: "domain5.com"
        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.v3alpha.DnsFilterConfig'
    stat_prefix: "my_prefix"
    server_config:
      external_dns_table:
        filename: "/home/ubuntu/configs/dns_table.json"

在该文件中,表可以如下定义:

DnsTable JSON 配置

{
  "known_suffixes": [
    { "suffix": "suffix1.com" },
    { "suffix": "suffix2.com" }
  ],
  "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" ]
        }
      }
    }
  ]
}

通过使用此配置,可以将 DNS 响应与 Envoy 配置分开配置。