ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

arp-scan 1.9 安装与排障:从编译到扫描的完整指南

arp-scan 1.9 安装与排障:从编译到扫描的完整指南

简介:arp-scan-1.9.tar.gz 是一款面向 Linux 运维与网络管理人员的开源 IP 冲突检测工具源码包,通过 ARP 协议扫描局域网内 IP 与 MAC 地址的对应关系,帮助定位地址冲突、排查非法接入设备,适合具备一定 Linux 编译基础的中高级用户使用。压缩包共 57 个文件,约 360KB,以 15 个 C 源码文件为核心,配合 4 个头文件、7 个 pcap 抓包样本、6 个 dat 测试数据及 txt、man 手册等文档,覆盖源码、测试用例与说明资料,结构完整。目前已有 1408 人学习下载。资源提供从 autoreconf、configure 到 make check 的完整构建链路,读者可据此编译安装并深入理解 ARP 扫描原理,借助 pcap 样本与 check 脚本验证报文解析逻辑,快速掌握 IP 冲突排查与网络诊断的实战思路。

1. arp-scan 1.9 安装前的环境底账:为什么你编译完还是扫不到设备

很多人第一次装 arp-scan 1.9,都是被“IP 冲突”逼到墙角的。局域网里两台设备抢同一个地址,表现是时通时断、SSH 掉线、监控告警乱跳,用 ping 根本定位不到是谁在抢。这时候 arp-scan 就是那把趁手的刀——它直接发 ARP 请求,谁在线、MAC 是多少、网卡厂商是谁,一屏列清楚。但坑也在这儿:这工具依赖 libpcap 抓包库,编译时少一个头文件,装完能跑却报“No such device”;权限没给对,普通用户执行直接 permission denied。这篇笔记按“装什么版本 → 怎么编译 → 怎么配权限 → 坏了怎么救 → 怎么验证”走一遍,适合正在排查 IP 冲突、又不想装一堆重型扫描器的 Linux 运维和开发。版本我锁定在 arp-scan 1.9,源码包 arp-scan-1.9.tar.gz,老版本稳定、依赖少,在 CentOS 7、Ubuntu 20.04 这类常见环境上都验证过。

2. 依赖与编译环境准备:libpcap 和 gcc 一个都不能少

2.1 先确认系统里有没有 libpcap 开发包

arp-scan 本身不实现抓包,它调用 libpcap 的接口往网卡上发原始帧。所以编译前必须保证 libpcap 的头文件和库都在。我一般先跑一条检查命令,看看到底缺不缺:

# 检查 libpcap 开发包是否已安装 # Debian/Ubuntu 系用 dpkg,RHEL/CentOS 系用 rpm dpkg -l | grep libpcap-dev || rpm -qa | grep libpcap-devel

如果这条命令没有任何输出,说明开发包没装。注意区分“运行库”和“开发包”:很多系统默认带了 libpcap.so 运行库,但没有 pcap.h 头文件,编译时就会在#include <pcap.h>这一行直接失败。这是新手最容易忽略的一步,以为系统能抓包就代表能编译,其实两码事。

2.2 按发行版补齐编译工具链

确认缺包之后,按你的系统装依赖。下面两条命令分别对应 Debian/Ubuntu 和 RHEL/CentOS,选一条执行即可:

# 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

build-essential里包含 gcc、make、libc 头文件,是编译 C 程序的最小集合;libpcap-dev和libpcap-devel是同一个东西在不同发行版里的名字,提供 pcap.h 和静态库。这里有个版本取舍:libpcap 1.9 以上对多网卡和 VLAN 支持更好,如果你系统源里的 libpcap 低于 1.5,建议先升级再编译 arp-scan,否则扫 VLAN 接口时可能拿不到回包。装完可以用pcap-config --version确认一下版本号。

2.3 解压源码包并核对目录结构

依赖齐了,把 arp-scan-1.9.tar.gz 放到一个干净目录里解压。我习惯放在/usr/local/src下,方便后面统一管理:

# 进入源码目录并解压 cd /usr/local/src tar -zxvf arp-scan-1.9.tar.gz cd arp-scan-1.9 # 看一眼目录里有什么,确认 configure 脚本存在 ls -l

解压后应该能看到configure、Makefile.in、arp-scan.c这些文件。如果ls里没有configure,说明压缩包不完整或者下错了版本,别急着往下走,重新拿包。这一步看着简单,但我见过有人把 tar.gz 当 zip 解,结果目录里一堆乱码文件名,后面 configure 直接报“No such file”。确认目录结构正常,再进入编译环节。

3. 编译安装 arp-scan 1.9:configure 参数怎么选

3.1 运行 configure 并理解关键参数

进入源码目录后,第一步是./configure。这个脚本会探测你的系统环境,生成对应的 Makefile。最简用法是直接跑,但我会显式指定安装路径,避免装完找不到:

