Итак, я пытаюсь встроить анализатор пакетов в 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 пакеты? Какова цель этих пакетов с локальным хостом как в качестве пункта назначения, так и в качестве источника?
Я знаю, что в моем нынешнем понимании этого есть много пробелов. Я не уверен, смогу ли я заставить это работать, но мне любопытно, и я был бы благодарен за любой ответ или даже только некоторые хорошие ресурсы, чтобы проверить.
Редактировать: Мой главный вопрос: где я могу узнать больше о сокетах в контексте перехвата пакетов?