如何写局域网设备扫描脚本

wen 实用脚本 21

从零到精通的全攻略

📖 目录导读

  1. 脚本开发前的必备知识(局域网协议、IP地址、端口基础)
  2. 主流扫描技术对比(Ping扫描、ARP扫描、TCP/UDP扫描)
  3. 开发环境搭建(Python、Nmap、Scapy等工具选择)
  4. 实战代码解析(三个经典脚本案例)
  5. 结果优化与可视化(数据去重、MAC厂商识别、Web展示)
  6. 安全与合规指南(权限控制、扫描频率、法律边界)
  7. 常见问题Q&A(速度慢怎么办?如何防误判?)

脚本开发前的必备知识

1 局域网设备扫描的原理

局域网(LAN)内的设备通过IP地址和MAC地址通信,要扫描它们,核心是通过发送特定数据包并监听响应,来判断某个IP地址是否存活、开放了哪些端口、运行了什么服务。

如何写局域网设备扫描脚本

2 IP地址与子网掩码

  • C类局域网典型地址168.1.0/24 表示从 168.1.1168.1.254
  • 子网掩码255.255.0 告诉脚本哪些IP属于同一个网段

主流扫描技术对比

技术类型 原理 优缺点 适用场景
ICMP Ping扫描 发送ping请求,等待回复 简单但可能被防火墙屏蔽 快速检测在线设备
ARP扫描 发送ARP广播包,读取响应MAC 速度快、准确性高(本网段内) 获取所有活跃设备MAC
TCP SYN扫描 发送SYN包,等待SYN-ACK响应 隐蔽、可发现开放端口 端口/服务探测
UDP扫描 发送UDP包,等待ICMP不可达 慢且不可靠,但能发现UDP服务 监控/游戏服务器探测

专家提示:在纯内网环境(无VLAN隔离),ARP扫描是最高效的方法,因为所有设备都会响应ARP请求。


开发环境搭建

1 推荐工具栈

  • Python 3.x(跨平台、库丰富)
  • Nmap(工业级扫描引擎,可集成到Python)
  • Scapy(自定义数据包构造)
  • Arp-scan(Linux专用ARP扫描利器)

2 Python环境安装

# 安装核心库
pip install python-nmap scapy netifaces
# Linux/Mac需root权限执行ARP扫描

实战代码解析(三个经典脚本)

案例1:纯Python ARP扫描(最可靠)

import scapy.all as scapy
from netifaces import interfaces, ifaddresses, AF_INET
def get_my_ip_network():
    """自动获取本机IP和子网掩码"""
    for iface in interfaces():
        addrs = ifaddresses(iface)
        if AF_INET in addrs:
            ip = addrs[AF_INET][0]['addr']
            netmask = addrs[AF_INET][0]['netmask']
            # 计算网络地址(简化版)
            ip_parts = ip.split('.')
            mask_parts = netmask.split('.')
            network = '.'.join([str(int(ip_parts[i]) & int(mask_parts[i])) for i in range(4)])
            return f"{network}/24"  # 假设是/24子网
    return "192.168.1.0/24"
def arp_scan(network):
    """执行ARP扫描并返回设备列表"""
    arp_request = scapy.ARP(pdst=network)
    broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
    packet = broadcast / arp_request
    answered = scapy.srp(packet, timeout=2, verbose=False)[0]
    devices = []
    for sent, received in answered:
        devices.append({"ip": received.psrc, "mac": received.hwsrc})
    return devices
# 执行扫描
network = get_my_ip_network()
print(f"扫描网络: {network}")
devices = arp_scan(network)
print(f"发现 {len(devices)} 台设备:")
for dev in devices:
    print(f"IP: {dev['ip']:16} MAC: {dev['mac']}")

案例2:Nmap端口扫描(适合服务器)

import nmap
def nmap_port_scan(target_ip="192.168.1.0/24"):
    nm = nmap.PortScanner()
    # 扫描1-1024端口(服务识别)
    nm.scan(hosts=target_ip, arguments='-sS -T4 -p 1-1024 --open')
    for host in nm.all_hosts():
        print(f"主机 {host} ({nm[host].hostname()}):")
        for port in nm[host]['tcp']:
            state = nm[host]['tcp'][port]['state']
            service = nm[host]['tcp'][port]['name']
            if state == 'open':
                print(f"  端口: {port:5} 服务: {service}")

