You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows上通过原始套接字获取IPv6头部及完整以太网帧?

解决方案:Windows下无依赖原始套接字捕获IPv6头部/完整以太网帧

你当前的问题出在套接字的协议参数配置上:Windows平台下,用AF_INET6, SOCK_RAW, IPPROTO_IP创建的套接字,内核会自动剥离IPv6头部,仅返回ICMPv6等上层协议的数据包内容。以下是针对你的需求的两种解决方案:

方案1:捕获包含IPv6头部的数据包

修改套接字协议参数为IPPROTO_IPV6,让内核保留IPv6头部,同时保持全局流量捕获能力:

from socket import socket, AF_INET6, SOCK_RAW, IPPROTO_IPV6, IPV6_PKTINFO, SIO_RCVALL, RCVALL_ON, RCVALL_OFF
import struct

# 创建IPv6原始套接字,指定IPPROTO_IPV6以保留头部
sock = socket(AF_INET6, SOCK_RAW, IPPROTO_IPV6)
sock.bind(("<你的IPv6地址>", 0))

# 禁用额外数据包信息,避免干扰
sock.setsockopt(IPPROTO_IPV6, IPV6_PKTINFO, 0)
# 启用全局捕获模式,抓取所有经过网卡的IPv6流量
sock.ioctl(SIO_RCVALL, RCVALL_ON)

try:
    while True:
        data, addr = sock.recvfrom(65535)
        # 解析IPv6头部(固定40字节)
        ipv6_header = data[:40]
        version = (struct.unpack('!I', ipv6_header[:4])[0] >> 28) & 0xF
        payload_len = struct.unpack('!H', ipv6_header[4:6])[0]
        next_proto = ipv6_header[6]
        hop_limit = ipv6_header[7]
        src_ip = socket.inet_ntop(AF_INET6, ipv6_header[8:24])
        dst_ip = socket.inet_ntop(AF_INET6, ipv6_header[24:40])

        print(f"IPv6源地址: {src_ip}, 目的地址: {dst_ip}, 上层协议: {next_proto}")
        print(f"IPv6头部+载荷数据: {data.hex()}\n")
finally:
    sock.ioctl(SIO_RCVALL, RCVALL_OFF)
    sock.close()

方案2:捕获完整以太网帧(无需WinPcap/Npcap)

如果需要获取包含MAC层的完整帧,Windows下可以通过AF_INET原始套接字配合SIO_RCVALL实现(IPv6链路层捕获支持有限,优先用此方案兼容更多场景):

from socket import socket, AF_INET, SOCK_RAW, IPPROTO_IP, SIO_RCVALL, RCVALL_ON, RCVALL_OFF
import struct

# 创建支持链路层捕获的原始套接字
sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
sock.bind(("<你的IPv4地址>", 0))
# 启用全局链路层捕获模式
sock.ioctl(SIO_RCVALL, RCVALL_ON)

try:
    while True:
        data, addr = sock.recvfrom(65535)
        # 解析以太网头部(前14字节)
        eth_header = data[:14]
        dst_mac = ':'.join(f'{b:02x}' for b in eth_header[:6])
        src_mac = ':'.join(f'{b:02x}' for b in eth_header[6:12])
        eth_type = hex(struct.unpack('!H', eth_header[12:14])[0])

        print(f"源MAC: {src_mac}, 目标MAC: {dst_mac}, 以太网类型: {eth_type}")
        print(f"完整帧数据: {data.hex()}\n")
finally:
    sock.ioctl(SIO_RCVALL, RCVALL_OFF)
    sock.close()

关键注意事项

  • 权限要求:所有原始套接字操作必须以管理员权限运行,否则会创建失败或无法捕获流量。
  • IPv6链路层限制:Windows对IPv6链路层原始套接字的支持不如IPv4稳定,若需专注IPv6分析,优先使用方案1。
  • 单文件打包:用pyinstaller --onefile your_script.py可将脚本打包为独立可执行文件,直接复制到目标服务器运行。

内容的提问来源于stack exchange,提问作者MauriceLambert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:17:23