直接用 offgrid-ing/arp 的 scan 函数可高效完成 arp 扫描,只需传入合法接口名、cidr 子网和 scanconfig 配置,自动处理发包、超时与响应收集;返回 []arp.host 结构化结果,错误类型明确,纯 go 实现无外部依赖。

直接用 offgrid-ing/arp 包的 Scan 函数,比写 pcap 循环、构造以太网帧、开 goroutine 发包再监听响应快得多——它把 ARP 扫描封装成一个参数可控、错误可捕获、结果结构化的调用。
如何调用 Scan 函数完成一次完整扫描
核心是传入合法的网络接口名和目标子网,函数内部自动完成地址枚举、并发发包、超时等待与响应收集。不需要手动打开 pcap、构造 layers.Ethernet 或解析 layers.ARP 层。
-
Scan第一个参数是接口名(如"eth0"),必须真实存在且 UP 状态;传错会返回interface not found - 第二个参数是 CIDR 字符串(如
"192.168.1.0/24"),不能是单个 IP;传"192.168.1.100"会静默失败,不报错但结果为空 - 第三个参数是配置结构体
arp.ScanConfig,关键字段:Timeout(默认 1s,局域网延迟高时建议设为2000 * time.Millisecond)、Retries(默认 1,丢包率高时设为 2)、Concurrency(默认 64,C 类网段够用,扫 /16 建议降到 16)
为什么不用 arping 或 arp-scan 的 Go 封装?
因为它们本质是 exec.Command 调用外部二进制,启动开销大、输出解析脆弱、无法嵌入到长期运行的服务中。而 offgrid-ing/arp 是纯 Go 实现,无 cgo、无依赖、可直接 import 使用。
- 调用
arp.Scanf后返回的是[]arp.Host,每个元素含IP、MAC、Vendor字段,无需正则提取 - 错误类型明确:
arp.ErrNoRoute表示该子网不在本机路由表中,arp.ErrPermission表示没权限抓包(需sudo或 cap_net_raw) - 在容器里跑时,如果用
arp-scan,得额外挂载/dev/net/tun或加特权;而offgrid-ing/arp只需确保 net_raw capability 即可
常见 panic 和静默失败点
最常踩的坑不是语法错误,而是网络上下文缺失:函数不检查你是否连着那个网段,只管发包。结果就是“扫了但啥都没回来”,你还以为代码有问题。
- 没指定正确接口:比如机器有
ens33和wlan0,但传了"eth0"——Linux 下这个接口名可能根本不存在 - 子网不在本地直连:传
"10.10.20.0/24"但本机路由表里没有这条路由,Scan会成功返回空切片,不报错 - 防火墙或交换机 ACL 拦了 ARP 请求:某些企业网络设备会过滤非 DHCP 客户端发出的 ARP,此时所有目标都超时,需换物理口或联系网络管理员
真正要小心的,是把 Scan 当作黑盒 ping 用——它不验证三层可达性,只确认“二层能说话”。在线 ≠ 能 ssh,也不代表 IP 没冲突。别跳过验证网关 MAC 是否匹配这一步。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