# 指定安装前缀为 /usr/local,二进制会落到 /usr/local/bin ./configure --prefix=/usr/local # 如果 libpcap 装在非标准路径,需要额外指定头文件和库路径 # ./configure --prefix=/usr/local \ # CPPFLAGS="-I/opt/libpcap/include" \ # LDFLAGS="-L/opt/libpcap/lib"

--prefix=/usr/local是安装根目录,arp-scan 可执行文件最终会出现在/usr/local/bin/arp-scan。后面两行注释是给 libpcap 装在自定义路径的情况用的:CPPFLAGS告诉编译器去哪找 pcap.h,LDFLAGS告诉链接器去哪找 libpcap.so。如果你是用系统包管理器装的 libpcap,这两行不用加。configure 跑完最后会打印一行 “creating Makefile”,看到这行才算成功。

3.2 make 编译与常见报错处理

configure 通过后,直接make编译:

# 编译,-j 参数按 CPU 核数并行加速 make -j$(nproc)

-j$(nproc)会自动读取 CPU 核心数并行编译,小项目几秒就完。如果这一步报pcap.h: No such file or directory,说明 2.1 节的开发包没装对,回去补 libpcap-dev。如果报undefined reference to pcap_open_live,那是链接阶段找不到库,检查LDFLAGS是否指对了 libpcap 的 lib 目录。还有一种情况是 gcc 版本太老,C99 语法不认,升级 gcc 到 4.8 以上即可。编译过程没有 warning 刷屏、最后停在gcc -o arp-scan ...这行,基本就稳了。

3.3 make install 与安装后文件分布

编译产物没问题,执行安装:

# 安装到 /usr/local 下,需要 root 权限 sudo make install # 确认二进制和 man 手册都到位 which arp-scan man -w arp-scan

make install会把arp-scan和arp-fingerprint两个可执行文件复制到/usr/local/bin,man 手册放到/usr/local/share/man/man1。which arp-scan能输出路径就说明 PATH 没问题。如果提示 command not found,检查/usr/local/bin是否在$PATH里,很多最小化安装的系统默认不带这个路径,需要手动加进/etc/profile再source一下。到这一步,安装本身就算完成了,但能不能扫,还得看权限。

4. 权限与网卡配置:让 arp-scan 真正能发包

4.1 原始套接字权限的两种给法

arp-scan 要构造并发送 ARP 帧,必须拿到原始套接字(raw socket),这需要 root 权限或者CAP_NET_RAW能力。最直接的做法是sudo arp-scan,但生产环境里我不建议长期用 sudo 跑扫描,容易留下权限过大的隐患。更规范的是给二进制文件单独授权:

# 方法一:设置 setuid,让普通用户执行时临时获得 root 权限 sudo chown root:root /usr/local/bin/arp-scan sudo chmod u+s /usr/local/bin/arp-scan # 方法二:用 setcap 只授予网络原始套接字能力,粒度更细 sudo setcap cap_net_raw+ep /usr/local/bin/arp-scan

方法一简单粗暴,但 setuid 程序一旦有漏洞影响面大。方法二用setcap只给cap_net_raw这一项能力,更符合最小权限原则,我一般优先用方法二。注意setcap需要系统支持 capabilities,老内核可能不认。设置完用getcap /usr/local/bin/arp-scan确认一下,输出里有cap_net_raw+ep就对了。

4.2 指定网卡接口与扫描范围

权限搞定后,先看系统有哪些网卡,再决定扫哪个口:

# 列出所有网络接口 ip link show # 指定网卡扫描整个网段 sudo arp-scan -I eth0 192.168.1.0/24 # 只扫特定几个地址,适合快速定位冲突 sudo arp-scan -I eth0 192.168.1.10 192.168.1.20

-I参数指定从哪块网卡发包,多网卡机器上必须显式指定,否则 arp-scan 可能选错出口,扫半天一个回包都没有。192.168.1.0/24是 CIDR 写法,表示扫整个 C 段。如果只想查某几个可疑地址,直接把 IP 列在后面,速度更快。扫描结果里00:1a:2b:...是 MAC 地址,后面括号里是网卡厂商,同一 IP 出现两个不同 MAC,基本就是冲突实锤。

4.3 输出格式与结果解读

默认输出是“IP + MAC + 厂商”三列,但排查冲突时我更关心重复项。可以用--format自定义输出,或者配合 grep 过滤:

# 自定义输出格式,只保留 IP 和 MAC,方便脚本处理 sudo arp-scan -I eth0 --format='${ip}\t${mac}' 192.168.1.0/24 # 统计同一 MAC 是否对应多个 IP(反向查冲突) sudo arp-scan -I eth0 192.168.1.0/24 | awk '{print $2}' | sort | uniq -d

