masscan 是一款经典且极高速的网络扫描器。本文从实现细节出发,剖析 masscan 如何在用户层直接收发包、如何区分自己发出的响应、以及它的目标随机化与高性能网卡访问技术。

1. masscan 的用户层收发(libpcap)

masscan 并没有使用操作系统的完整协议栈,而是在 Linux 上基于 libpcap 直接收发原始数据包。这带来了若干重要影响与限制:

  • 不走内核 TCP/IP 协议栈:masscan 能捕获并构造任意原始以太网帧,这让它可以做到极高速的发包与精细的封包控制,但也导致一些系统层行为不再自动生效。
  • 网关/直连场景的怪异现象:例如两台通过网线直连并处于相同子网的机器,本应无需网关即可通信;但若随意配置网关,masscan 在某些配置下可能无法正常工作(因为它绕过了内核路由/转发逻辑)。
  • 源 IP 欺骗与 ARP:使用 --source-ip 伪造源地址时,若该伪造地址在目标网段不存在真实 MAC,目标主机会发出 ARP 请求来解析该 IP 的 MAC。masscan 可以监听广播 ARP 来判断目标是否可达 / 存活。

2. 异步发包与接收 -> syncookie 思路

masscan 内部主要由两个相对独立的线程/模块组成:

  1. 发送线程:负责按速率把构造好的 SYN(或其他)包发出去,包含速率控制与目标顺序(见第 3 节)。
  2. 接收线程:在用户层监听网卡上的所有入站包,负责过滤并匹配哪些是 masscan 发起请求对应的响应。

因为它在链路层即可看到所有包,接收端需要一个高效的判断方式来区分“属于本次扫描的响应”与“其它正常流量”。masscan 借鉴了 syncookie 的思想:

  • 它使用哈希函数(实现上用的是 SipHash)对请求要素进行计算,取结果的一部分(例如 32-bit)作为 SYN 时的序列号(Seq)。
  • 当接收到 SYN/ACK 时,只需用同样的哈希方式重算并验证 Seq 是否匹配,从而判断该包是否是 masscan 的扫描响应。这样无需维护大量状态表,同时又能高效识别回包。

3. 目标随机化:BlackRock cipher(有限域置换)

对大规模目标进行顺序扫描会非常容易被防护设备发现。masscan 的目标随机化采用了 BlackRock cipher 的思想来生成一个伪随机却无重复(双射)的目标顺序。

  • 核心思路:把目标集合 [0..N-1] 通过一个可逆的伪随机置换映射到 [0..N-1]。映射为双射(bijection),因此不会遗漏或重复任何索引,但序列看起来像“随机”的。
  • 实现技术:使用 Feistel 网络(参考 John Black & Phillip Rogaway 的论文 Ciphers with Arbitrary Finite Domains),在有限域内进行多轮置换,实现可逆且均匀的映射。
  • 源码参考:masscan 的实现可见 crypto-blackrock.c(项目仓库中实现 Feistel / BlackRock 的具体细节)。例如该实现把整数索引作为输入,通过若干轮混合/置换,输出伪随机索引。

优势:既能做到整体扫描覆盖(无遗漏),又能呈现出“全网随机化”的扫描行为,降低被检测/被限速的风险。

4. 高性能网卡访问:PF_RING / PR_RING

常规的 Linux 网络栈在高包率场景下有瓶颈:普通驱动与内核路径每秒处理的数据包数有限。为了解决这一问题,masscan 支持直接与高性能包捕获/发送框架交互,例如 PF_RING / PR_RING

  • 作用:允许用户空间程序更直接、更高效地访问网卡收发队列(绕过部分内核开销),显著提高每秒可发/收的数据包数。
  • 效果量级:普通驱动每秒可能只能处理数百万级包,而开启 PF_RING/PR_RING 后,实测能达到更高的包率(取决于硬件与驱动,能上升至千万级包/秒的场景被报道过)。
  • 参考:ntop 提供的 PF_RING 项目与文档(masscan 社区也讨论了基于该技术的高性能发包方案)。

5. 小结与实践建议

  • masscan 设计目标是为了快速扫描大量的IP和端口,而nmap这是一款综合性很强的扫描器。两种设计的目标不同,因此需要结合需求进行雁泽。
  • masscan 的设计权衡是以极致发包速率为目标:通过用户层原始帧、轻量化的 stateless 验证(类似 syncookie)、以及高性能网卡接入来实现。
  • 在使用时需注意:
    • 网卡驱动与内核配置对性能影响巨大;对极高速发包,推荐使用支持 PF_RING/AF_XDP 等技术的网卡/驱动。
    • 源地址欺骗会触发 ARP,可能影响扫描结果与可观测性,使用时需谨慎并遵守法律与合规要求。
    • 目标随机化虽然降低检测风险,但并不等于“隐形”——合规与安全边界永远第一位。

附:两张简化流程图(Mermaid)

flowchart LR subgraph Sender S1[目标列表生成] S2[BlackRock 映射 -> 随机顺序] S3[速率控制 & 发包] end subgraph Network N[网卡 / 物理链路] end subgraph Receiver R1[捕获所有入站包 (libpcap)] R2[取包 -> 计算 SipHash -> 验证 Seq] R3[匹配 -> 记录结果] end S1 --> S2 --> S3 --> N --> R1 --> R2 --> R3