Я написал анализатор 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 другим при запуске на переднем плане, так что скорость пакетов намного выше и как включить это поведение в сниффере питона?
У вас есть привилегии? вы не проверяете возвращаемое значение ioctl –
Да, я запускаю его как root. Возвращаемое значение 'ioctl' равно 0. –
Запустите' strace' на tcpdump, чтобы узнать, что еще он делает. –