Traceroute the World

💡 原文中文,约6200字,阅读约需15分钟。
📝

内容提要

本文介绍了一项寻找全球traceroute跳数最长IP地址的实验。作者从新加坡出发,利用XDP、BPF ring buffer、bitmap和mmap等技术,设计了一套高效扫描整个IPv4空间的方法。通过多轮TTL递增扫描,最终找到了一个跳数长达34的IP地址,并分享了相关代码。

🔎

延伸解读

技术选型:从传统traceroute到内核旁路

传统traceroute逐个IP串行扫描,等待回复导致效率极低,估算扫描整个IPv4空间需680年。作者改用发送与接收分离的双程序架构,利用XDP和AF_XDP实现内核旁路,避免conntrack开销,将扫描速度提升至100K pps,单轮扫描缩短至约12小时。这一设计思路对大规模网络探测具有参考价值。

数据压缩:从文本到bitmap的存储优化

存储所有IP的ping结果,若用文本格式需64GiB,超出VPS磁盘容量。作者将IP转为32位整数,并利用bitmap按位标记,使文件缩小至512MiB。进一步借助稀疏文件(sparse file)特性,仅实际写入有数据的块,大幅节省磁盘占用。这种压缩方法在资源受限场景下尤为实用。

实验局限与结果解读

实验最终找到34跳的IP即停止,未穷尽所有可能。实际运行中遇到IP不稳定、回复源IP不一致、TTL不递减导致环路等问题,可能影响结果准确性。此外,扫描起点新加坡的网络拓扑可能使最长跳数受限,结果不代表全球极端情况。读者应谨慎看待该数值的普遍意义。

Q&A

如何高效地扫描整个IPv4空间以找到traceroute跳数最长的IP?

作者设计了一种高效扫描方法:使用XDP和AF_XDP进行内核旁路发包和收包,利用BPF ring buffer传递数据,用bitmap和mmap存储结果,并通过多轮TTL递增扫描来淘汰短跳IP,最终找到跳数最长的IP。

为什么直接traceroute所有IP不可行?

直接traceroute所有IP需要约680年(按5秒一个IP计算),即使1000并发也需要约8个月,因为每个IP需要多次等待回复,效率极低。

在扫描过程中,如何确定收到的ICMP包对应的TTL?

通过多轮扫描:先对所有IP发送TTL=1的包,收到ICMP reply的IP被淘汰;然后对剩余IP发送TTL=2的包,重复此过程,直到找到在最高TTL下仍能ping通的IP。

为什么使用XDP和AF_XDP?

为了绕过内核协议栈,避免conntrack等处理,提高发包和收包效率,实现高性能扫描。

如何存储扫描结果以节省磁盘空间?

使用bitmap将每个IP映射为文件中的一个bit,并用mmap映射文件,同时利用sparse file特性,只存储实际有数据的部分,最终文件大小仅为512 MiB。

实验最终找到了多少跳的IP?

实验最终找到了一个跳数为34的IP,作者在此停止。

扫描过程中遇到了哪些实际问题?

包括IP不稳定(有时回复有时不回复)、某些IP用其他IP回复、某些IP不递减TTL导致无限环路等。

🏷️

标签

➡️

继续阅读