使用 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]。
具体步骤如下:
- 创建一个 ARP 请求数据包。
- 设置目标网络范围。
- 将数据包广播给所有设备。
- 捕获并解析响应。
- 打印每个设备的 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 工具。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.