不能靠轮询全网扫描实时发现新增IP;应监听/proc/net/arp变化,用comm比对前后快照识别新IP/MAC,再针对性轻量nmap探测,并加限频、脱敏、日志收敛等防护措施。

如何用 bash + nmap 实现内网 IP 变化监听
直接结论:不能靠“轮询全网段扫描”来“实时发现新增 IP”,那太重、太慢、还容易被防火墙拦截;真正可行的方案是监听本地 ARP 表变化 + 辅以轻量探测,再对新出现的 MAC/IP 组合做针对性端口指纹识别。
Linux 内核会自动维护 /proc/net/arp,只要设备跟本机发生过二层通信(比如响应 ping、DHCP 请求、SMB 浏览、甚至只是发了广播包),就会留下记录。这是最轻量、最隐蔽、也最贴近真实“接入”的信号源。
- 不要用
nmap -sn 192.168.1.0/24每 10 秒扫一遍——ARP 表更新延迟通常在秒级,而全网 ping 扫描至少要 2–5 秒,还可能触发 IDS 告警 - 优先读取
/proc/net/arp,过滤掉00:00:00:00:00:00(无效)和incomplete(未解析)条目 - 用
awk '{print $1,$4}'提取 IP 和 MAC,配合comm或临时文件做前后快照比对 - 注意:某些交换机端口安全策略或静态 ARP 配置会导致新设备不进 ARP 表,此时需 fallback 到 DHCP 日志或镜像流量分析(那是另一套方案)
怎么写一个带状态记忆的增量发现脚本
核心难点不是扫描,而是“记住上次看到哪些 IP/MAC”,只输出新增项。别用 date 命名临时文件,用固定路径 + stat 时间戳判断更稳。
示例关键逻辑:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
#!/bin/bash
ARP_FILE="/tmp/last_arp"
CURRENT="/tmp/current_arp"
<p>awk '$4 != "00:00:00:00:00:00" && $5 != "incomplete" {print $1 "\t" $4}' /proc/net/arp | sort > "$CURRENT"</p><p>if [[ -f "$ARP_FILE" ]]; then
comm -13 "$ARP_FILE" "$CURRENT" | while IFS=$'\t' read -r ip mac; do
echo "NEW: $ip ($mac)"</p><h1>后续调用 nmap</h1><pre class='brush:php;toolbar:false;'> nmap -sS -sV -p- --min-rate=1000 --max-retries=1 -T4 "$ip" -oG "/tmp/nmap_$ip.gnmap" 2>/dev/null &
donefi mv "$CURRENT" "$ARP_FILE"
-
comm -13表示只输出$CURRENT中有但$ARP_FILE中没有的行(即新增) -
nmap -sS -sV -p-是高风险组合,实际中应限制端口范围,比如-p21,22,23,25,53,80,443,3389,8080 -
--min-rate=1000容易被丢包干扰,内网建议改用--min-parallelism=50更稳 - 务必加
&后台执行,否则多个新 IP 会串行阻塞
nmap 端口指纹识别时为什么常返回 “tcpwrapped” 或空服务
这不是脚本写错了,是目标服务主动拒绝或中间设备干扰的结果。常见原因有三个:
- 目标开了 TCP Wrapper(
/etc/hosts.allow限制),nmap 连上就断,返回tcpwrapped—— 此时nmap --script banner也拿不到任何信息 - 交换机或终端设备启用了端口安全(Port Security),对非白名单 MAC 的 SYN 包静默丢弃,nmap 显示
filtered,根本到不了服务层 - 目标系统禁用了 ICMP 且设置了 SYN Cookies,导致 nmap 默认探测超时;可加
--max-scan-delay 10或换用-sT(完整三次握手) - 某些 IoT 设备(如摄像头、打印机)只在特定端口开放 HTTP,但返回的是自定义协议头,
nmap -sV无法识别,需配合--script http-title或手动curl -I
生产环境必须加的防护和收敛措施
这个脚本一旦跑起来,很容易演变成内网扫描器,引发运维告警甚至权限回收。上线前必须做三件事:
- 限定网段:硬编码
grep "192\.168\.1\." /proc/net/arp,别留/24口子 - 限频:用
sleep 30控制检查间隔,别设成 5 秒;新增 IP 的 nmap 扫描加--host-timeout 30s - 日志脱敏:MAC 地址可保留,但 IP 若涉及敏感子网(如财务 VLAN),应在输出前做哈希或掩码处理,例如
echo "$ip" | awk -F. '{print $1"."$2".0.0"}' - 别把结果直接写进
/var/log—— 改用logger -t arpwatch走 syslog,方便统一审计和切割
ARP 表不是真理,它只反映“曾经通信过”。真正要确认设备是否“在线并可交互”,得在指纹识别后补一次 curl -s --connect-timeout 3 http://$ip/ 2>/dev/null | head -c1 —— 很多设备开着 SSH 却关了 HTTP,这点容易被忽略。

















