使用 Python 和 Scapy 构建网络扫描器

tags: python, networking, security, tutorial


tags: python, networking, security, tutorial


使用 Python 和 Scapy 构建网络扫描器

想象一下,你坐在办公桌前,想知道本地网络上究竟有哪些设备在“潜伏”。那台新买的智能电视真的连接了吗?有没有未授权的用户加入了你的 Wi-Fi?与其猜来猜去,不如写一段脚本,直接在终端里显示每台设备的 IP 和 MAC 地址。借助 Python 和强大的 Scapy 库,构建一个网络扫描器不仅可行,而且非常简单,今天就能运行起来。

为什么选择 Scapy?

Scapy 是一个用于数据包操作的 Python 库。它允许你在底层创建、发送和分析网络数据包,非常适合网络扫描、入侵检测和协议分析等任务 [1][2]。与那些抽象掉细节的高级工具不同,Scapy 让你完全掌控一切——非常适合学习网络的实际工作原理。

搭建你的环境

在编写代码前,你需要先安装 Scapy。它默认不包含在 Python 中,所以你需要通过 pip 来安装。

安装 Scapy

在 Linux 或 macOS 上:

pip install scapy

Enter fullscreen mode Exit fullscreen mode

在 Windows 上,你还必须安装 Npcap,并在安装过程中启用 WinPcap API 兼容模式 [3]。然后运行:

pip install scapy

Enter fullscreen mode Exit fullscreen mode

为了获得一个干净、隔离的设置,建议使用虚拟环境:

mkdir scanner
cd scanner
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
pip install scapy

Enter fullscreen mode Exit fullscreen mode

这种方法可以确保你的扫描器项目不会干扰其他 Python 包 [7]。

核心思路:ARP 扫描

在本地网络上发现设备最有效的方法是使用 ARP(地址解析协议)扫描。ARP 用于将 IP 地址映射到 MAC 地址。当你向整个网络发送 ARP 请求(广播)时,收到请求的每个设备都会用自己的 IP 和 MAC 地址进行回复,从而为你提供一份实时设备清单 [1][2]。

具体步骤如下:

  1. 创建一个 ARP 请求数据包。
  2. 设置目标网络范围。
  3. 将数据包广播给所有设备。
  4. 捕获并解析响应。
  5. 打印每个设备的 IP 和 MAC 地址。

你的第一个网络扫描器:可运行代码

让我们构建一个完整、可运行的扫描器。该脚本将扫描你的本地网络(例如 192.168.1.0/24)并列出所有活动设备。

from scapy.all import ARP, Ether, srp

# Define the network range to scan
target_ip = "192.168.1.0/24"

# Create an ARP request packet
arp = ARP(pdst=target_ip)

# Create an Ethernet frame with broadcast destination
ether = Ether(dst="ff:ff:ff:ff:ff:ff")

# Combine them into a packet
packet = ether / arp

# Send and receive packets at layer 2
result = srp(packet, timeout=3)[0]

# Store discovered clients
clients = []

for sent, received in result:
    clients.append({'ip': received.psrc, 'mac': received.hwsrc})

# Print results
print("Available devices in the network:")
print("IP" + " "*18+"MAC")
for client in clients:
    print(client['ip'] + " "*18 + client['mac'])

Enter fullscreen mode Exit fullscreen mode

将此代码保存为 scanner.py 并运行:

python scanner.py

Enter fullscreen mode Exit fullscreen mode

你将看到网络中所有当前连接的设备列表 [2]。

注意: 此脚本需要网络访问权限。在 Linux 上,请使用 sudo 运行。在 Windows 上,请确保 Npcap 已正确安装 [3]。

让它发挥作用:为你的网络定制

上面的示例使用的是硬编码的 IP 范围。为了让它今天就能派上用场,请根据你的实际网络进行调整:

查找你的网络范围

在 Linux/macOS 上:

ip route | grep default

Enter fullscreen mode Exit fullscreen mode

在 Windows 上:

ipconfig

Enter fullscreen mode Exit fullscreen mode

查找你的 IPv4 地址和子网(例如 192.168.1.100/24)。使用前三个八位字节 + /24 作为你的目标。

例如,如果你的 IP 是 10.0.0.5,请设置:

target_ip = "10.0.0.0/24"

Enter fullscreen mode Exit fullscreen mode

添加错误处理

将扫描逻辑封装在一个函数中,并妥善处理超时:

def scan_network(target):
    try:
        arp = ARP(pdst=target)
        ether = Ether(dst="ff:ff:ff:ff:ff:ff")
        packet = ether / arp
        result = srp(packet, timeout=3)[0]
        clients = []
        for sent, received in result:
            clients.append({'ip': received.psrc, 'mac': received.hwsrc})
        return clients
    except Exception as e:
        print(f"Error: {e}")
        return []

Enter fullscreen mode Exit fullscreen mode

现在你可以在代码的任何地方调用 scan_network("192.168.1.0/24")

超越基础扫描:下一步是什么?

一旦你让它运行起来,就可以扩展你的扫描器:

  • Ping 扫描:使用 Scapy 的 ICMP 功能对 IP 范围执行 ping 扫描 [4]。
  • 导出到 CSV:将结果保存到文件中以便记录或报告。
  • GUI 界面:与 Tkinter 或 PyQt 集成以创建可视化仪表板。
  • 实时监控:定期运行扫描器以检测加入网络的新设备。

Scapy 还支持 TCP、UDP 和自定义协议的创建——这使其成为高级网络安全工具的基础 [11]。

故障排除提示

  • 只看到自己? 确保你使用的是桥接适配器(尤其是在虚拟机中),这样你才能访问其他设备 [6]。
  • 没有响应? 检查防火墙设置或尝试增加 srp() 中的 timeout
  • Windows 问题? 确认 Npcap 已安装在 WinPcap 兼容模式下 [3]。

今天就开始扫描

你现在已经拥有了一个功能齐全的网络扫描器,它可以揭示本地网络上的每一台设备——无需猜测,也无需第三方工具。只要 Python、Scapy 和几行代码。

今晚就试着在你的家庭网络上运行它。看看有哪些设备在连接。找出未知设备。如果你发现有趣(或可疑)的东西,请在下面的评论中分享你的发现。

你的行动号召: Fork 这个脚本,为你的网络定制它,并将其推送到 GitHub。使用 #python#scapy#networksecurity 进行标记。让我们建立一个深入了解自己网络的开发者社区。

网络由你探索。开始扫描吧。


如果你觉得这篇文章有帮助,考虑请我喝杯咖啡 ☕ —— 它能让这些文章持续更新!

同时查看我的 AI 工具合集:AI 次元世界 —— 为开发者提供的免费 AI 工具。