☰
arp-scan 1.9 局域网资产盘点实战:编译安装、参数调优与避坑指南
2026/10/28 18:05:02 网站建设 项目流程

简介:arp-scan-1.9 是一款面向 Linux 平台网络运维与安全测试人员的 IP 冲突检测工具源码包,主要用于扫描局域网中 IP 地址与 MAC 地址的对应关系,快速定位地址冲突、排查非法接入设备,适合具备一定 Linux 命令行基础、需要做网络诊断与资产梳理的工程师使用。压缩包共收录 57 个文件,约 360KB,以 C 源码与头文件为主体,辅以 pcap 抓包样本、dat 测试数据、man 手册与 txt 说明文档,并附带 autoreconf、configure 等构建脚本,便于自行编译安装与二次开发。目前已有 1406 人学习下载。借助其中的抓包样本与测试脚本,读者可深入理解 ARP 协议交互细节,掌握冲突 IP 的定位与排错思路,并基于源码扩展自定义扫描逻辑,是网络排障与协议学习的实用参考。

1. arp-scan-1.9.tar.gz 到底是什么:一个被低估的局域网资产盘点工具

很多人第一次看到arp-scan-1.9.tar.gz这个文件名,会以为它只是某个老旧的网络小工具,甚至觉得在 nmap 满天飞的今天没必要再折腾它。但如果你真的在机房、办公网或者实验室里待过,就会知道一个尴尬的现实:你手里那台交换机下面到底挂了多少台设备,很多时候没人说得清。ARP 扫描解决的就是这个问题——它不依赖目标主机开放任何端口,也不依赖 ICMP 是否被放行,只要设备在同一个二层广播域里活着,它就得回应 ARP 请求。arp-scan正是把这个机制做成命令行工具的经典实现,1.9 这个版本号在不少发行版的软件源里躺了很多年,稳定、依赖少、输出干净。它适合谁?适合需要快速摸清局域网资产、排查 IP 冲突、做设备指纹初筛的运维和安服人员。这一章先把它的定位讲清楚,后面再动手编译和调参。

2. 从 tar.gz 到可执行文件:编译安装与最小可用命令

拿到arp-scan-1.9.tar.gz之后,第一件事不是急着解压,而是先确认你打算把它装在哪台机器上。这个工具依赖 libpcap 做原始套接字抓包,所以编译前必须保证开发头文件在位。我一般会在一台和待扫描网段直连的 Linux 主机上操作,避免跨三层路由导致 ARP 请求根本到不了目标广播域。下面这套流程在 Debian/Ubuntu 和 RHEL 系上都跑过,差异只在包管理器。

2.1 编译前的依赖检查与解压

先装 libpcap 的开发包,这是硬依赖,缺了会在 configure 阶段直接报错。

# Debian/Ubuntu 系 sudo apt-get update sudo apt-get install -y build-essential libpcap-dev # RHEL/CentOS 系 sudo yum install -y gcc make libpcap-devel

装完之后解压源码包,进入目录看一眼结构。arp-scan-1.9.tar.gz解出来通常是arp-scan-1.9/目录,里面有configure、Makefile.in、arp-scan.c这些文件。

tar -zxvf arp-scan-1.9.tar.gz cd arp-scan-1.9 ls -l

这里有个细节:如果你拿到的 tar.gz 里没有预生成的configure脚本,就需要先跑autoreconf -i生成,但这在 1.9 的官方发布包里一般不会遇到。解压后确认configure存在即可。

2.2 configure、make 与安装路径选择

接下来是标准的 autotools 三步。我习惯把前缀设成/usr/local,这样和系统包管理器装的版本隔离,后面升级或卸载都干净。

./configure --prefix=/usr/local make sudo make install

