DNS 过滤器
注意
DNS 过滤器处于积极开发阶段,应被视为 alpha 版本,尚未准备好用于生产环境。
此过滤器应使用类型 URL
type.googleapis.com/envoy.extensions.filters.udp.dns_filter.v3.DnsFilterConfig配置。
概述
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 响应。