Я создал простой сниффер пакетов с использованием raw-сокета в Python.Python TCP raw socket не прослушивается на lo (localhost/127.0.0.1)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
print s.recvfrom(1600)
Интернет-трафик показывается. Но когда я перехожу к основному сетевому интерфейсу и отправляю syn-пакеты с помощью scapy через интерфейс lo
(источник и пункт назначения 127.0.0.1), ничего печататься не будет.
В основном я создаю и отправляю 10 пакетов syn, используя scapy, чей источник и назначение 127.0.0.1, что видно в wirehark. Но не в этом сниффер. Я думал, что может быть проблема длины. Поэтому я установил размер буфера на размер пакета syn, т. Е. 74 (s.recvfrom(74)
), но все равно ничего. Как только я снова включу основной сетевой интерфейс, он отобразит весь трафик TCP.
Мне нужно отключить сетевой интерфейс, чтобы я не получил никакого другого трафика, кроме моего собственного.
Где я ошибаюсь?
Поскольку ваш уровень равен «0x000», необходимо создать сокет '0x003' (ETH_ALL). Но вопрос: «Как получить пакет без данных?» И вам нужно прослушивать «loopback», но весь пакет не принадлежит вам. Автоматически игнорировать другие пакеты в интернет-интерфейсе, если входящий пакет не принадлежит вам! – dsgdfg
С ETH_ALL в ответ на @ dsgdfg он получит заголовок Ethernet, и он будет обнюхивать все UDP, ICMP, TCP-пакеты. То, что я отправляю в loopback, - только TCP. Итак, если я хочу послушать, что мне делать? – RatDon