DualDNSMiner:高效发现双栈解析器的新方法
在网络技术不断发展的今天,双栈解析器在网络中扮演着重要的角色。传统观点认为双栈解析器通常具有一对一的 IPv4 - IPv6 地址关系,但实际上,由于别名地址的广泛存在,双栈解析器的地址关系可能更为复杂,如 1 - N 甚至 M - N。本文将介绍一种名为 DualDNSMiner 的新型双栈解析器发现模型,它能够更准确、高效地发现双栈解析器。
1. 别名地址概述
别名地址是指一组指向同一主机的不同地址。通常,一个 IP 地址代表一个接口,一台机器可能配置了多个接口,因此基于这些接口可以为同一主机导出多个地址。之前已有大量关于识别 IPv4 别名地址的研究,而 Murdock 等人的工作首次证明了 IPv6 别名地址的广泛存在。这些别名地址分布在相当多的自治系统(AS)中,其中一些 AS 属于大型网络服务提供商,如 Google、Cloudflare 和 Akamai,它们也是主要的公共 DNS 服务提供商。
2. DualDNSMiner 方法
DualDNSMiner 主要包括两个步骤:
-
识别 IPv4 和 IPv6 解析器之间的关系
:通过主动 DNS 测量来推测 IPv4 和 IPv6 解析器之间的关系。
-
分别对 IPv4 和 IPv6 地址进行别名解析
:将地址 - 地址关系转换为主机 - 主机关系,最终识别出 1 - 1 的主机 - 主机关系,即 DualDNSMiner 所识别的双栈解析器。
2.1 主动 DNS 测量
主动 DNS 测量的目的是了解双栈解析器拥有的 IPv4/IPv6 地址,并确认它们之间的相关性,以进一步确定它们是否属于同一主机。具体操作如下:
-
探测过程
:探测程序主动向解析器发出专门设计的查询,查询我们具有权威的 DNS 记录。我们的权威域名由符合标准的自定义 DNS 服务器提供服务,该服务器同时监听 IPv4 和 IPv6,但根据传入请求返回不同的结果。
-
结果处理
:服务器处理支持 IPv4 或 IPv6 请求的多个域名,通过特殊编码返回结果,使递归查询的最终响应成为解析器使用的 IPv4 和 IPv6 地址的“链”。
为确保测量的准确性,采用了以下技术:
-
使用随机数
:每个查询都包含一个随机数,防止 DNS 缓存的影响。
-
状态维护
:所有状态都维护在查询本身中,消除了 IPv4 和 IPv6 地址错误关联的可能性。
探测完成后,DualDNSMiner 会合并探测结果,形成关系图,并发现强连通子图,将结果转换为地址簇。然后,提取满足特定条件的地址簇,即所有地址属于同一国家且由同一 ISP 管理,并对这些地址簇进行别名解析。
2.2 双栈解析器识别
这是 DualDNSMiner 的核心步骤。之前的研究将分配给同一组织或公司的具有 1 - 1 关系的地址视为潜在的双栈解析器,并通过评估 IPv4 和 IPv6 地址模式的相似性来评估它们的存在。然而,由于别名地址的存在,这种方法存在缺陷。因此,DualDNSMiner 需要对地址进行别名解析,将地址 - 地址关系转换为主机 - 主机关系。
- IPv4 别名解析 :利用 IPv4 中的 IP 标识(ID)值信息。许多路由器使用一个简单的计数器生成 IP ID 值,该计数器在路由器的接口之间共享。通过检查响应数据包中的 IP ID 值,可以确定两个接口地址是否由同一台机器生成。我们使用 MIDAR 来执行地址簇内 IPv4 地址的别名解析。
- IPv6 别名解析 :由于 IPv6 协议结构与 IPv4 完全不同,无法使用基于 IP ID 值的方法。IPv6 协议支持端主机分片,端主机负责维护 PMTU 状态。我们优化了原始的探测步骤,使 DualDNSMiner 能够处理大规模的 IPv6 别名解析任务。具体的 IPv6 别名解析过程由以下算法表示:
Algorithm 1 . isv6aliases(C): Determine whether the IPv6 addresses in the
cluster C corresponds to the same machine
Require: Active IPv6 addresses in the cluster C
Ensure: Collection of addresses for the same machine M
1: while C is not null do
2:
M+=1
3:
sendTooBig(C0)
4:
if IsFrag(C0) then
5:
for i = 1 to length(C) do
6:
sendEcho(Ci)
7:
if IsFrag(Ci) then
8:
{IPM}←Ci
9:
DELETE(C,Ci)
10:
end if
11:
end for
12:
end if
13:
DELETE(C,C0)
14: end while
15: return {{IPM},{IPM+1},. . .}
具体来说,将地址簇中的 IPv6 地址视为一个集合,通过发送 ICMPv6 回显请求收集集合中所有地址的状态,然后在循环中进行别名解析。每次迭代中,向集合中的第一个地址发送“Packet Too Big”数据包,检查其响应特性是否改变,并向其他地址发送回显请求,检查它们的响应是否同时改变。所有同时改变的 IPv6 地址将被提取为同一主机的地址,并从集合中移除,直到集合为空。
最后,根据主机 - 主机关系,DualDNSMiner 搜索满足条件的主机关系,以识别双栈解析器。
3. 实验结果
3.1 数据集
为了确保实验的准确性,我们在美国和中国租用了两个虚拟专用服务器(VPS)作为观测点,通过向所有全球可达的 IPv4 地址发送 DNS 查询请求,发现并收集 IPv4/IPv6 解析器之间的关系作为数据集。具体的观测时间和收集结果如下表所示:
| 观测点 | 收集周期 | IPv4 | IPv6 | 备注 |
|---|---|---|---|---|
| 中国香港 | 2023 年 4 月 19 日至 5 月 27 日 | 64,421 | 12,059 | 对全球 IPv4 开放解析器进行 10 次重复测试 |
| 美国加利福尼亚 | 2023 年 4 月 1 日至 5 日 | 64,839 | 12,206 | 对全球 IPv4 开放解析器进行 5 次重复测试 |
| 总计 | - | 65,107 | 12,602 | 去除不同观测点结果中的重复值 |
通过对整个 IPv4 地址空间进行主动测量实验,我们发现了 77,709 个唯一的递归解析器,其中 12,602 个是 IPv6 地址,65,107 个是 IPv4 地址。经过强连通子图检测,识别出 6,987 个地址簇,通过过滤条件(所有地址位于同一国家且由同一 ISP 管理),将地址簇缩小到 2,184 个。
3.2 IPv4 - IPv6 解析器关系
- 1 - 1 关系 :一直被认为是双栈解析器的主要特征。我们的数据显示,有 741 个地址簇由一个 IPv4 和一个 IPv6 地址组成。通过比较 IPv4 和 IPv6 地址字符串,发现 279 个地址簇的 IPv6 地址直接嵌入了 IPv4 地址,84 个 IPv6 地址嵌入了 IPv4 的十六进制编码。这表明在 1 - 1 关系中,IPv4 和 IPv6 地址存在一定的相似性,可能是网络或解析器管理员为了方便寻址进行的特殊定制。
- 1 - N 关系 :是 DualDNSMiner 的主要关注点。这种关系只需要对 N 个地址进行别名解析,就可以确定是否为双栈解析器,比确定 M - N 关系更简单,因此更有可能发现新的双栈解析器。我们的数据显示,有 938 个地址簇由多个地址组成,按 IP 协议以 1:N 的比例划分。其中,644 个是 1[IPv6] - N[IPv4] 类型,294 个是 1[IPv4] - N[IPv6] 类型,且前者的最大 N 值大于后者(195 vs. 13)。这表明与 IPv6 解析器相比,IPv4 解析器更集中,更倾向于选择相同的 IPv6 解析器来完成域名解析任务,可能是由于解析器的上游转发。
- M - N 关系 :在某些地址簇中,IPv4 和 IPv6 解析器之间的关联非常复杂。我们的数据显示,有 505 个地址簇由至少一个 IPv4 和一个 IPv6 地址组成,最常见的 M - N 组合是 2 - 2。这些组合中的 IPv4 和 IPv6 地址在地址字符串模式上与 1 - 1 关系相似。此外,还观察到一些大型地址簇,其中 IPv4 和 IPv6 地址的比例极不均衡,可能是由于 IPv6 地址指向的解析器集群比 IPv4 大得多,或者是 IPv6 适配配置存在缺陷。
以下是 M - N 关系中前 5 种最常见的关联和地址最多的簇的信息:
| 编号 | M - N | 数量 | ISP | M - N |
|---|---|---|---|---|
| 1 | 2 - 2 | 203 | 中华电信 | 317 - 623 |
| 2 | 3 - 2 | 47 | Telmex Colombia | 559 - 2 |
| 3 | 4 - 2 | 46 | CAT Telecom | 537 - 5 |
| 4 | 2 - 3 | 39 | BIZNET NETWORKS | 527 - 10 |
| 5 | 5 - 2 | 37 | 中华电信 | 109 - 398 |
通过以上内容,我们对 DualDNSMiner 的方法和实验结果有了初步的了解。在下半部分,我们将继续介绍双栈解析器的验证方法以及实际应用中的效果评估。
DualDNSMiner:高效发现双栈解析器的新方法
3.3 双栈解析器验证
由于目前缺乏公开可用的双栈 DNS 解析器数据集,因此需要采用适当的验证方法来确定结果的准确性。之前的工作无法通过 IPv4&IPv6 地址模式相似性方法证明解析器是否为双栈。为了准确发现双栈解析器,我们提出了一种基于 TCP 选项和缓存共享情况的主动验证方法。
- TCP 选项验证 :TCP 选项技术在检测双栈服务器方面的有效性已得到证明,我们认为它也可以准确验证 DualDNSMiner 的双栈解析器发现结果。然而,该方法仅适用于 TCP,而 DNS 主要使用 UDP,因此如果解析器不支持 TCP 协议,就无法准确验证其是否为双栈。
-
缓存共享验证
:双栈解析器通常使用单个组件同时监听 IPv4/IPv6 地址,因此它们可能使用相同的缓存来加速解析。对于每对 IPv4 和 IPv6 地址,我们基于两个地址和测量时间戳的哈希值查询相同的 qname:
h($ipv4$ipv6$timestamp).cachecheck.ourdomain。该查询在 IPv4 和 IPv6 上各执行两次,每次查询间隔 5 秒。根据答案中的 TTL 值,我们可以确定解析器是否在任何一个或两个协议上进行缓存,以及该缓存是否共享。但需要注意的是,约 10% 至 20% 的解析器会共享相同的缓存服务器,这意味着该方法存在一定比例的误报,因此不能完全替代基于 TCP 选项的方法。
我们的验证方法如下:
1. 检查集群中的解析器(IPv4&IPv6)是否一致支持 TCP(全部支持或全部不支持)。
2. 对于所有解析器都支持 TCP 的集群,基于 TCP 选项验证它们是否为双栈。
3. 对于所有解析器都不支持 TCP 的集群,通过检查集群中的解析器是否使用相同的缓存来验证它们是否为双栈。
4. 对于支持情况不一致的集群(部分支持,部分不支持),由于这显然是由不同的操作系统或 DNS 服务配置不同导致的,因此可以认为它们不是双栈。
整个验证过程如下 mermaid 流程图所示:
graph TD
A[开始] --> B{解析器是否一致支持 TCP}
B -- 全部支持 --> C[基于 TCP 选项验证]
B -- 全部不支持 --> D[检查缓存是否共享验证]
B -- 支持情况不一致 --> E[判定为非双栈]
C --> F[结束]
D --> F[结束]
E --> F[结束]
3.3.1 地面真值验证
在验证 DualDNSMiner 的结果是否正确之前,我们需要测试验证方法的可靠性。我们在 Docker 环境中使用 bind9 和 unbound 构建了 12 个不同的解析器作为地面真值,具体配置如下表所示:
| ID | TCP 支持 | 类型 | 备注 |
|---|---|---|---|
| R1 | 双栈 | 2 个 IPv4 & 2 个 IPv6 地址 | - |
| R2 | 仅 IPv4 | 配置 R1 为上游解析器 | - |
| R3 | 仅 IPv6 | 配置 R1 为上游解析器 | - |
| R4 | 双栈 | 2 个 IPv4 & 2 个 IPv6 地址 | - |
| R5 | 仅 IPv4 | 配置 R4 为上游解析器 | - |
| R6 | 仅 IPv6 | 配置 R4 为上游解析器 | - |
其中,R1 和 R4 是我们实际要寻找的双栈解析器,它们都有两个 IPv4 地址和两个 IPv6 地址,模拟了实际的别名地址情况。主要区别在于它们是否支持 TCP。其他解析器仅支持 IPv4 或 IPv6,并将这两个双栈解析器配置为其上游,以实现跨栈解析。
我们对这些解析器进行了 10 次重复测试。根据验证流程,R1、R2 和 R3 将通过基于 TCP 选项的方法进行测试,而 R4、R5 和 R6 将通过判断集群中所有地址是否共享相同的缓存进行评估。结果表明,我们的验证方法每次都能成功将 R1 或 R3 的地址簇(2 个 IPv4 + 2 个 IPv6)识别为双栈解析器,而其他解析器的地址簇被判定不属于同一台机器,这表明这些解析器的地址不属于双栈解析器,也证明了我们的验证方法是可靠的。
3.3.2 实际应用结果
我们将 DualDNSMiner 的实际有效性与之前工作中使用的 1 - 1 地址关系判断规则进行了比较,并对结果进行了验证。结果显示,DualDNSMiner 进一步提高了双栈解析器的发现效率。与之前的方法相比,它可以从 1 - N 和 M - N 地址关系中发现超过 80% 更多的可能双栈解析器。此外,验证实验表明,DualDNSMiner 在双栈解析器判定结果上也达到了较高的准确率(超过 90%)。
然而,DualDNSMiner 和新的验证方法仍然无法确定某些地址簇是否为双栈解析器。这是由于这些集群中主机的响应或部署特性导致的,例如缺乏 TCP 时间戳选项,或者在发送 ICMPv6 Too Big 数据包后缺乏预期的响应或变化。
我们还分析了 1,237 个被验证为双栈解析器的地址簇中 IPv4 和 IPv6 地址的分布情况,如下表所示:
| 编号 | M - N | 数量 | 编号 | M - N | 数量 |
|---|---|---|---|---|---|
| 1 | 1 - 1 | 735 | 6 | 1 - 3 | 39 |
| 2 | 2 - 1 | 134 | 7 | 3 - 2 | 30 |
| 3 | 1 - 2 | 127 | 8 | 3 - 1 | 24 |
| 4 | 2 - 2 | 49 | 9 | 2 - 3 | 23 |
| 5 | 3 - 3 | 47 | 10 | 4 - 2 | 19 |
从表中可以看出,之前的工作忽略了大量具有多个 IPv4/IPv6 地址的双栈解析器。相当多的双栈解析器具有相同数量的 IPv4 和 IPv6 地址,或者 IPv4 地址更多。我们认为这是由于 IPv4 解析器拥有的全部或部分接口被分配了相应的 IPv6 地址。
在发现效率方面,TCP 选项需要发送 TCP 数据包来判断所有地址簇中的 63,907 对 IPv4 和 IPv6 地址关系。相比之下,在我们的实验中,DualDNSMiner 仅发送了 49,823 个数据包就完成了相同地址簇的别名解析。判别过程基于别名解析的结果,无需发送请求数据包。因此,DualDNSMiner 可以以更低的成本从大规模地址关系中发现双栈解析器,提高了实际发现效率。
综上所述,DualDNSMiner 是一种高效、准确的双栈解析器发现方法,能够有效应对复杂的地址关系,为网络管理和安全提供有力支持。
超级会员免费看
26

被折叠的 条评论
为什么被折叠?



