
简介Netdiscover 0.3-pre-beta7是一款开源ARP扫描工具专注于无DHCP环境下的网络设备发现能快速获取活动主机的IP、MAC及隐藏无线网络信息适合网络管理员、安全测试者进行监控与排查。该源码包共39个文件体积仅359KB其中C源码8个、头文件6个另含构建脚本configure、Makefile、打包规格文件及项目说明、更新记录等文档便于用户自行编译或二次开发。目前已有262人学习该资源适合对ARP协议、网络发现机制感兴趣的初学者及有经验的技术人员参考。通过阅读源码和构建流程读者可以深入理解ARP请求/响应的工作过程掌握Netdiscover与nmap、ettercap等工具组合运用的思路同时开放源码允许按需定制扫描逻辑为网络监控、故障排查和安全审计提供可扩展的基础。压缩包还附带版权与作者说明文档便于遵守开源许可规范。1. Netdiscover 是什么一次 ARP 扫描就能把同网段活主机全部挖出来Netdiscover 是一个跑在 Linux/Unix 上的开源 ARP Scanner专门用来做二层网络的主机发现。它不靠 ping、不靠端口探测而是直接用 ARP 请求去问整个网段「谁在回个话」凡是网卡还活着、没有刻意丢弃 ARP 的主机基本都会被翻出来。我第一次用它是在帮朋友盘一个三层交换机下挂了三十多台设备的老办公网当时 ping 扫丢了一半的机器换 Netdiscover 一遍就齐了。它适合三类人网络运维要做资产盘点、做授权范围内安全评估时先画内网拓扑、以及搞嵌入式开发想知道板子有没有正常上线。命令不长结果很直观属于那种装上就能出活的开源工具。2. Netdiscover 的扫描原理为什么同网段主机躲不掉 ARP 请求2.1 主动模式拿 who-has 广播当点名器收到 ARP 回复即确认存活Netdiscover 默认的主动模式本质上是一个二层点名器。它针对目标网段里的每一个 IP构造一条 ARP 请求“who-has 192.168.1.100 tell 192.168.1.10”然后把这个请求广播到当前局域网。目标主机的网卡一旦发现问的是自己就会回一条 ARP 回复把自己的 MAC 地址交出来。Netdiscover 收到回复后就把「IP MAC 厂商信息」记到结果表里。这个逻辑用伪代码还原出来大概是这样for ip in target_range: send_arp_request(src_macmy_mac, src_ipmy_ip, dst_ipip, broadcastTrue) reply wait_arp_reply(timeout300ms) if reply is not None: record(ip, reply.src_mac)这里值得注意的一个点是即使目标主机的防火墙把 ICMP 全丢了、甚至拒绝 TCP 连接它依然会回复 ARP。因为 ARP 发生在 IP 协议栈和防火墙规则生效之前只要网卡驱动在正常工作内核就会自动处理 ARP 请求。这就是为什么很多ping扫不出来的设备用 Netdiscover 一约就应。你可以把它理解成ping 是在敲门问“有人在吗”对方可以装没听见ARP 是在楼下喊收快递门卫无论如何都得签收。这也是 Netdiscover 这类 ARP Scanner 在局域网资产盘点里比 ICMP 扫描可靠的核心原因。2.2 被动模式不发一包靠监听 ARP 流量还原设备关系Netdiscover 的被动模式就完全是另一套玩法了。用-p参数启动后它不主动发出任何 ARP 包而是把网卡设成混杂模式蹲在链路层上监听网络里正在发生的 ARP 请求和回复。任何一台主机要跟另一台通信第一步几乎都是先发 ARP 问 MAC而这些帧都会被 Netdiscover 收进眼里。被动模式的典型价值在于隐蔽性和跨 VLAN 观察。在做授权范围内的安全评估时主动往全网段灌 ARP 请求容易被网络监控设备记为异常行为而被动模式不产生流量适合在旁路观察一段时间看真实业务中哪些设备在互相通信甚至能画出比主动扫描更真实的主机关系图。代价也明显如果网络里十分钟没人发 ARP那这十分钟的结果就是一片空白。它看到的是「此刻正在说话的人」不是「所有活着的人」。我一般会把被动模式当成补充手段用来发现那些主动模式下 MAC 伪装、或者间歇性上线的设备而不是主力工具。2.3 MAC 地址与厂商识别OUI 数据库决定了你能认出多少设备Netdiscover 的结果表里有一列 MAC Vendor这是拿 MAC 地址的前三个字节OUI组织唯一标识符去匹配厂商数据库得到的。IEEE 把厂商代码段分配得很规整比如74:83:c2开头大概率是 TP-LINK 的设备3c:22:fb大概率是树莓派的板载网卡。Netdiscover 在打包时会带上 OUI 数据文件所以装完之后开箱就能显示出一部分厂商名。但这个识别有两个边界。第一OUI 只表明网卡芯片或模块的制造商不代表设备品牌。一块 Intel 网卡装进联想整机里显示的就是 Intel不是 Lenovo。第二数据库总有滞后新出的设备、小众的物联网模块经常匹配不到显示成 Unknown 。这时候不要怀疑扫描器坏了而是数据库不够新。遇到 Unknown 的 MAC我会复制到 IEEE OUI 查询页面人工确认或者配合后面要讲的交叉验证手段来判断它是什么设备。2.4 为什么网段参数决定成败ARP 不出三层还有一个必须建立的概念ARP 请求没法跨路由器。三层设备会转发 IP 数据包但不会转发二层广播帧。你在 192.168.1.0/24 里发 ARP 广播192.168.2.0/24 里的主机永远收不到。所以 Netdiscover 的-r参数给的网段必须是本机网卡物理所在的广播域或者你在该网段内有主机可以执行扫描。这直接引出了后面避坑章节里最常见的错误——拿着办公网的机器去扫服务器网段结果当然什么也扫不到。理解了这个边界Netdiscover 的适用场景就清楚了它是一个二层工具干的是同一广播域里的活。想跨网段你得先把扫描器部署到目标网段里或者借助交换机的管理口、镜像口来完成旁路观察。3. 用 Netdiscover 跑一次资产盘点安装、最小命令与结果落盘3.1 安装与最小可用命令先拿到一张活主机表Netdiscover 在 Debian/Ubuntu 系的软件源里就有装起来没有什么悬念。CentOS/RHEL 系的 EPEL 源里也有打包另外源码托管在开源代码平台想改参数行为或者跟踪新版直接拉源码编译也可以。大部分情况用发行版源里的就够用了。# Debian / Ubuntu sudo apt update sudo apt install -y netdiscover # CentOS / RHEL EPEL sudo yum install -y epel-release sudo yum install -y netdiscover装完后先验证一下版本避免后面参数行为对不上。netdiscover -h这里我用最小可用命令跑一次完整扫描。假设本机网卡是 eth0要扫 192.168.1.0/24sudo netdiscover -i eth0 -r 192.168.1.0/24 -c 3sudo是必须的Netdiscover 要创建原始套接字来收发 ARP 帧普通用户没有这个权限。-i eth0指定物理网卡-r给出目标网段-c 3表示对每个 IP 连续发 3 次 ARP 请求。为什么要发 3 次而不是 1 次因为有些设备在省电模式下会丢包或者正在处理别的中断一次请求没被响应不代表它不在线。-c 3相当于给了三次机会代价是扫描时间约翻三倍但对一个 /24 网段来说还是秒级的事。跑完的结果会以表格形式打在屏幕上列出 IP、MAC 地址、收到回应次数、帧长度和厂商识别。把网关的 IP 和 MAC 对一下你就能确认这次扫描的链路是正确的。3.2 常用参数速查-i / -r / -c / -s 到底怎么调Netdiscover 的参数不多但每个都直接影响扫描结果。我按使用频率整理了一张速查表参数作用我的常用值说明-i 接口指定扫描使用的网卡eth0多网卡机器必须显式指定否则可能扫错网络-r 网段指定目标网段支持 CIDR192.168.1.0/24也可以写范围如192.168.1.10-192.168.1.20-c 次数每个 IP 发送 ARP 请求的次数2到3网络干净用 1有人丢包用 3-s 秒每轮扫描之间的睡眠间隔0或1调大可以降低网络噪音调小扫得快-p切换到被动监听模式无适合旁路观察不主动发包-l 文件从文件读取多个扫描网段无每行一个网段适合批量盘点-t每次发送后的重试等待时间默认即可对慢速设备可适当加长举个例子-s 1会让每一轮请求之间睡 1 秒整个 /24 扫下来大概多花 4 分钟但网络里几乎感受不到扫描流量。在业务正在跑的生产网里我一般会把-c降到 1、-s提到 2宁慢勿吵在专门的测试网段里直接默认参数跑完拉倒。-l这个参数在多个独立网段轮查时很省事。文件内容格式就是一行一个网段192.168.1.0/24 172.16.10.0/24 10.0.30.0/28然后执行sudo netdiscover -i eth0 -l ranges.txtNetdiscover 会依次遍历这些网段。我习惯在处理多楼层、多交换机的办公网时用这个方式避免手抖打错-r。3.3 结果保存与二次处理把表格变成可用的资产清单Netdiscover 的终端表格好看但不方便检索尤其是扫一个上百台设备的网段表格滚动完基本就找不到了。我一般会做两件事保存原始输出再用 grep/awk 抽出关键列。# 保存原始结果文件名带上日期 sudo netdiscover -i eth0 -r 192.168.1.0/24 -c 2 | tee netdiscover-$(date %F).log # 提取所有 IP MAC 组合去重后写入清单 grep -E ^192\.168\. netdiscover-$(date %F).log | awk {print $1, $2} | sort -u asset_list.txt第一行命令里的tee把屏幕输出同时写进日志文件后面的文件名用date %F动态生成方便归档。第二行命令做一个简单的过滤只取以目标网段地址开头的行打印前两列IP 和 MACsort -u去重。Netdiscover 有时会对同一个 IP 记录多行比如不同轮次都收到回应sort -u能把重复清掉。如果还想把结果做成表格给团队看可以直接在命令行里处理awk /^192\.168\./ {print $1 \t $2 \t $NF} netdiscover-*.log | sort -t. -k1,1n -k2,2n -k3,3n -k4,4n$NF取的是每行最后一列也就是厂商信息sort按 IPv4 四段数值排序让清单按地址顺序排列而不是乱序出现。这一步处理完差不多就是一份可以直接拿去对账的资产底稿了。4. Netdiscover 避坑记录五个让扫描空手而归的常见问题4.1 跨网段扫不到设备ARP 请求根本过不了路由器现象用 Netdiscover 扫了一个网段结果表里除了一台网关什么都没有。或者干脆只有本机自己。原因这是把 Netdiscover 当三层扫描器用了。ARP 是二层协议路由器会把 IP 包转发过三层但没有义务转发广播帧。你在 192.168.1.0/24 里发 ARP broadcast192.168.2.0/24 里的交换机端口根本收不到这个帧。能扫到网关是因为网关接口参与了本网段的 ARP 通信。解决确认目标网段和本机网卡是否在同一个广播域。最简单的验证方法是看网关 MAC 是否被扫出来并且网关 IP 是否在目标网段内。如果确实要扫另一个网段要么把扫描器部署到那个网段里要么借助交换机的远程端口镜像把流量引过来后用-p被动模式观察。4.2 交换机端口隔离与无线 Client Isolation二层被隔断时看到一片空白现象在一栋楼的弱电间旁边、或者连着办公室 Wi-Fi 的笔记本上跑扫描结果里只有网关和本机明明手机、打印机都在线。原因现在的交换机可以配置端口隔离同一个 VLAN 里的端口之间禁止直接通信只能访问上联口无线 AP 的 Client Isolation客户端隔离也是同样的逻辑连上同一个 SSID 的几个设备彼此不可见。这两种配置在网络里越来越常见因为可以防 ARP 欺骗和横向扩散。Netdiscover 的广播包发出去后只有上联口能收到其他主机根本没机会回应。解决先确定这不是扫描器的问题。换一个有线接入点试扫如果正常就说明网络里确实存在隔离策略。对这些网络环境Netdiscover 不是不能用而是要从上联口的方向做观察比如接到核心交换机上挂一个旁路探针用-p模式监听 ARP。无线环境里想盘点终端更靠谱的方式是登录无线控制器查看在线客户端列表而不是在终端侧扫。4.3 多网卡选错接口扫到的不是你想扫的那个网络现象服务器的ip addr里明明有 eth0 和 eth1分别连着两个网段。用默认参数跑扫出来的设备和预期不符手动指定eth1后又什么都看不见。原因很多发行版里不带-i参数时 Netdiscover 会自动选择「第一个活动网卡」但这个选择不一定是你要扫的那张。如果 eth1 是管理口、eth0 才是业务口自动选中的可能是管理口扫出来的自然是管理网段。解决养成显式传-i的习惯不要依赖默认行为。执行前先用ip addr确认接口名称和对应 IP再动手。另外要检查选中的网卡是否处于 up 状态、有没有拿到 IP 地址。一张没有 IP 的网卡不能发出有效的 ARP 请求表现就是扫谁谁没反应。4.4 权限与安装源的问题原始套接字打不开报错还分几种现象直接运行netdiscover -r 192.168.1.0/24报错提示没有权限创建 socket用sudo后又提示找不到网卡或设备忙。原因ARP 帧的收发必须通过原始套接字这个操作在 Linux 里被严格限制为 root 权限。Netdiscover 没有设置 setuid 位所以不以 root 跑基本必挂。而网卡设备忙多半是其他监控程序已经占用了这片网卡的抓包通道或者网卡本身处于 down 状态。解决最省事的做法是统一用sudo运行。如果公司策略不允许直接 sudo 这个命令可以考虑用sudo -u切到一个专门账号。# 为 netdiscover 创建专用低权限账号并授权避免直接开放 root sudo useradd -r -s /usr/sbin/nologin arpuser sudo setcap cap_net_rawep /usr/bin/netdiscoversetcap cap_net_rawep这行比较关键它给 Netdiscover 二进制单独授予原始套接字能力让普通用户也能执行 ARP 扫描不需要完整 root 权限。不过这招对部分发行版上的现象并不稳定有些内核和二进制组合会因为能力不足照样报错。我最终的做法很朴素审计记录里保留 sudo 日志扫描任务统一写成脚本由运维平台调度不在终端裸跑 root。4.5 手机 MAC 随机化与 OUI 识别失败结果看起来对不上设备现象同一台手机今天扫到的 MAC 是aa:bb:cc:xx:yy:zz下周再扫变成了aa:bb:cc:xx:yy:ww或者结果里出现一堆 Unknown 没法判断是什么设备。原因从 Android 10 和 iOS 14 开始手机默认对 Wi-Fi 连接使用随机 MAC 地址每次加入网络都可能换一个新身份。OUI 识别失败则是因为厂商数据库滞后物联网模组和部分网卡芯片还没收录。解决MAC 随机化无解它是终端厂商的隐私策略扫描器层面对抗不了。应对方式是把观察周期拉长、把历史数据串起来看以「同一个随机 MAC 的不同变体」判断一台设备而不是以单一 MAC 为准。OUI 识别失败则好解决把那几个 MAC 的前三字节批量丢到 IEEE 的 OUI 查询页比对或者更新系统里的 ieee-data 包再重扫。注意OUI 显示「Unknown」不代表扫描失败MAC 地址本身是对的只是厂商名没匹配上。5. 把 Netdiscover 接进日常定时盘点脚本与 ARP 表交叉验证5.1 让设备清单每周自动生成一次Netdiscover 这类工具单次扫完看一眼就结束价值有限真正的用途是定期跑、留记录、做对比。我在公司服务器上放了一个最简单的 cron 任务每周日凌晨 3 点对办公网和服务器网段各扫一遍输出的日志按日期归档。#!/bin/bash # /opt/arp_scan/scan_daily.sh LOGDIR/var/log/netdiscover mkdir -p $LOGDIR DATE$(date %Y%m%d_%H%M) for net in 192.168.1.0/24 10.20.30.0/24; do sudo netdiscover -i eth0 -r $net -c 2 -s 1 $LOGDIR/scan_${DATE}_$(echo $net | tr / _).log done # 提取纯地址清单供对比脚本使用 cat $LOGDIR/scan_$DATE*.log | grep -E ^10\.|^192\.168\. | awk {print $1, $2} | sort -u $LOGDIR/summary_$DATE.txtcron 里引用它时注意两点脚本里的sudo要配置成免密否则定时任务执行不了日志目录的属主和读写权限要跟脚本里的输出重定向匹配。5.2 用 arp -a 和 Netdiscover 相互印证给结果上双保险Netdiscover 的结果终究是一次主动探测的快照我会拿系统自带的 ARP 缓存来交叉验证。本机最近跟哪些 IP 有通信arp -a里就会有这些 IP 和 MAC 的映射。如果 Netdiscover 扫出了某个 IP而arp -a里也有这条记录那这台设备的可信度就很高如果 Netdiscover 有而arp -a没有说明这台设备刚上线不久或者不太活跃值得再确认。对比命令其实很简单# 查看本机 ARP 缓存 arp -a # 把缓存里解析出的 IP 提取出来 arp -a | awk {print $2} | tr -d () | sort -u拿这个清单跟 Netdiscover 的结果做 diff两边对不上的就是重点关注对象。这个动作不能证明谁对谁错但能帮我筛掉大部分误报。我的经验是Netdiscover 报存活但 ARP 缓存里查不到的设备优先怀疑它是否真的存在反过来ARP 缓存里频繁出现但 Netdiscover 扫不到的主机大概率是刚下线或者有防火墙在丢 ARP 回应。这套「主动扫一遍 缓存对一遍 日志留半年」的习惯我用了挺久帮我在几次设备搬迁后快速核对出了哪些机器忘了改 IP、哪些终端被私接进了办公网。也希望帮到你。本文还有配套的精品资源点击获取