--prefix决定最终二进制落在/usr/local/bin/arp-scan,man 手册落在/usr/local/share/man。如果你只是想临时用一下,也可以不 install,直接在源码目录里./arp-scan跑,但那样每次都要 cd 进来,不推荐。make过程中如果报pcap.h: No such file,说明 libpcap-dev 没装对,回去补依赖。编译完成后用arp-scan --version验证,正常会输出arp-scan 1.9和 libpcap 版本信息。

2.3 最小可用命令:指定网卡扫一个 C 段

装好之后先别急着扫大网段,拿一个你确定有设备的 /24 段试手。关键参数是-I指定网卡,-l表示按本机网卡配置的网段扫,或者直接跟 CIDR。

# 指定网卡,扫描 192.168.1.0/24 sudo arp-scan -I eth0 192.168.1.0/24 # 或者让工具自己读网卡网段 sudo arp-scan -I eth0 -l

输出格式是三列:IP 地址、MAC 地址、网卡厂商。厂商那一列是靠 MAC 前 24 位查 OUI 库得到的,能帮你快速判断这是台什么设备。-I必须跟真实存在的网卡名,用ip link确认。如果输出为空,先检查你是不是在正确的广播域里,以及有没有加sudo——原始套接字需要 root 权限。

3. 参数怎么调:扫描范围、超时与输出格式的取舍

arp-scan的参数不算多,但每一个都直接影响扫描结果的可信度。很多人扫完发现漏设备,八成是超时设太短或者重试次数不够。这一章把最常调的几组参数拆开讲,顺带说清楚它们背后的发包逻辑。

3.1 扫描范围与网段表达方式

arp-scan支持三种指定目标的方式:单个 IP、CIDR 网段、以及从文件读。CIDR 是最常用的,比如192.168.1.0/24。如果你想扫多个不连续的段,可以写成多个参数,或者用--file读一个每行一个网段的文件。

# 多个网段一起扫 sudo arp-scan -I eth0 192.168.1.0/24 10.0.0.0/24 # 从文件读取目标 sudo arp-scan -I eth0 --file=targets.txt

targets.txt里每行一个 CIDR 或 IP,空行和#开头的注释行会被忽略。这里要注意:ARP 是二层协议,跨网段的目标不会回应,所以写不同网段只是让工具分别从对应接口发,前提是你的机器有多张网卡分别接入。单网卡扫非本网段,结果一定是空的。

3.2 超时、重试与发包速率

默认情况下arp-scan发一轮请求等一小段时间就收工,在设备多或者网络慢的环境里容易漏。三个参数最有用:--timeout控制单轮等待毫秒数,--retry控制重试次数,--interval控制发包间隔。

# 超时 500ms,重试 3 次,发包间隔 10ms sudo arp-scan -I eth0 --timeout=500 --retry=3 --interval=10 192.168.1.0/24

--timeout单位是毫秒,设太小会漏掉响应慢的设备,设太大整体扫描时间线性增长。我的经验值是办公网 300~500ms,机房内网 100~200ms 就够。--retry=3基本能覆盖偶发丢包。--interval别设太小,某些老交换机对 ARP 风暴敏感,10ms 已经比较激进,默认值更保守。

3.3 输出格式与厂商解析

默认输出对人友好,但要喂给脚本就得换格式。-q只输出 IP 和 MAC,--format可以自定义字段,--plain去掉表头。

# 只输出 IP 和 MAC,方便 awk 处理 sudo arp-scan -I eth0 -q 192.168.1.0/24 # 自定义格式:IP 制表符 MAC sudo arp-scan -I eth0 --format='${ip}\t${mac}' 192.168.1.0/24

厂商解析依赖内置 OUI 列表,如果发现某些 MAC 显示(Unknown),可能是 OUI 库没更新,这在 1.9 里是已知情况,不影响扫描本身。要拿干净数据做资产表,用-q再配合awk最省事。

4. 避坑与排查:ARP 扫描翻车的五个真实场景

这一章是我自己踩过的坑,按「现象 → 原因 → 解决」写。ARP 扫描看起来简单,但网络环境一复杂,翻车方式五花八门。