--format里的${ip}和${mac}是 arp-scan 内置的占位符,可以自由组合。第二条命令把 MAC 列抽出来排序去重,如果某个 MAC 出现两次以上,说明这台设备可能配了多个 IP,或者有人在手动改地址。反过来,同一个 IP 对应两个 MAC,就是典型的 IP 冲突。这两种情况在排查时都要留意,别只看单次扫描结果。

5. 避坑与常见问题排查:装完扫不到怎么办

5.1 报错 “No such device” 或 “interface not found”

现象是执行 arp-scan 时提示找不到指定网卡,但你ip link明明能看到。原因通常是网卡名写错,或者用了旧版命名(eth0 在新系统上可能叫 ens33、enp0s3)。解决方法是先用ip link show确认实际接口名,再传给-I参数。如果接口名带特殊字符,用引号包起来。还有一种情况是网卡处于 down 状态,ip link set eth0 up启用后再扫。

5.2 扫描结果为空,一个回包都没有

现象是命令正常执行、不报错,但输出只有表头没有数据。原因有三个常见方向:一是网段写错,比如实际是 192.168.0.0/24 你写了 192.168.1.0/24;二是网卡选错,包从错误的接口发出去了;三是目标网段有防火墙或交换机做了 ARP 抑制。排查顺序是先ping一个已知在线的地址确认网络通,再换-I接口重试,最后用tcpdump -i eth0 arp抓包看请求有没有发出去、有没有回包。

5.3 普通用户执行报 permission denied

现象是 root 能跑,普通用户跑就报权限错误。原因是原始套接字需要特权,而你没做 4.1 节的授权。解决方法是按 4.1 节设置 setuid 或 setcap。注意 setcap 在部分文件系统(如某些 NFS 挂载)上不生效,这种情况只能退回 setuid 或者用 sudo。另外,如果二进制文件被更新过(重新 make install),setcap 属性会丢失,需要重新设置,这是很多人重装后“又扫不了”的原因。

5.4 编译时提示 “configure: error: pcap.h not found”

现象是 configure 阶段直接退出,报找不到 pcap.h。原因是 libpcap 开发包没装,或者装在非标准路径而你没通过 CPPFLAGS 指定。解决方法是先确认find / -name pcap.h能不能找到头文件,找不到就装 libpcap-dev;找得到但不在 /usr/include,就在 configure 时加上CPPFLAGS="-I实际路径"。这个坑和 2.1 节呼应,装依赖时多花十秒检查,能省后面半小时折腾。

5.5 扫描速度慢或漏报

现象是扫一个 C 段要等很久,或者明明在线的设备没扫出来。原因是 arp-scan 默认发包间隔和重试次数偏保守,网络质量差时容易漏。可以用--retry增加重试次数,用--timeout调整等待时间:

# 增加重试到 3 次,超时设为 500 毫秒,适合丢包率高的网络 sudo arp-scan -I eth0 --retry=3 --timeout=500 192.168.1.0/24

--retry是每个地址的重试次数,默认 1;--timeout是每次等待回包的毫秒数,默认 100。调大这两个值能提高准确率,代价是扫描变慢。我一般在内网排查时用默认值,跨网段或无线环境才调大。漏报还有一种可能是目标设备开了 ARP 防护,这种情况 arp-scan 无能为力,得换其他手段。

6. 装完怎么验证跑通:三条命令确认环境可用

装完别急着上生产扫全网段,先用三条命令做最小验证,确认工具链、权限、网卡三件事都正常。第一条验证版本和基本可用性:

# 输出版本号,确认二进制能正常执行 arp-scan --version

能打印出arp-scan 1.9就说明二进制本身没问题。第二条验证权限,用普通用户(非 root)执行一次本机回环扫描:

# 普通用户扫描本地回环,验证 setcap/setuid 是否生效 arp-scan -I lo 127.0.0.1

如果这条不报 permission denied,说明 4.1 节的授权生效了。注意回环接口不一定有 ARP 回包,这里只看权限是否通过,不看结果条数。第三条验证真实网卡发包能力,扫本机所在网段的一个已知地址:

# 扫描网关地址,确认能从真实网卡发出并收到 ARP 回包 arp-scan -I eth0 192.168.1.1

把eth0和192.168.1.1换成你实际环境的接口和网关。能返回一行 MAC 地址,就说明从发包到收包整条链路通了。这三条走完,再去做全网段冲突排查才有意义。

我自己的习惯是,每次在新机器上装完 arp-scan,都会把这三条命令存成一个check-arp-scan.sh,重装系统或迁移环境后先跑一遍。有一次在一台 CentOS 上,--version正常、lo扫描也正常,但真实网卡就是没回包,最后发现是网卡没插网线、链路 down,白折腾了半小时。从那以后我每次验证都强制走完这三步,尤其是第三步,绝不跳过。希望帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进