как извлечь информацию из пакета ipv6 - PullRequest
0 голосов
/ 29 июня 2018

Я пишу свой собственный анализатор пакетов, используя 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 header
  6. Флаги TCP
  7. Размер окна
  8. Не фрагментировать бит
  9. Подробнее бит бит
...