4.1 扫出来全是本机,目标一个没有

现象:执行arp-scan -I eth0 192.168.1.0/24,输出只有本机 IP 和网关,其他设备一个不见。原因通常是你所在的网段和192.168.1.0/24根本不在同一个广播域,或者eth0不是接那个网段的接口。解决:先用ip addr确认接口和网段,再用-l让工具自己读,别硬写一个不相关的 CIDR。

4.2 权限报错 socket: Operation not permitted

现象:不加sudo直接跑,报socket: Operation not permitted。原因:ARP 扫描要发原始帧,需要CAP_NET_RAW能力,普通用户没有。解决:加sudo,或者给二进制设setcap cap_net_raw+ep /usr/local/bin/arp-scan,后者能让普通用户也跑,但生产环境要评估安全影响。

4.3 扫描结果时多时少,不稳定

现象:同一网段扫两次,设备数量对不上。原因:默认超时太短,部分设备 ARP 响应慢,或者网络里有生成树收敛、无线漫游导致的瞬时丢包。解决:把--timeout提到 500ms,--retry提到 3,再扫。如果还不稳,检查是不是无线客户端在省电模式,那种情况只能多扫几轮取并集。

4.4 虚拟机 MAC 厂商显示 Unknown

现象:扫到一堆 MAC 但厂商列是(Unknown)。原因:虚拟化平台分配的 MAC 前缀不在 1.9 内置的 OUI 库里,或者 OUI 库本身老旧。解决:这不影响你判断设备存在,要厂商信息可以拿 MAC 前六位去 IEEE 官网查,或者升级到更新版本的 arp-scan。别因为这个就认为扫描失败。

4.5 扫描触发交换机告警或端口安全

现象:扫完之后交换机日志里出现大量 ARP 或端口安全告警。原因:--interval设太小,短时间大量 ARP 请求被交换机当成异常流量。解决:把--interval调回默认或更大,分网段分批扫,避开业务高峰。在开了 DAI 或端口安全的接入层,提前和网络管理员打招呼。

5. 进阶用法:把 arp-scan 接进资产盘点流水线

单次扫描只是起点,真正有价值的是把arp-scan变成周期性资产发现的一环。我一般会写一个包装脚本,扫完直接输出 CSV,再和上一轮结果做 diff,新出现的 MAC 就是需要关注的「新面孔」。下面这个脚本用-q拿干净输出,转成 CSV 并带上时间戳。

#!/bin/bash # arp_scan_to_csv.sh IFACE="eth0" NET="192.168.1.0/24" OUT="/var/log/arp_scan/$(date +%Y%m%d_%H%M).csv" mkdir -p "$(dirname "$OUT")" echo "ip,mac,timestamp" > "$OUT" sudo arp-scan -I "$IFACE" -q "$NET" | \ awk -v ts="$(date +%s)" 'NF>=2 {print $1","$2","ts}' >> "$OUT" echo "saved to $OUT"

脚本逻辑很直白:-q保证每行只有 IP 和 MAC,awk过滤掉空行并拼上时间戳。参数上唯一要改的是IFACE和NET,按你的环境填。跑起来之后配合 cron 每小时一次,就能积累出资产变化的时间线。

再进一步,可以把结果和已知资产库比对。我习惯用comm或者简单的 Python 集合运算,找出「在扫描结果里但不在资产库」的 MAC,这些就是未登记的设备。验证方法也很简单:连续扫三天,如果某个 MAC 稳定出现,基本可以确认是常驻设备;如果只出现一次,可能是临时接入或扫描抖动。

最后说个我自己的习惯:每次扫完不只看结果,还会把--timeout和--retry记在脚本注释里。因为过几个月回头看,你根本想不起来当时为什么设 500ms。这个习惯帮我省了很多次「为什么这次扫得比上次少」的困惑。希望帮到你。

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

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

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

立即咨询