一个使用Nmap的最常见的场景是扫描以太网LAN。在大多数LAN上,尤其是那些使用RFC 1918授予的私有地址范围的LAN,绝大多数IP地址在任何给定时间都未被使用。当Nmap尝试发送原始IP数据包(例如ICMP回显请求)时,操作系统必须确定与目标IP对应的目标硬件(ARP)地址,以便它可以正确地寻址以太网帧。这要求它发出一系列ARP请求。如例4所示,扫描本地的以太网主机。选项- -send-ip告诉Nmap需要发送IP等级的数据包,而不是原始的以太网帧。

例4: 用原始的IP ping扫描一台离线主机
#nmap -n -sn - -send-ip 192.168.43.13
hacker之眼Nmap的原理及用法(七)局域网扫描的福音(-PR)
上面的例子中我们的时间花了3秒多,鉴于ARP回复通常会在几毫秒内到来,因此等待几秒钟的时间显得太多了。对于OS供应商而言,减少此超时时间并不是优先事项,因为绝大多数数据包都发送到了实际存在的主机。另一方面,当给定目标(例如10.0.0.0/8)时,Nmap必须将数据包发送到1600万个IP。即使许多目标并行执行,每次等待两秒钟也将成为巨大的延迟。
LAN上的原始IP ping扫描还有另一个问题。如上一示例所示,当发现目标主机无响应时,源主机通常会在其内核ARP表中为该目标IP添加一个不完整的条目。但ARP表空间是有限的,而且有的操作系统在该表被填满之后会反应异常。在原始IP模式(- -send-ip)中使用Nmap时,Nmap有时必须等待几分钟以使ARP缓存条目过期,然后才能继续进行主机发现。
ARP扫描通过控制Nmap解决了这两个问题。 Nmap发出原始的ARP请求,并自行决定处理重传和超时时间。 系统ARP缓存被绕过。下面的例5显示了这个区别。使用ARP ping扫描,我们只花费了不到原来八分之一的时间。
例5: 用ARP ping扫描一台离线主机
#nmap -n -sn -PR - -packet-trace - -send-eth 192.168.43.13
hacker之眼Nmap的原理及用法(七)局域网扫描的福音(-PR)
在例5中,扫描时间变短其实与-PR或- -send-eth选项无关。这是因为在扫描LAN中的以太网主机时,Nmap默认使用ARP扫描。这里既包括传统的有线以太网,也包括802.11无线网络。ARP扫描不止高效而且精确。主机一般都会阻止基于IP的ping包,但它们一般不会阻止ARP的请求和响应。在扫描前,即使你指定例不同的ping类型(例如:-PE或-PS),Nmap仍会对同一局域网中的目标使用ARP扫描。如果你不想使用ARP扫描,就用- -send-ip选项。参考例4中的用法。
由于Nmap能够控制原始的以太帧,因此Nmap能够修改源MAC地址。如果你去参加一个安全会议,会场中只有你一人使用苹果笔记本电脑,那么网络中出现大量的ARP扫描时,大家一定会看向你的方向。你可以使用- -spoof-mac选项修改你的MAC地址。