fanout

源代码 主页

启用方式
fanout:github.com/networkservicemesh/fanout

fanout - 将 DNS 消息并行代理到上游解析器。

说明

触及 CoreDNS fanout 插件的每个传入 DNS 查询都将并行复制到每个已列出的 IP(即 DNS 服务器)。从任何查询的 DNS 服务器收到的第一个非负面响应将作为应用程序 DNS 请求的响应转发。

语法

  • tls CERT KEY CA 定义 TLS 连接的 TLS 属性。可以提供 0 至 3 个参数,具体含义如下

    • tls - 未使用客户端认证,系统 CA 用于验证服务器证书
    • tls CA - 未使用客户端认证,文件 CA 用于验证服务器证书
    • tls CERT KEY - 客户端认证使用指定证书/密钥对。服务器证书由系统 CA 验证
    • tls CERT KEY CA - 客户端认证使用指定证书/密钥对。服务器证书使用指定的 CA 文件进行验证
  • tls_servername NAME 允许你在 TLS 配置中设置服务器名称;例如,9.9.9.9 需要将其设置为 dns.quad9.net。在这种情况下仍然允许多个上游设备,但它们必须使用相同的 tls_servername。例如,混合 9.9.9.9(QuadDNS)和 1.1.1.1(Cloudflare)将不起作用。

  • worker-count 是每个请求的并行查询数。默认情况下等于 IP 列表的数量。仅将其用于减少每个请求的并行查询数。

  • policy - 指定 DNS 服务器选择机制的策略。默认值为 sequential

    • sequential - 根据其顺序逐个选择 DNS 服务器
    • weighted-random - 根据 weighted-random-server-countweighted-random-load-factor 参数随机选择 DNS 服务器。
  • weighted-random-server-count 是要请求的 DNS 服务器的数量。默认情况下等于指定的 IP 数量。仅与 weighted-random 策略一起使用。

  • weighted-random-load-factor - 选择服务器的概率。这在 IP 地址列表的顺序中指定,介于 1 到 100 之间。默认情况下,所有服务器都具有 100 的相等概率。仅与 weighted-random 策略一起使用。

  • network 是特定的网络协议。可以是 tcpudptcp-tls

  • except 是一个列表,即从代理中排除的域名的空格分隔列表。

  • except-file 是一个文件的路径,其中包含要从代理中排除的域名的按行分隔的列表。

  • attempt-count 是连接到上游服务器所需的尝试次数,达到该次数后才认为上游不可用。如果为 0,则上游将永不会标记为不可用,请求将由 timeout 完成。默认值为 3

  • timeout 是请求的超时时间。经过此时间段后,将停止尝试从上游服务器接收响应。默认值为 30s

  • race 优先采用第一个结果,无论其是否为否定结果,只要其是标准 DNS 结果即可。

度量

如果已启用监视(通过 prometheus 插件),则将导出以下度量

  • coredns_fanout_request_duration_seconds{to} - 每个上游交互的持续时间。
  • coredns_fanout_request_count_total{to} - 每个上游的查询次数。
  • coredns_fanout_response_rcode_count_total{to, rcode} - 每个上游的 RCODE 计数。

其中 to 是某个上游服务器(配置中的 TO),rcode 是上游返回的 RCODE。

示例

example.org 内的所有请求代理到运行在不同端口上的一个名称服务器。代理的第一个正面响应将被提供为结果。

example.org {
    fanout . 127.0.0.1:9005 127.0.0.1:9006 127.0.0.1:9007 127.0.0.1:9008
}

通过 TCP 在三个解析器之间发送并行请求,其中有一个解析器的 IPv6 地址。代理的第一个响应将被提供为结果。

. {
    fanout . 10.0.0.10:53 10.0.0.11:1053 [2003::1]:53 {
        network TCP
    }
}

代理除 example.org 上的请求之外的所有请求。

. {
    fanout . 10.0.0.10:1234 {
        except example.org
    }
}

使用主机 resolv.conf 的名称服务器代理除 example.org 外的所有请求

. {
    fanout . /etc/resolv.conf {
        except example.org
    }
}

使用 DNS-over-TLS 协议代理到 9.9.9.9 的所有请求。请注意,如果您想要一个有效的设置,则 tls-server 是必须的,因为无法在 TLS 协商中使用 9.9.9.9。

. {
    fanout . tls://9.9.9.9 {
       tls-server dns.quad9.net
    }
}

使用两个工作进程通过 UDP 在五个解析器之间发送并行请求,并且不尝试重新连接。代理的第一个正面响应将被提供为结果。

. {
    fanout . 10.0.0.10:53 10.0.0.11:53 10.0.0.12:53 10.0.0.13:1053 10.0.0.14:1053 {
        worker-count 2
    }
}

配置了多个上游服务器,但其中一个服务器已关闭,查询一个 不存在 的域名。如果启用 race,我们将很快得到 NXDOMAIN 结果,否则我们将在几秒钟内得到 "连接超时" 结果。

. {
    fanout . 10.0.0.10:53 10.0.0.11:53 10.0.0.12:53 10.0.0.13:1053 10.0.0.14:1053 {
        race
    }
}

在两个随机选择的解析器之间发送并行请求。请注意,将更频繁地选择 127.0.0.1:9007,因为它具有最高的 weighted-random-load-factor

example.org {
    fanout . 127.0.0.1:9005 127.0.0.1:9006 127.0.0.1:9007 {
      policy weighted-random
      weighted-random-server-count 2
      weighted-random-load-factor 50 70 100
    }
}

在三个解析器之间顺序发送并行请求(默认模式)。

example.org {
    fanout . 127.0.0.1:9005 127.0.0.1:9006 127.0.0.1:9007 {
        policy sequential
    }
}

另请查看

请参阅 fanout