
简介这是一款面向Linux网络管理员的ARP扫描与IP地址冲突检测工具适用于局域网环境可快速定位重复IP对应的MAC地址帮助排查由IP冲突引发的网络异常。源码包共含57个文件以C源文件、头文件为核心另有抓包样本、数据文件、手册页及多份说明文档压缩后整体大小仅360KB便于下载后自行编译和定制功能。目前已有1400人学习浏览特别适合具备一定Linux基础、希望深入理解ARP协议或基于此工具二次开发的网络技术人员。资源不仅提供完整的源代码还附带了测试报文、构建脚本和历史更新记录可辅助读者分析协议交互过程、理解数据包格式并在编译或使用遇到问题时提供排错线索。整体目录结构清晰不同类型文件分工明确便于按需查阅和学习。1. arp-scan 1.9Linux 上处理 IP 冲突最直接的那把扳手办公网里最让人抓狂的网络故障往往不是交换机挂了而是有人手动配了一个固定 IP刚好和打印机、门禁服务器或者监控主机撞在一起。我在 Linux 平台上做 IP 地址冲突扫描第一个装的就是 arp-scan这个工具从名字就能看出它是直接工作在 ARP 协议层的扫描器不需要目标主机开任何端口也不需要登录设备管理面。它向指定范围内的每个 IP 发送 ARP 请求然后把收到应答的 IP、MAC 和厂商信息列出来。只要同一个 IP 出现在两行且 MAC 不同冲突几乎就实锤了。适合谁用运维、网工、刚接手现场排查断网问题的人。它能解决的是「这个 IP 到底被谁占着」和「是不是有两个设备在抢一个 IP」这两个最朴素的诉求下面从原理到实战把它讲透。2. 先看懂 ARP 层判定逻辑为什么冲突逃不过第二层广播2.1 ARP 请求应答的时序里藏着判别依据ARP 协议本身很简单请求方在广播域里发一条广播帧帧里带发送者 IP、发送者 MAC、目标 IP以及全零的目标 MAC。收到广播的所有网卡都会看目标 IP 是不是自己只有匹配的才会回一条单播应答把自己的 MAC 填进目标 MAC 字段。这意味着一个很关键的事实冲突发生时两个占用同一 IP 的设备都会认为这条 ARP 请求是在问自己于是都会独立回应答。扫描器只要都收到这两条单播应答帧同一 IP 对应的就会是两个不同 MAC这比 ICMP 探测可靠得多因为 ICMP 可能被防火墙丢、被主机忽略而 ARP 应答发生在 IP 栈更底层目标主机只要网卡驱动正常就会回没有「不想理你」这个选项。但要注意时序两条应答几乎同时到达扫描器的收包逻辑是否能把两条都记下来取决于超时设置和重试次数这也是后文反复强调-R与-t的原因。2.2 arp-scan 和 ping、nmap 在冲突发现能力上的差异很多人习惯先ping 192.168.1.100通了就认为这个 IP 正常。但 ping 只能证明「当前有某个主机在用这个 IP」证明不了「只有一个主机在用」。而且不少嵌入式设备默认屏蔽 ICMPping 不通不等于 IP 没人占用。nmap 的-sn主机发现模式也能完成 L2 扫描但它把判断权交给操作系统内核的 ARP 表内核只会留下最后一条应答重复响应很容易被覆盖掉。相比之下arp-scan 直接抓取原始 ARP 帧能保留同一 IP 的多条 MAC 应答还能打印DUP标记。另外 arp-scan 的带宽控制、重试策略和范围参数比 nmap 更精细专门为 L2 扫描这个场景优化过所以做 IP 冲突检测时我更愿意直接用它而不是去翻 nmap 的输出。3. 编译安装与第一次扫描从 tar.gz 到可用工具链3.1 编译前先把 libpcap 准备好arp-scan 1.9 是源码包需要自己编译。整个构建过程不复杂但有一个前置依赖容易卡住它依赖 libpcap 提供的抓包能力编译时需要对应的开发头文件。Debian/Ubuntu 系先装这几个包sudo apt-get update sudo apt-get install -y build-essential libpcap-dev装完依赖后解包、配置、编译、安装一气呵成tar xzf arp-scan-1.9.tar.gz cd arp-scan-1.9 ./configure --prefix/usr/local make sudo make install--prefix/usr/local是习惯用法二进制会落到/usr/local/bin共享数据文件落到/usr/local/share/arp-scan。如果系统里 libpcap 不在默认路径可以在 configure 时用--with-libpcap/usr/lib/...指定实际位置但绝大多数发行版装上libpcap-dev后不用管这个。安装完成后用arp-scan --version确认版本号看到 1.9 说明编译成功。这里的血泪经验是configure 报error: cannot find libpcap时别急着换工具先检查是不是只装了 libpcap 运行库、没装开发包这是最常见的翻车点。3.2 第一次扫描与输出字段解读装好后先在当前所在网段跑一次全量扫描命令如下sudo arp-scan --localnet --interfaceeth0 --retry2 --timeout300--localnet等价于-l意思是自动按本机 IP 和掩码推算整个子网范围--interface指定扫描用的网卡接口多网卡机器上这个参数必须有否则工具可能选了错误的接口导致收不到应答--retry表示对每个 IP 最多发几次 ARP 请求默认是 1 次排查冲突时我会提到 2 或 3--timeout是每次请求后等待应答的毫秒数300 表示 300 毫秒。输出格式非常规整一行一个响应192.168.1.1 a2:14:3f:xx:xx:xx (Unknown) 192.168.1.20 5c:35:3b:xx:xx:xx Shenzhen Billion Electronics Co.,Ltd. 192.168.1.100 a4:5e:60:xx:xx:xx Beijing Ricon Heavy Industry从左到右三列分别是 IP 地址、MAC 地址、OUI 厂商识别。厂商名来自 arp-scan 自带的 IEEE OUI 数据库如果显示(Unknown)可能确实是新厂商的 MAC 段没收录也可能是 OUI 数据库太久没更新。扫描输出最该看重的是第二列的内容如果同一行 IP 下出现两个不同 MAC或者看到DUP前缀那就要进入冲突排查流程了。3.3 用参数控制扫描边界全子网扫描在小型网络里够用但遇到跨网段定位或只怀疑某个 IP 的场景需要把扫描范围收紧。看下面这组参数sudo arp-scan -r 192.168.10.1-192.168.10.50 -I eth0 --bandwidth20000-r指定精确 IP 范围像192.168.10.1-192.168.10.50这种可以写起始和结束也可以只写单个 IP 如192.168.10.100-192.168.10.100。--bandwidth控制发包速率单位是 kbps调高会扫得更快但容易触发交换机的 ARP 限速策略调低会扫得慢但更稳。从文件读 IP 段用-f配合脚本批量检测很实用。-q可以关闭启动横幅-v打开调试输出实际排查时用-q会让结果更好 grep。4. 冲突检测实战把「两个 MAC 争一个 IP」抓出来4.1 冲突场景的一个完整排查序列说一个真实现场办公室打印机 192.168.1.100 突然无法打印运维怀疑有员工笔记本手动配了同一 IP。这种场景下我不会直接上去扫而是按固定顺序操作避免被本机 ARP 缓存误导。第一步先把自己的网络环境确认清楚ip addr show eth0 ip route show确认自己确实在 192.168.1.0/24 这个广播域内。第二步清空本机 ARP 缓存因为内核很可能缓存了冲突前的旧条目不清的话扫描结果会残留历史信息干扰判断sudo ip neigh flush all第三步全量扫一遍子网把基准结果存下来sudo arp-scan -l -I eth0 -R 1 -t 200 /tmp/arp_before.txt cat /tmp/arp_before.txt第四步针对可疑 IP 做重点扫描把重试次数提到 3超时提到 300sudo arp-scan -r 192.168.1.100-192.168.1.100 -R 3 -t 300 -I eth0这里-R 3很关键。ARP 应答是单播帧两个冲突设备回包的时间非常接近如果只发一次请求第二个应答可能因为先到的那条已让工具认为处理完毕而被丢弃多试几次能显著提高捕获两条应答的概率。输出里出现以下特征之一冲突判断基本成立该 IP 对应两行不同的 MAC某行前有DUP前缀或该 IP 的 MAC 与设备台账上的预期 MAC 对不上。拿到冲突 MAC 后再去交换机上敲show mac address-table | include a4:5e:60:xx:xx:xx就能定位到具体接入端口直接找到重装设备整个过程不超过十分钟。4.2 用脚本做定时冲突检查有些 IP 冲突是间歇性的比如某台笔记本只在上班开机时抢 IP办公时段扫一次不一定撞上。我会把上面的检查流程固化成脚本设定时任务每十分钟跑一次。脚本核心逻辑如下#!/bin/bash # 检查 192.168.1.100 是否被第二个设备占用 CHECK_IP192.168.1.100 EXPECTED_MACa4:5e:60:xx:xx:xx IFACEeth0 OUT$(sudo arp-scan -r ${CHECK_IP}-${CHECK_IP} -R 2 -t 300 -I $IFACE 2/dev/null | grep -E ^${CHECK_IP}\s) ACTUAL_MAC$(echo $OUT | awk {print $2}) if [ -z $ACTUAL_MAC ]; then echo [$(date %F %T)] $CHECK_IP 无应答请检查设备状态 elif [ $ACTUAL_MAC ! $EXPECTED_MAC ]; then echo [$(date %F %T)] 冲突或地址被占用: $OUT else echo [$(date %F %T)] 正常 fi脚本先用-R 2保证重试两次-t 300留足等待时间然后用 grep 提取目标 IP 那一行再取第二个字段 MAC 和预期值比对。如果ACTUAL_MAC为空说明该 IP 当前没人应答这可能是设备真正宕机了也可能是冲突设备没开机需要结合业务状态判断。把脚本丢进 crontab 后每周巡视一遍日志能发现很多只靠人工扫描捕捉不到的间歇性冲突。别人家网络里那种每隔十几分钟掉线一次的问题大多就是这么捞出来的。4.3 怎么确认不是「假冲突」扫出来两个 MAC 不等于一定有人在搞破坏网络里有几种合法情况也会造成同一 IP 多 MAC 的现象。最常见的是服务器双网卡绑定Linux bonding 或网卡 team 在工作时可能用多个 MAC 对外应答还有无线网络里同一 AP 下挂多个射频某些厂商实现也会让 AP 以不同 MAC 回 ARP。遇到这种「看着像冲突、业务却一直正常」的情况我一般会先上交换机查 MAC 表确认两条 MAC 落在哪个物理端口。如果两条 MAC 都在同一个端口或同一条上行链路且该设备本身就是多网卡聚合那就不是冲突不要乱拔线。还有一层需要注意只扫到单个 MAC 不等于没有冲突另一个设备可能因为开启了 ARP 防火墙、或恰好处于省电休眠状态没回包。这时我会把目的 IP 设成冲突 IP再发一次带源地址的探测命令形如sudo arp-scan -r 192.168.1.100-192.168.1.100 -R 5 -t 500 -s 192.168.1.100 -I eth0-s指定 ARP 请求的源 IP这种「用同一个 IP 钓另一个持有者」的手法在对付不回普通请求的设备时很有效但注意源 IP 必须是本网段可用的地址不能瞎填。5. 避坑与排错arp-scan 用翻车时我都在查什么5.1 五个高频翻车现场现象configure 阶段直接报error: cannot find libpcap。原因只装了运行级的 libpcap 库缺少为编译准备的头文件。解决Debian/Ubuntu 安装libpcap-devCentOS/RHEL 安装libpcap-devel装完重跑 configure。如果仍报错再检查ldconfig -p | grep pcap确认库的实际路径并用--with-libpcap指给它。现象扫描结果显示的 MAC 和上次扫出来的一模一样即使设备已经换了。原因本机 ARP 缓存没失效内核把旧条目直接当成应答返回arp-scan 使用内核抓包接口时也会被这个缓存误导。解决扫描前执行sudo ip neigh flush all清空邻居表或者用arp -d ip指定删除某一条。这是一个非常容易踩的坑我第一次用的时候对着一个已经搬走的设备看了半天差点误判成了幽灵设备。现象同一 IP 扫出两个 MAC业务却一直正常不像冲突。原因目标设备做了网卡绑定或者双活链路多个 MAC 属于同一台机器的合法行为另一种常见原因是交换机连了两台 AP而该 IP 跑在无线控制器上。解决拿着两个 MAC 去交换机上查show mac address-table如果两个 MAC 的源端口指向同一物理设备或将 MAC 前六位OUI比对后落在同一厂商型号的无线控制器上就不要按冲突处理。判断冲突不能只看「多 MAC」要多看「多 MAC 是否来自不同物理位置」。现象用-r指定一个看起来可达的网段结果一个应答都没有。原因ARP 是纯二层协议扫描器必须和目标 IP 处于同一个广播域。网段只要跨了路由ARP 广播根本过不去。解决先确认自己这台机器的 IP 掩码和目标网段是否匹配必要时把扫描器搬到对应 VLAN 或接入层交换机上执行并显式指定接口比如-I vlan10。现象扫描到一半发现丢包部分设备扫不出来网络还变慢了。原因一些硬路由和交换机开启了 ARP 报文限速arp-scan 默认发包速率在低配设备上容易被判定为攻击流量并触发惩罚机制。解决加--bandwidth5000把速率压下来同时把-t降到 100 毫秒、用-R 1减少重试再把大范围拆成几个小范围分开扫。别指望一次全扫完稳比快重要。这些都经历过之后我反而认同一个观点扫描工具本身不难难的是让它配合网络现状工作。5.2 排查时的一个最小化套路如果现场只有 5 分钟时间我会把流程压缩成一条命令加一个核对动作。先清缓存再扫可疑 IPsudo ip neigh flush all sudo arp-scan -r 192.168.1.100-192.168.1.100 -R 3 -t 300 -I eth0把输出里的 MAC 和手中已知台账比对能对上且无 DUP基本可以排除冲突对不上就去交换机看这个 MAC 出现在哪个端口。做这件事之前记得先看arp-scan --help确认当前版本支持的参数1.9 的选项和 1.10 略有差异部分命令不能跨版本无脑照搬。我用这类工具时始终保留一个习惯把每次扫出来的异常结果都贴进工作日志标注日期和交换机端口下次复现时能直接翻历史而不是重新瞎子摸象。6. 进阶从单次扫描到搬迁网络前的资产基线知道一个 IP 冲突怎么排之后arp-scan 还能干点更有价值的事给整张局域网做一份可对比的资产基线。第一次全量扫描时先更新 OUI 数据库让厂商识别更准确命令如下sudo get-oui sudo arp-scan -l -I eth0 -R 1 -t 200 --ouifile/usr/local/share/arp-scan/ieee-oui.txtget-oui会从 IEEE 拉最新厂商分配表之后扫出来的 OUI 识别率会明显提升。把全量结果排序后存档就得到了一张带时间戳的资产快照sudo arp-scan -l -I eth0 -R 1 -t 200 | sort | tee /tmp/arp-baseline-$(date %F).txt后续再扫一次用diff对比快照新增或消失的 MAC 一目了然。这个方法在办公室搬迁、交换机割接前特别有用——提前知道全网有多少活跃设备搬完收敛时一对比就知道有没有设备没上线、有没有非法设备混进来。结合前面提到的定时脚本还能把整个冲突检测体系化每天自动扫一遍全子网新增的 MAC 自动进异常名单只要不是台账里的设备就发告警让人工确认。这个过程几乎是零成本但能免掉很多「半夜两点被叫起来处理断网」的苦。不过也要提醒一句凡是能发的是 ARP 泛滥的扫描工具在网络上跑的时候都应该控制节奏。我现在每接手一个现场第一件事就是sudo arp-scan -l -R 1存一份基线到 /tmp 带时间戳等冲突出现时 diff 一下就能定位到新 MAC省掉大量翻交换机的次数。这个习惯帮我找准过三次「莫名其妙断网」的元凶从那以后我每次动网络环境都会先强制走一遍这个流程再开始动其他配置。希望帮到你。本文还有配套的精品资源点击获取