凌晨两点,扫描上网机房空调嗡嗡响。网段我盯着终端上滚动的内空ping结果,第47个IP超时。并判这个C段地址快扫完了,扫描上网空IP比想象中多——254个地址,网段有31个完全没响应。内空
扫描空IP这事儿,并判听着简单,扫描上网做起来全是网段坑。你先得定义什么叫"空":ARP里没记录的内空?ping不通的?还是TCP端口全关的?我用的是最土的办法——先ping一遍,再对没响应的并判IP发ARP请求。要是扫描上网ARP也问不到MAC地址,这IP基本就是网段闲置的。但别急着下结论,内空有些设备装了防火墙,ICMP全禁,ARP却会回。所以第二轮用nmap的-sP参数,把TCP SYN包发到443和80端口,能收到RST的就说明有活物。
真正麻烦的是"能不能上网"这个判断。你没法直接问一台空IP"你能上网吗",得靠间接证据。我写了个脚本,对每个空IP做三件事:先ping网关,通了说明二层没问题;然后尝试TCP连接223.5.5.5的53端口(阿里DNS),通了说明三层路由能出去;最后发一个HTTP请求到百度,能返回200就完事儿。三条链路层层递进,哪一步断了都能定位问题。
跑完整个C段花了大概20分钟。结果挺有意思——31个空IP里,有7个能ping通网关但连不上外网,像是被配了IP但没插网线(交换机端口down)。还有2个更绝,TCP能连上DNS,但HTTP请求超时,后来查出来是接了台打印机,自带网络模块,能上内网但被防火墙挡了外网。剩下22个彻底没戏,ARP都问不到,物理上就是断的。
这里头有个细节容易忽略:IP地址的租约时间。DHCP池里释放的地址,如果租约没到期,ARP缓存里可能还留着旧记录。我第一轮扫描就吃了这亏,把10个租约未过期的地址误判成"活的"。后来加了条判断——比较ARP表项的年龄,超过租约时间一半的才标记为空闲。
最后说下工具选择。自己写脚本用Python的scapy库最灵活,但速度慢,254个地址要跑十分钟。换成nmap的并行扫描,快是快了,可对某些老交换机有副作用——并发ARP请求太猛,直接把CPU打满,整个网段卡了半分钟。后来学乖了,把并发数降到16,再配合arping做二次确认,速度和安全总算平衡了。
扫完数据往Excel里一贴,隔壁同事看了直摇头——这31个IP够开三间办公室的电脑了。可实际要用的只有两个新工位。资源浪费归浪费,至少现在知道哪些IP能放心拿来配新机器,不用再一台台试错。
