Сборка анализатора пакетов с Python + сокетами - PullRequest
1 голос
/ 10 марта 2020

Итак, я пытаюсь встроить анализатор пакетов в Python, чтобы углубить свое понимание работы в сети. Дело в том, что это оказалось немного более запутанным, чем я первоначально ожидал. Проблема заключается в том, что все ресурсы с подробными объяснениями охватывают сценарий создания сокетов для целей отправки / получения данных клиент / сервер.

На данный момент я успешно создал несколько классов, которые обрабатывают декодирование заголовков пакетов для IPv4 и ICMP. Теперь, поскольку мой код сокета, казалось, только собирал ICMP-пакеты, я пытался настроить его так, чтобы я мог перехватывать все трафики c, достигающие моего интерфейса Wi-Fi, но я все еще почти исключительно вижу пакеты ICMP (с localhost в качестве обоих источников и пункт назначения).

Итак, у меня есть несколько вопросов, на которые я хотел бы получить ответ. Но сначала мой код:

import socket
import sys
from protocols.ipv4 import IPv4

PACKET_SIZE = 65535

sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

sock.bind(("0.0.0.0", 0))

try:
    while True:
        # read in a packet
        raw_buffer = sock.recvfrom(PACKET_SIZE)[0]
        # create an IP packet object
        ip_header = IPv4(raw_buffer)
        # print the packet
        print(ip_header)
except KeyboardInterrupt:
    print("\nExiting...")
    sock.close()
    sys.exit(0)

Вот как я это понял:

  • Сначала я создаю сокет с socket.socket, где я указываю семейство адресов, тип сокета и протокол. В моем случае я выбираю семейство AF_INET, которое я не очень хорошо понимаю, но похоже, что оно дает пакеты с сетевого уровня. Тип сокета установлен на SOCK_RAW, что означает, что я хочу использовать необработанные сокеты, а не SOCK_STREAM для соединений TCP и SOCK_DGRAM для UDP. Последний аргумент IPPROTO_IP просто указывает, что я хочу только IP-пакеты.

  • Затем я привязываю сокет к 0.0.0.0, который предположительно означает «любой адрес», как описано здесь .

Что я не понимаю:

  • Изначально я видел несколько примеров создать сокет сниффера, который использовал семейство адресов AF_PACKET. Вскоре я обнаружил, что это семейство адресов недоступно на macos (который я использую). Это почему? Что такое семейство адресов, как оно относится к сокетам? Есть ли альтернативный способ ловить пакеты с более низких уровней? В Wireshark я вижу эти датаграммы rnet, поэтому это кажется возможным.

  • Как я уже говорил, я хочу прослушать все трафики c, достигающие моего интерфейса Wi-Fi. Как сокет узнает, на каком интерфейсе я хочу работать? Также я узнал, что сетевые интерфейсы могут быть переведены в разные режимы, такие как монитор или случайный, как это связано с сокетами и моей целью перехвата пакетов?

  • Почему я почти только перехватываю ICMP пакеты? Какова цель этих пакетов с локальным хостом как в качестве пункта назначения, так и в качестве источника?

Я знаю, что в моем нынешнем понимании этого есть много пробелов. Я не уверен, смогу ли я заставить это работать, но мне любопытно, и я был бы благодарен за любой ответ или даже только некоторые хорошие ресурсы, чтобы проверить.

Редактировать: Мой главный вопрос: где я могу узнать больше о сокетах в контексте перехвата пакетов?

...