5个版本 (3个破坏性更新)

0.5.0 2023年2月28日
0.4.0 2022年11月8日
0.3.1 2022年10月12日
0.3.0 2022年7月11日
0.1.0 2022年2月12日

#2430 in 命令行工具

Apache-2.0

100KB
1.5K SLoC

dnstap-utils

使用Rust编程语言实现的一系列dnstap工具集合。

dnstap-replay

dnstap-replay是一个dnstap收集服务器,它从一个或多个DNS名称服务器接收dnstap消息,并将其回放到一个目标名称服务器。目标名称服务器的响应将与最初记录的响应消息进行比较,并通过HTTP端点以dnstap格式提供任何不匹配或其他错误,以便稍后进行分析。

dnstap-replay:dnstap消息要求

dnstap-replay是为测试权威名称服务器而设计的。dnstap-replay仅支持一种dnstap日志有效负载类型,即Message/AUTH_RESPONSE类型。任何其他dnstap日志有效负载类型都将被dnstap-replay静默忽略。

以下字段必须在dnstap日志有效负载中设置

  • query_address
  • query_port
  • query_message
  • response_message

通常,dnstap Message/*_RESPONSE日志有效负载不包含query_messageresponse_message字段,假设查询消息将由Message/*_QUERY日志有效负载单独记录。然而,这给dnstap-replay中的回放和比较阶段带来了问题,因为仅根据DNS响应消息推导原始DNS查询消息并不完全简单。在某些情况下,可能无法恢复原始查询,例如如果查询不是有效的DNS消息。

对于Knot DNS服务器,在版本3.1.4中增加了支持,在dnstap模块中添加了一个配置选项responses-with-queries,用于将查询和响应消息一起记录在Message/AUTH_RESPONSE日志负载类型中。要在knot.conf中生成dnstap输出,需要将mod-dnstap配置段设置为以下内容:

mod-dnstap:
  - id: "default"
    sink: "[...]"
    log-queries: off
    log-responses: on
    responses-with-queries: on

dnstap-replay:目标域名服务器的代理支持

dnstap-replay最初是为了测试可能具有源IP地址依赖性行为或配置的域名服务器而设计的。当dnstap-replay通过dnstap-replay回放dnstap起源的DNS查询消息时,目标域名服务器会在包含回放查询消息的UDP数据包中看到运行dnstap-replay的机器的源IP地址。这可能导致目标域名服务器返回不同的DNS响应消息内容。

为了避免这个问题,dnstap-replay可以使用haproxy的PROXY协议,将原始源地址和源端口(记录在query_addressquery_port dnstap消息字段中)添加到发送到目标域名服务器的DNS查询消息的开头。这需要在目标域名服务器中进行支持。目前,至少dnsdistPowerDNS权威域名服务器PowerDNS递归解析器Knot DNS支持PROXY头。

要启用dnstap-replay中的此功能,请在命令行参数中添加--proxy选项。

Knot DNS版本3.2.2中添加了对作为连接目标的支持PROXYv2,它添加了一个配置选项proxy_allowlist,列出允许使用PROXYv2头发起查询的IP地址。通过将选项放在server配置段中启用,例如

server:
    []
    proxy-allowlist: 127.0.0.0/8

dnstap-replay:HTTP服务器

dnstap-replay包含一个内置的HTTP服务器,用于导出Prometheus指标,这些指标在/metrics HTTP端点可用。

dnstap-replay向目标域名服务器发送DNS查询,并且目标域名服务器的响应与最初记录的响应消息不完全匹配时,将生成包含不匹配响应消息的日志消息,并将其缓冲在内存中,可以从/errors HTTP端点检索。此端点清空错误缓冲区,并以帧流格式提供输出,包含dnstap负载。

通过/errors端点导出的dnstap日志消息是dnstap-replay接收到的原始dnstap日志消息,其中extra字段填充了dnstap-replay遇到错误的序列化版本。这保留了原始DNS响应消息以及目标域名服务器发送的DNS响应消息,从而允许逐字节分析不匹配。

有一个单独的 /timeouts 端点,可用于检索在重新查询目标域名服务器时导致超时的 dnstap 日志消息。使用的格式与 /errors 端点相同。

dnstap-replay:命令行示例

dnstap-replay 需要提供 --dns--http--unix 参数。

--dns 参数指定将接收重放 DNS 查询的目标域名服务器的 IP 地址和端口号。

--http 参数指定内置 HTTP 服务器的 IP 地址和端口号。

--unix 参数指定绑定 dnstap Unix 套接字的文件系统路径。

此外,还有命令行选项 --channel-capacity--channel-error-capacity,允许调整内部缓冲区大小。

例如,以下命令行调用将在文件系统路径 /run/dnstap.sock 上监听来自将发送 dnstap 日志数据的 DNS 服务器(s)的传入 dnstap 连接,并在 TCP 套接字 127.0.0.1:53080 上监听传入的 HTTP 连接。重放的 DNS 查询将发送到目标域名服务器,该服务器应配置为监听 127.0.0.1:53053。

    $ dnstap-replay --dns 127.0.0.1:53053 --http 127.0.0.1:53080 --unix /run/dnstap.sock

Prometheus 指标端点可通过 http://127.0.0.1:53080/metrics 访问。

Frame Streams "errors" 端点可通过 http://127.0.0.1:53080/errors 访问。

Frame Streams "timeouts" 端点可通过 http://127.0.0.1:53080/timeouts 访问。

dnstap-dump

dnstap-dump 是一个工具,它将 Frame Streams 格式的 dnstap 文件导出到 YAML。输出格式与 dnstap-ldns 工具生成的格式非常相似。

它支持解码 extra 字段,该字段由 dnstap-replay 生成的 dnstap 错误有效负载产生,并且它还以十六进制编码的线格式以及 dig 风格输出导出 DNS 线消息。

fmt-dns-message

fmt-dns-message 是一个工具,它使用 NLnet Labs domain crate 将十六进制编码的线格式 DNS 消息转换为 dig 风格输出。

许可证

dnstap-utils 根据 Apache-2.0 许可证分发。有关详细信息,请参阅 LICENSENOTICE 文件。

依赖关系

~14–25MB
~371K SLoC