Получите имя хоста из пакетов tcp/udp с сокетами / Linux и «сырым» python

#python #networking #tcp #packet #packet-sniffers

Вопрос:

следуя учебнику, я закодировал Wi-Fi-сниффер на python, используя сокеты (в linux) и пакет «структура». Код разделен на две части: первая декодирует пакеты заголовков Ipv4, получающие Ip-адреса и другую информацию, а затем отправляет оставшиеся данные во вторую часть, которая декодирует пакеты ICMP, UDP и TCP. Когда я декодирую пакеты TCP и UDP, я могу легко получить порты источника и порты назначения, флаги и т. Д… но сейчас я ищу имя хоста. Другими словами, я пытаюсь увидеть, какой веб-сайт посещает отправитель/получатель пакета.

Как я могу получить имя хоста? Находится ли он в части «данные» пакета tcp/udp, если да, то как его декодировать? Должен ли я смотреть на порты источника и назначения?

Вот код: 2 функции для пакетов UDP/TCP, аргументом данных является часть «данные» из пакета Ipv4.

 def tcp_segment(data):
    (src_port, dest_port, sequence, acknowledgement, offset_reserved_flags) = struct.unpack('! H H L L H', data[:14])
    offset = (offset_reserved_flags >> 12) * 4
    flag_urg = (offset_reserved_flags amp; 32) >> 5
    flag_ack = (offset_reserved_flags amp; 16) >> 4
    flag_psh = (offset_reserved_flags amp; 8) >> 3
    flag_rst = (offset_reserved_flags amp; 4) >> 2
    flag_syn = (offset_reserved_flags amp; 2) >> 1
    flag_fin = offset_reserved_flags amp; 1

    return src_port, dest_port, sequence, acknowledgement, flag_urg, flag_ack, flag_psh, flag_rst, flag_syn, flag_fin, data[offset:]

def udp_segment(data):
    src_port, dest_port, size = struct.unpack('! H H 2x H', data[:8])
    return src_port, dest_port, size, data[8:]
 

TCP-пакет

Комментарии:

1. Имя хоста будет указано только в заголовке HTTP. В других протоколах этого нет.

2. Заголовок http находится в пакете TCP, не так ли? Как я могу узнать реальное место назначения UDP? IP-адресатом всегда будет маршрутизатор… нет?

3. Реальный адрес назначения-это IP-адрес назначения в IP-заголовке. Трафик в одной и той же сети не проходит через маршрутизатор. Маршрутизаторы маршрутизируют пакеты между сетями на основе IP-адреса назначения. Любые пакеты с адресом маршрутизатора в качестве IP-адреса назначения предназначены для самого маршрутизатора.