首页 > 解决方案 > 如何从 ipv6 数据包中提取信息

问题描述

我正在使用 python 套接字编写自己的数据包嗅探器,方法是检索数据包信息,例如源 ip、源端口、目标 ip、目标端口、TTL、标志(SYN、ACK、FIN、RST、PSH、URG)等。

对于 IPv4,我能够根据各自的位置解包数据包,结果与我在 tshark 中看到的类似。请参见下面的代码:

IPv4_UNPACK_PATTERN = '!BBHHHBBH4s4s'
IPv6_UNPACK_PATTERN = '!4sHBB16s16s'

IPv4_HDR_LEN = 20
IPv6_HDR_LEN = 40
TCP_HDR_LEN = 20
ETH_HDR_LEN = 14

# IP ATTRIBUTES
IP_VERSION_POS = 0
IP_TOS_POS = 1
IP_LENGTH_POS = 2
IP_IDENTIFICATION_POS = 3
IP_FRAGMENT_OFFSET_POS = 4
IP_TTL_POS = 5
IP_PROTOCOL_POS = 6
IP_HDR_CHCKSUM_POS = 7
IP_SRC_ADDR_POS = 8
IP_DST_ADDR_POS = 9

TCP_FLAG_POS = 5
TCP_WINDOW_POS = 6

# main program:
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
packet = s.recvfrom(SOCKET_BUFF_SIZE)
pkt_type = extract_type(packet)
ip_header(packet, pkt_type)

# this function extracts the information from pkt
def ip_header(pkt, pkt_type):
if pkt_type=='ipv4':
    data = unpack(IPv4_UNPACK_PATTERN, pkt[ETH_HDR_LEN:ETH_HDR_LEN + IPv4_HDR_LEN])
    version = data[IP_VERSION_POS]
    total_length = data[IP_LENGTH_POS]
    ttl = data[IP_TTL_POS]
    protocol = data[IP_PROTOCOL_POS]
    ip_header = (version & 0xF) * 4
    start_pos = ETH_HDR_LEN + IPv4_HDR_LEN
    # Unpacking TCP
    tcp_obj = unpack(TCP_UNPACK_PATTERN, data[start_pos:start_pos + TCP_HDR_LEN])
    tcp_flag = tcp_obj[TCP_FLAG_POS]
    window = str(tcp_obj[TCP_WINDOW_POS])
else:  # ipv6
    data = unpack(IPv6_UNPACK_PATTERN, pkt[ETH_HDR_LEN:ETH_HDR_LEN + IPv6_HDR_LEN])
    # what bit positions to be used here for ipv6?

但是对于 IPv6 数据包,我不知道 ipv6 字段的正确位位置。

任何人都可以指向描述以下字段的 ipv6 数据包的位位置的文档:

  1. 版本
  2. ip总长度
  3. TTL
  4. 协议
  5. ip头
  6. TCP 标志
  7. 窗口大小
  8. 不要碎片化位
  9. 更多片段位

标签: socketstcpipv6ipv4packet-sniffers

解决方案


推荐阅读