Traceroute the World
内容提要
本文介绍了一项寻找全球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导致无限环路等。