☰
ARP扫描工具arp-scan 1.9的编译安装与排障实践
2026/9/26 4:43:20 网站建设 项目流程

简介:这是一款供 Linux 系统管理员、网络运维人员排查 IP 地址冲突的 arp-scan 1.9 源码包,通过主动发送 ARP 请求并解析应答,快速定位冲突 IP 对应的 MAC 地址,也适用于设备发现、地址盗用审计与局域网合规检查。整套源码包共 57 个文件、约 360KB,主体为 C 源码与头文件,并配套 pcap 抓包样本、dat 请求数据和多个 check-* 自检脚本,可覆盖普通、VLAN、LLC、填充等多种报文测试场景。同时,包内还包含 README、ChangeLog、AUTHORS、COPYING 等标准文档、OUI/IAB 厂商数据库获取脚本及 man 手册页;读者可借由主程序、参数解析、哈希表、随机数等具体模块的源码,了解 ARP 工具的整体工程组织方式。借助这些材料,既能对照抓包样本理解协议细节,也可裁剪复用代码,用于自身的网络管理工具中。目前已有 1400 人学习下载,适合具备一定 Linux 基础、希望深入掌握 ARP 协议并自行构建 IP 冲突监控工具的中高级用户。

1. arp-scan-1.9.tar.gz:网段里多了一台“不该出现”的设备,它比 ping 先发现

组里半夜报障,某网段设备一卡一卡,ping 网关正常、丢包也不明显,但就是有几个终端频繁掉线。我先不碰抓包,拿 arp-scan 把网段扫一遍,结果发现同一台 IP 背后回了两个不同的 MAC——有人把自带的打印机、开发板、临时测试机插进了同一网段,IP 还撞了。这种“二层先于三层出问题”的场景,正是 arp-scan 最擅长的:不依赖 ICMP、不碰端口、不看系统 ARP 表,直接在以太网层广播 ARP 请求,把所有愿意回包的主机全部叫出来。

arp-scan-1.9.tar.gz 就是这份工具的 1.9 版本源码包,编译安装后几分钟就能投入排查。它适合网络运维、设备调试、资产盘点的人,也适合那些被 IP 冲突和私接设备折腾过、想要一个轻量二层发现工具的人。1.9 这个版本在保留“快、准、输出干净”的同时,加入了更灵活的格式化输出能力,至今仍是我在新装 Linux 机器上第一批编译的工具之一。

2. 从源码包到可用命令:arp-scan-1.9.tar.gz 的编译安装全流程

源码包的好处是版本可控、依赖透明、编译参数可调。坏处是:如果少了开发头文件,configure 会翻车;如果 make install 没执行完整,后面用起来会发现厂商列全空。这一章把从解压到能跑的最小路径走一遍,每一步都说明在做什么。

2.1 解压之前:确认手里是 1.9 而不是改了名的别的包

网上下载的 tar.gz 名不一定是内容名,有的站点会在打包时加日期、补丁号或者改目录名。我先不解压,直接列包内容看顶层目录:

tar ztf arp-scan-1.9.tar.gz | head -20 tar zxf arp-scan-1.9.tar.gz cd arp-scan-1.9

ztf是 list 模式,不实际解压,只把包内的文件清单列出来。第一行通常会看到arp-scan-1.9/这个顶层目录,说明包结构正常。如果顶层目录名和包名对不上,解压后要 cd 到实际目录,否则下一步会找不到 configure 脚本。

进到目录后,再确认一次版本号,我用 configure.ac 里的 AC_INIT 判断:

grep -m1 "AC_INIT" configure.ac

正常会输出类似AC_INIT([arp-scan], [1.9], ...)的一行。这一步不是形式主义——如果你的发行版打了补丁,版本号后面会多出-p1、+deb之类的后缀,行为可能和原版有细微差别。做排障工具,我建议用干净的官方 1.9 源码,不要用带大量发行版补丁的版本,省得后面排查问题时行为对不上。

2.2 configure:libpcap 开发包没装,这一步必报错

arp-scan 的核心工作方式是“自己构造以太网帧并发送、再捕获响应”,这套动作在 Linux 上依赖 libpcap。光有运行库还不够,configure 需要的是头文件和链接库,也就是 libpcap 的 dev 包。在 Debian/Ubuntu 上,最常见的报错长这样:

checking for pcap_lookupdev... no configure: error: libpcap not found. Please install libpcap first.

对,1.9 的 configure 会直接卡在 libpcap 上。解决方式很简单,装开发包:

sudo apt-get install -y libpcap-dev build-essential # RHEL/CentOS 系用:sudo yum install -y libpcap-devel gcc make

装完重新执行:

./configure

