2016-12-29 10 views
0

Я написал анализатор ethernet в python. Это в основном открывает сокет, устанавливает его в беспорядочном режиме, а затем обрабатывает каждый входящий пакет, например .:Сетевой снифер, не захватывающий все, с tcpdump параллельно он

import fcntl 
import socket 

IF = "eth0" 
ETH_P_ALL = socket.htons(0x0003) 
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, ETH_P_ALL) 

ifr = ifreq() 
ifr.ifr_ifrn = IF.encode() 

# Get flags 
fcntl.ioctl(s, 0x8913, ifr) 

# Add promiscuous 
ifr.ifr_flags |= 0x100 

# Set flags 
fcntl.ioctl(s, 0x8914, ifr) 

while True: 
    pkt_raw, sa_ll = s.recvfrom(65535) 
    parse_packet(pkt_raw) 

Наряду с этим, у меня есть функция измерения, который подсчитывает количество входящих пакетов в секунду. Чтобы сгенерировать пакеты, я настроил такой переключатель, чтобы он пересылал все пакеты в интерфейс (зеркалирование портов). То есть входящие пакеты не являются конкретными для этой машины.

Учитывая эту настройку, я могу видеть скорость около 250 пакетов в секунду. Однако, если я также запускаю tcpdump -n -i eth0 параллельно, скорость внезапно увеличивается примерно до 5000 пакетов в секунду. Интересно, что это происходит только в том случае, если я запускаю tcpdump на переднем плане, например. tcpdump -n -i eth0 > foo не изменяет скорость входящих пакетов.

Вопрос: что делает tcpdump другим при запуске на переднем плане, так что скорость пакетов намного выше и как включить это поведение в сниффере питона?

+0

У вас есть привилегии? вы не проверяете возвращаемое значение ioctl –

+0

Да, я запускаю его как root. Возвращаемое значение 'ioctl' равно 0. –

+1

Запустите' strace' на tcpdump, чтобы узнать, что еще он делает. –

ответ

0

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