案例3:批处理Ping扫描(Windows快速方案)

@echo off
echo 扫描局域网活跃设备...
for /L %%i in (1,1,254) do (
    ping -n 1 -w 200 192.168.1.%%i 2>nul | find "TTL" >nul && echo 设备: 192.168.1.%%i 在线
)

结果优化与可视化

1 高级功能实现

  • MAC厂商识别:调用macvendor库或本地OUI数据库
  • 去重与排序:按IP地址排序,过滤网关设备
  • Web实时展示:Flask + Socket.IO 实现扫描进度推送
# MAC厂商识别示例
import requests  # 或本地OUI库
def get_vendor(mac):
    url = f"https://api.macvendors.com/{mac}"
    try:
        resp = requests.get(url, timeout=2)
        return resp.text if resp.status_code == 200 else "Unknown"
    except:
        return "Unknown"

2 输出格式建议

[
    {
        "ip": "192.168.1.1",
        "mac": "00:11:22:33:44:55",
        "vendor": "Cisco Systems",
        "hostname": "router.home",
        "open_ports": [80, 443, 22]
    }
]

安全与合规指南

1 必须遵循的规则

  1. 权限控制:ARP扫描需要root/管理员权限
  2. 扫描频率:每IP间隔至少100ms,避免DoS误判
  3. 范围限制:只能扫描管理员授权的网段
  4. 日志保留:记录扫描时间、目标、结果

2 法律红线

  • 禁止扫描未授权网络(可能违反《计算机信息系统安全保护条例》)
  • 企业内网使用需获得IT部门书面许可
  • 扫描结果不得用于非法攻击

常见问题Q&A(必看)

Q1: 脚本扫描速度很慢怎么办?

  • 优先使用多线程/协程(如Python的concurrent.futures
  • ARP扫描替代Ping扫描(速度提升10倍)
  • 分段扫描:/24网段分4组并发
# 多线程示例
from concurrent.futures import ThreadPoolExecutor
def scan_ip(ip):
    # 执行单个IP的ARP请求
    pass
with ThreadPoolExecutor(max_workers=50) as executor:
    results = executor.map(scan_ip, ip_list)

Q2: 为什么有些设备扫描不到?

  • 防火墙屏蔽:Windows防火墙可能拦截ICMP/TCP扫描
  • 无线休眠:移动设备待机后可能不响应ARP
  • VLAN隔离:跨VLAN需要网关转发ARP(需特殊配置)
  • MAC地址过滤:部分设备配置了白名单

解决方案

  1. 使用-P0选项(Nmap跳过主机发现)
  2. 在设备上临时关闭防火墙测试
  3. 检查交换机端口安全设置

Q3: 如何判断结果是误报?

  • 重复三次扫描:仅当连续3次都出现该IP才标记为存活
  • 交叉验证:用arp -a命令对比本地ARP表
  • TTL值异常:Windows默认TTL=128,Linux=64,路由器=255

Q4: 可以在树莓派/OpenWrt上运行吗?

  • 树莓派:安装Scapy后完美运行,建议使用python3-libscapy
  • OpenWrt:需安装arp-scan包(占用资源极小)
  • iOS/Android:需越狱/root,推荐使用Termux + nmap插件

构建你的专属扫描工具

从基础原理到实战代码,我们已经覆盖了局域网设备扫描的完整链路,建议读者按以下路线进阶:

  1. 新手:先运行案例1的ARP扫描,理解基础输出
  2. 进阶:集成MAC厂商识别、添加Web界面
  3. 专家:实现自动化报警(当新设备接入时发送微信通知)

记住:技术本身是中立的,请始终将“授权与隐私”放在首位,一个好的扫描脚本,应当是网络管理的助手,而非破坏的工具。

如果你在实践过程中遇到任何问题,欢迎在评论区提问(本文为示例文章,无真实留言功能)。

抱歉,评论功能暂时关闭!