Я хочу сделать сниффер пакетов в Python 3.5, который захватывает UDP, TCP и ICMP. Это короткий пример этого:Пакет сниффер в Python
import socket
import struct
# the public network interface
HOST = socket.gethostbyname(socket.gethostname())
# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST,0))
# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# receive all packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
# receive a package
n=1
while(n<=400):
print('Number ', n)
data=s.recvfrom(65565)
packet=data[0]
address= data[1]
header=struct.unpack('!BBHHHBBHBBBBBBBB', packet[:20])
if(header[6]==6): #header[6] is the field of the Protocol
print("Protocol = TCP")
elif(header[6]==17):
print("Protocol = UDP")
elif(header[5]==1):
print("Protocol = ICMP")
n=n+1
Проблема заключается в том, что он захватывает только UDP-пакеты :( Выход:
Number 1 Protocol = UDP Number 2 Protocol = UDP Number 3 Protocol = UDP Number 4 Protocol = UDP Number 5 Protocol = UDP Number 6 Protocol = UDP Number 7
Есть 2 варианта:
- сниффер может только фиксируют пакеты UDP.
- Я просто получаю UDP-пакеты.
Я думаю, что самый логичный ответ - мой снифер работает неправильно, и он просто захватывает UDP. Есть идеи?
Держу пари Scapy лучше для этой работы, чем модуль гнезда. Это намного удобнее для обнюхивания пакетов. –
Какую платформу вы используете? В Unix/Linux вам обычно нужно быть root для захвата каждого пакета. –
@HughFisher Я нахожусь в Windows 7, с PyDev и Eclipse. Я выполняю затмение как администратор. –