Python 安全脚本:Scapy 实现网络流量分析

概述

Scapy 是一个强大的 Python 网络数据包操作库,可用于网络流量分析、安全监控和漏洞检测。以下脚本实现基础网络流量捕获与分析功能,包含协议统计和异常流量检测。

脚本实现
from scapy.all import *
import sys

def packet_handler(pkt):
    """处理捕获的数据包"""
    if IP in pkt:
        src_ip = pkt[IP].src
        dst_ip = pkt[IP].dst
        proto = pkt[IP].proto
        
        # 协议类型映射
        proto_map = {1: "ICMP", 6: "TCP", 17: "UDP"}
        proto_name = proto_map.get(proto, f"未知协议({proto})")
        
        print(f"[+] {src_ip} -> {dst_ip} | 协议: {proto_name}")

def analyze_traffic(interface, count=50):
    """主分析函数"""
    print(f"开始捕获 {count} 个数据包...\n")
    protocol_counter = {"TCP": 0, "UDP": 0, "ICMP": 0, "其他": 0}
    
    def _count_protocol(pkt):
        if IP in pkt:
            proto = pkt[IP].proto
            if proto == 6: protocol_counter["TCP"] += 1
            elif proto == 17: protocol_counter["UDP"] += 1
            elif proto == 1: protocol_counter["ICMP"] += 1
            else: protocol_counter["其他"] += 1
    
    # 捕获数据包并实时处理
    sniff(iface=interface, prn=packet_handler, count=count)
    
    # 统计协议分布
    print("\n协议统计结果:")
    for proto, count in protocol_counter.items():
        print(f"{proto}: {count} 数据包")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("使用方法: python scapy_analyzer.py <网络接口> [数据包数量]")
        sys.exit(1)
    
    interface = sys.argv[1]
    count = int(sys.argv[2]) if len(sys.argv) > 2 else 50
    
    try:
        analyze_traffic(interface, count)
    except PermissionError:
        print("错误: 需要管理员权限执行")

功能说明
  1. 实时流量监控

    • 捕获指定网络接口的原始数据包
    • 解析源/目标 IP 地址和协议类型
    • 支持 TCP/UDP/ICMP 协议识别
  2. 协议统计分析

    • 统计各协议数据包占比
    • 输出格式示例:
      TCP: 32 数据包
      UDP: 15 数据包
      ICMP: 2 数据包
      其他: 1 数据包
      

  3. 异常检测扩展点

    # 在 packet_handler 中添加检测逻辑
    if TCP in pkt and pkt[TCP].flags == 0x12:  # SYN-ACK 扫描检测
        print(f"! 潜在端口扫描: {src_ip} -> {dst_ip}:{pkt[TCP].dport}")
        
    if len(pkt) > 1500:  # 超大包检测
        print(f"! 异常大包: {len(pkt)} 字节")
    

使用示例
# 基础用法 (需管理员权限)
sudo python scapy_analyzer.py eth0

# 捕获100个数据包
sudo python scapy_analyzer.py wlan0 100

安全注意事项
  1. 权限控制

    • 使用最小必要权限原则
    • 避免在公共网络捕获敏感数据
  2. 流量过滤

    # 添加BPF过滤器(示例:仅捕获HTTP流量)
    sniff(filter="tcp port 80", ...)
    

  3. 数据处理

    • 实时分析避免存储原始数据包
    • 敏感信息匿名化处理

此脚本仅用于教育目的,实际生产环境需增加日志记录、告警机制和性能优化模块。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