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 命令行工具
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_message
和response_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_address
和query_port
dnstap消息字段中)添加到发送到目标域名服务器的DNS查询消息的开头。这需要在目标域名服务器中进行支持。目前,至少dnsdist、PowerDNS权威域名服务器、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 许可证分发。有关详细信息,请参阅 LICENSE 和 NOTICE 文件。
依赖关系
~14–25MB
~371K SLoC