看到结尾输出configure: exit 0就是通过了。这里要说明:build-essential 提供 gcc/make,libpcap-dev 提供 pcap.h 和链接库。如果你的 libpcap 是从源码编到非标准路径的,可以给 configure 传--with-libpcap=/path/to/libpcap,但绝大多数机器不需要。

configure 这一步还会检查 C 编译器、系统头文件、socket 相关接口,任何一个不满足都会提前中止。我遇过一次在超精简容器里缺 gcc,报错是“C compiler cannot create executables”,这种和 arp-scan 本身无关,把 build-essential 装上重来即可。

2.3 make 与 make install:数据文件装到哪里很关键

configure 通过后就是常规三步:

make sudo make install sudo ldconfig

make 会把源码编译成arp-scan可执行文件。源码文件不多,1.9 的编译在普通机器上基本是秒过,如果看到一大片 warning,只要最后没有 error,一般不影响使用。make install默认把二进制装到/usr/local/bin/arp-scan,同时把厂商数据库文件装到/usr/local/share/arp-scan/目录下,这个数据文件直接决定后面输出里的“厂商”列能不能显示。

安装完成后验证:

arp-scan --version sudo ldconfig

如果 shell 提示找不到命令,先看/usr/local/bin在不在 PATH 里。然后检查数据文件到底装到哪了:

ls -l /usr/local/share/arp-scan/

正常情况下能看到ieee-oui.txt或类似命名的厂商库文件。这个路径很重要,第 4 章里“厂商列全空”的坑就和它有关。顺手做一个冒烟测试:

sudo arp-scan --interface=eth0 --retry=1 --timeout=300 192.168.1.0/24 | head -10

能扫出至少自己这台机器的 IP/MAC,就算编译安装闭环了。从这一步开始,后面所有参数调优才有意义。

3. 参数与输出:把 arp-scan 1.9 调到“又快又全”

编译通过只是开始。arp-scan 的默认参数偏向保守,直接跑能出结果,但往往不是最优的。这一章从选网卡、调速率到看输出,把常用参数串成一套完整的用法。

3.1 选网卡:--interface 和 --localnet 配合,别让 docker0 截胡

多网卡机器上最容易翻车的点,就是 arp-scan 自动选了错误的接口。它的默认逻辑是选第一个非 loopback 接口,在装了 Docker、KVM、Open vSwitch 的机器上,这个“第一”很可能不是你的物理网卡,而是 docker0 或 virbr0。扫错接口的直接后果是:所有请求都发到了虚拟桥上,物理网段一台主机都看不见,输出像闹鬼一样全是空的。

先看接口列表再动手:

ip -br link

拿到物理网卡名后,最稳的用法是显式指定接口,再让工具根据该接口的 IP 和掩码自动推导网段:

sudo arp-scan --interface=eth0 --localnet

--localnet省去了手动写网段的麻烦,它会读 eth0 的 IPv4 地址和掩码,自动算出对应的子网。在接口 IP 是192.168.1.10/24时,等价于扫192.168.1.0/24。这个参数适合“这台机器就在目标网段里”的场景。

如果你要扫的不是本机所在网段,就得显式给网段,同时要保证本机有到那个网段的路由,并且目标网段能回应 ARP。跨三层扫是不行的——ARP 只在二层广播域里工作。所以我会把--localnet当作默认姿势,只有资产盘点、扫旁路网段时才手动写 CIDR。

3.2 重试、超时与带宽:扫描速度和命中率的平衡

三条核心参数决定一次扫描的“快”和“全”:重试次数--retry、单目标超时--timeout、发送带宽--bandwidth。先给一个适合有线局域网的经验模板:

sudo arp-scan --interface=eth0 --retry=2 --timeout=500 --bandwidth=1000000 --localnet

这条命令的意图:对每个目标最多发 2 轮请求,每轮等待 500ms 收响应,带宽控制在 1Mbps。默认值里--retry=2、--timeout=500算是合理的,真正拖慢扫描的是带宽。arp-scan 1.9 默认带宽被压到 256000 bps,这是为了照顾老交换机和老式无线 AP,但代价是扫一个 /24 网段要一两分钟起步,无线场景更慢。把带宽调到 1000000 也就是 1Mbps,速度会明显改观,同时不至于把交换机的 CPU 打满。

调参的优先级我一般是:先调--bandwidth,再考虑降--retry。无线网段和 IoT 设备多的场景,建议保留 retry=2,因为低功耗设备第一次广播请求时可能还在休眠,重试一轮能捞回来。如果只是快速摸底、不追求 100% 覆盖,可以降到 retry=1。

还有两个参数值得一提。--random会打乱主机探测顺序,避免按 IP 顺序扫描时被网络设备误判为“规律性探测”,在共享网络里更低调一些。--file能从一个文本文件里读目标列表,每行一个 IP 或网段,适合只关心特定地址段的场景:

sudo arp-scan --interface=eth0 --file=targets.txt

这个文件格式和命令行参数基本一致,可以混写单 IP 和 CIDR,非常灵活。

3.3 看懂输出:IP、MAC、厂商和 DUP 的真实含义

一次典型的扫描输出长这样:

192.168.1.1 a4:2b:b0:xx:xx:xx TP-Link Technologies Co., Ltd. 192.168.1.25 dc:a6:32:xx:xx:xx Raspberry Pi Trading Ltd 192.168.1.87 (unknown) 192.168.1.1 d8:47:32:xx:xx:xx (unknown)

每行三列:IP 地址、MAC 地址、厂商名。厂商名来自前面说的 ieee-oui.txt,按 MAC 前缀匹配。(unknown)有两种可能:这个 MAC 前缀不在库里,或者数据文件路径没找对。后者是第 4 章的坑,先说结论:厂商列大面积 unknown,优先怀疑数据文件。

上面示例里192.168.1.1出现了两次、MAC 不同,这是 DUP 的典型表现。arp-scan 在同一个 IP 收到不同 MAC 的响应时,会额外标注,这正是排查 IP 冲突最经典的手段——系统提示“IP 地址冲突”时,arp-scan 能直接告诉你冲突双方是谁。

这个工具不读系统/proc/net/arp,而是自己构造 ARP 请求,把它填充为全 F 的目的 MAC 广播出去,再用 pcap 抓响应。这意味着它看到的是“此刻网络上真实回包的主机”,而不是系统缓存的邻居表。所以扫描结果和ip neigh不一致时,不用惊讶,一个是缓存快照,一个是实时探测。

1.9 版本还加入了自定义输出格式能力,可以把输出从“给人看的三列”改成“给脚本处理的纯列表”,这在做自动化巡检时很有用。具体 token 名在不同小版本间有差异,用之前先跑arp-scan --help | grep -A 10 format看本机支持的字段列表,省得踩格式坑。

4. 避坑:arp-scan 1.9 用不好,八成栽在这五件事上

按血泪经验排列,这五条是 arp-scan 用户问得最多、也最容易让人误以为“工具坏了”的问题。每条都按现象、原因、解决的顺序写,照着排查即可。

4.1 非 root 跑:直接 Permission denied,或者什么都扫不到

现象:普通用户执行arp-scan --localnet,报Couldn't open device: Operation not permitted,或者不报错但输出只有本机。

原因:arp-scan 需要构造原始以太网帧,这要求 RAW socket 权限。普通用户没有这个权限,抓包和发包都在底层失败了,工具却不一定每次都把错误吐到终端上。

解决:最简单的办法是用 sudo 执行。如果不想每次敲 sudo,可以给二进制单独加 capability:

sudo setcap cap_net_raw+ep /usr/local/bin/arp-scan

加了之后再以普通用户跑就不会报权限错。注意:setcap 作用在二进制文件上,之后重装 arp-scan、升级版本、甚至make install覆盖了同一个文件,capability 都会丢失,需要重新设置。在脚本里调用时,我是直接写 sudo,省得哪天升级后忘记补 setcap 导致巡检任务半夜静默失败。

4.2 无线环境:AP 开了客户端隔离,扫出来只剩自己和网关

现象:同一台 AP 下明明连着好几台设备,arp-scan 扫来扫去只有自己这台机器和网关的 MAC,其他终端一个都看不到。

原因:办公网和访客网络里,“客户端隔离”是一个很常见的策略。AP 会在二层把不同客户端之间的广播和单播直接丢掉,只允许客户端和网关通信。ARP 请求是广播帧,同样被隔离策略拦掉了,其他客户端根本收不到,自然也就不可能回应。

解决:如果网络是自己在管,去 AC 或 AP 的管理面查“无线客户端隔离”或“AP 隔离”,关掉再扫。如果隔离是公司安全策略强制开的,建议不要为了扫描去关,而是改用有线接口摸底,或者接受“无线网段只能扫到少数设备”这个现实,改用三层方式做资产发现。这个问题在 arp-scan 的任何版本里都一样,是无线网络本身的行为,不是 1.9 的 bug。

4.3 扫描慢到怀疑人生:默认带宽 256kbps,不是机器卡

现象:扫一个 /24 网段,干等了快两分钟还没出完,无线网段更夸张,感觉像卡死。

原因:前面说过,arp-scan 1.9 默认发送带宽只有 256000 bps。这个数值是为了兼容十年前的设备和无线环境设计的,对现在的千兆交换机来说过于保守。工具本身是单线程按顺序发包,带宽限制直接决定了整体耗时。

解决:扫描前先按环境把带宽调上去。有线环境我一般从 1Mbps 起步,最大到 5Mbps:

sudo arp-scan --interface=eth0 --bandwidth=2000000 --return=1 --localnet

注意--return这句是我随手写的,arp-scan 没有这个参数,正确的重试参数是--retry。把带宽调高后,一个 /24 网段的扫描时间能快好几倍。但别贪心:带宽超过 5Mbps 以后,部分老旧交换机和低端 AP 的 CPU 会被大量广播帧打满,出现短暂的管理面无响应。我的习惯是先从 1Mbps 开始,扫完看结果质量,再决定要不要加。

4.4 厂商列全空或全是 (unknown):数据文件路径没找对

现象:每一行的 IP、MAC 都正常,但第三列要么空着,要么整片都是 (unknown)。

原因:MAC 厂商匹配需要 ieee-oui.txt 这类数据文件。arp-scan 运行时按编译时配置的路径去找这个文件,如果make install没执行、数据文件被挪走、或者你从源码目录直接跑二进制,它就找不到,厂商列就废了。

解决:先看文件是否存在于预期路径,再手动指定:

find /usr -name "ieee-oui.txt" 2>/dev/null sudo arp-scan --ouifile=/usr/local/share/arp-scan/ieee-oui.txt --interface=eth0 --localnet

如果 find 有结果,就把路径传给--ouifile参数;如果连文件都没有,说明make install没跑完整,回第 2 章重新安装。这里还有一个玄学点:有些发行版打包的 arp-scan 数据文件路径和源码包默认路径不一样,直接跑官方 .deb 或 .rpm 也会遇到这个问题,用 find 找一下现行路径是最快的解法。

4.5 虚拟机 NAT 和容器里跑:扫不到物理网络是网络隔离,不是工具坏

现象:VMware/VirtualBox 里的 Linux 跑 arp-scan,只能扫到虚拟网段内的网关和自己;Docker 容器里跑,宿主机都看不到。

原因:VMware 的 NAT 模式本身就在二层做了隔离,虚拟机网卡和物理局域网根本不是同一个广播域,ARP 广播到不了物理交换网络。容器默认更是只有一张 veth 虚拟网卡,且没有 raw socket 权限,arp-scan 连发包这步都可能失败。

解决:虚拟机改桥接模式,让虚拟网卡直接挂在物理二层网络上。容器里跑的话,要么加权限:

docker run --rm --network=host --cap-add=NET_RAW arp-scan-slim:1.9 --interface=eth0 --localnet

要么干脆放弃在容器里跑这个工具,直接在宿主机上用。我的建议是后者——arp-scan 本来就是排查工具,给它套一层容器隔离反而给自己制造障碍。做网络排障时,工具应该尽量贴近物理网络,少一层隔离就少一类玄学问题。

5. 进阶:把 arp-scan 1.9 收进巡检脚本,做 MAC 基线告警

单条命令适合临时排查,长期维护的网段值得做一份“谁在网里”的基线。把 arp-scan 1.9 包一层脚本,能自动完成选接口、扫全段、留日志这三件最基础的事。

5.1 一段能直接用的巡检脚本

我用默认路由所在的接口作为目标接口,这样在多网卡机器上也不会扫错。脚本如下:

#!/usr/bin/env bash # 自动挑接口,扫描本地网段,输出到带日期的日志文件 IFACE=$(ip route show default | awk '{print $5; exit}') [ -z "$IFACE" ] && IFACE=$(ip -br link | awk 'NR==2{print $1}') SUBNET=$(ip -4 -o addr show dev "$IFACE" | awk '{print $4}') OUT="arp-scan-$(date +%F).log" sudo arp-scan --interface="$IFACE" --retry=2 --timeout=400 "$SUBNET" | tee "$OUT"

第一行用ip route show default取默认路由接口,这是最可靠的方式;如果机器没有默认路由,再回退到第一个非 loopback 接口。SUBNET直接用接口上的 IPv4 地址和前缀,等价于--localnet的效果,但写在一个变量里方便后面复用。tee同时把结果打到屏幕和文件,方便巡检时留档。

5.2 验证扫描结果可信度

脚本跑完,我会做两个交叉验证。第一,拿一台已知 MAC 的设备(比如手机开热点)放进网段,看脚本结果里能不能稳定出现;第二,和ip neigh对比,如果 arp-scan 扫到的 MAC 和系统 ARP 表不一致,说明网段里有 IP 冲突或最近发生过设备替换。两次连续扫描的结果差异,就是网段变化的直接证据。把这个对比做成第二个脚本,就能在设备私接、IP 被抢的时候第一时间发现。

5.3 保留一个习惯

我现在接到新环境的第一个习惯,仍然是先编译一份 arp-scan,再跑全量二层盘点。这个从 1.9 源码包里长出来的工具,比很多商业软件更能直接回答“网里到底有什么”。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询