【问题标题】:Pyshark - Determine protocol from IPV6Pyshark - 从 IPV6 确定协议
【发布时间】:2020-02-15 17:41:57
【问题描述】:

我正在尝试从 IPV6 数据包中获取协议号。为了实现这一点,我必须使用这些字段中的哪一个。

print(cap[36].ipv6.field_names)

['version', 'ip_version', 'tclass', 'tclass_dscp', 'tclass_ecn', 'flow', 'plen', 'nxt', 'hlim', 'src', 'addr', 'src_host', 'host', 'dst', 'dst_host']

【问题讨论】:

  • IPv6 没有 IPv4 那样的协议字段。相反,它有一个next header 字段,这很可能是您列表中的nxt
  • 可能有option headers,所以必须走Next Header,直到到达最后一个Next Header。

标签: python networking protocols pyshark


【解决方案1】:

我不确定这是否是您问题的正确答案。如果不是,请告诉我,我会修改我的答案。

capture = pyshark.FileCapture(pcap_file)
for packet in capture:
    if hasattr(packet, 'ipv6') and hasattr(packet, 'tcp'):

       source_address = packet.ipv6.src
       source_port = packet[packet.transport_layer].srcport
       print(f'TCP packet -- Source Address: {source_address} -- Source Port: {source_port}')

       destination_address = packet.ipv6.dst
       destination_port = packet[packet.transport_layer].dstport
       print(f'TCP packet -- Destination Address: {destination_address } -- Destination Port: {destination_port }')

    elif hasattr(packet, 'ipv6') and hasattr(packet, 'udp'):
    
       source_address = packet.ipv6.src
       source_port = packet[packet.transport_layer].srcport
       print(f'UDP packet -- Source Address: {source_address} -- Source Port: {source_port}')

       destination_address = packet.ipv6.dst
       destination_port = packet[packet.transport_layer].dstport
       print(f'UDP packet -- Destination Address: {destination_address} -- Destination Port: {destination_port}')

更新:

对于延迟回复我深表歉意。这是一个更新的答案,希望能解决 Ron Maupin 提出的问题。

capture = pyshark.FileCapture(pcap_file)
for packet in capture:
    if "IPV6" in str(packet.layers):
       next_header_info = regex.findall(r'(Next Header:)\s(\w.+)\s(\W\d{0,3}\W)', str(packet.layers[1]))
       print(next_header_info)
       # Output 
       [('Next Header:', 'ICMPv6', '(58)')]
       [('Next Header:', 'ICMPv6', '(58)')]
       [('Next Header:', 'ICMPv6', '(58)')]
       [('Next Header:', 'IPv6 Hop-by-Hop Option', '(0)'), ('Next Header:', 'ICMPv6', '(58)')]
       [('Next Header:', 'ICMPv6', '(58)')]
       [('Next Header:', 'UDP', '(17)')]
       ...truncated
      

【讨论】:

  • 只有在 IPv6 数据包没有任何选项头时才有效。选项标头链中的最后一个标头将是传输协议。
  • @RonMaupin 您能否提供一个带有选项标头的示例数据包?谢谢。
  • 如果您正在为 IPv6 编程,那么您必须熟悉 RFC 8200, Internet Protocol, Version 6 (IPv6) Specification。只需重新阅读Section 4. IPv6 Extension Headers 即可获得完整说明。
  • @RonMaupin 感谢您的参考。我更改了代码,但我不确定它是否完全解决了您提出的问题。
  • @RonMaupin 此更新是否解决了您提出的问题?
猜你喜欢
  • 2023-02-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多