Как работает tcpdump: ассемблер BPF; фильтрация с ng_bpf на FreeBSD

Feb 28, 2010 23:21

Этот пост пригодится вам не только на FreeBSD, но и на Linux и любой другой системе с BPF (для Windows есть вот такое) в случае, когда вы хотите написать приложение, отбирающее напрямую с линии пакеты по некоторому критерию, как tcpdump (ну скажем, хотите проконтролировать ARP в вашей сети по типу приложения ipguard, или еще что). Здесь идет более ( Read more... )

сети, l7, netgraph, объяснение, freebsd, ipfw, админское

Leave a comment

Comments 15

stalex March 1 2010, 07:53:28 UTC
спасибо за очень детальную статью, хотя у меня абоненты бегают без тунелей, но очень интересно :) кстати по ipfw-dummynet - вы не в курсе - использует ли dummynet только одно ядро для шейпинга ? тк апгрейд с 2ух на 4х ядерные процы не дал прироста производительности шейпинга. сейчас потолок по шейпингу около 500Mbit, а совсем без шейпинга машина вполне 1G роутит.

Reply

nuclight March 1 2010, 08:56:28 UTC
Увы, да, если поглядеть в top -S на процессы ядра, он там в составе только одного пашет. Насколько я в курсе, над этим ведутся работы, но пока нету. Если под ваши задачи подойдет ng_car, попробуйте его - нетграф начиная с 7.2 параллелится, имеет по собственному процессу-воркеру на каждое ядро.

Reply

stalex March 1 2010, 14:52:52 UTC
если я правильно понимаю ng_cat применяется к интерфейсу ? у меня без туннелей бегают абоненты, просто сетка абонентов в влане бегает

Reply

nuclight March 1 2010, 14:59:51 UTC
Нет, можно насоздавать пачку и заруливать, скажем, из ipfw. Это ж нетграф, там всё можно.

Reply


andrewkochetkov March 1 2010, 08:19:00 UTC
«Оптимизатор у него не настолько умный, чтобы повторяющиеся вычисления засунуть в память BPF-машины, вместо повторения.» - а что можно придумать, чтобы оптимизировать? И да, судя по следующему посту, может, стоит написать правильный генератор bpf инструкций из высокого уровня, с простеньким заточенным под это дело оптимизатором?

Reply

nuclight March 1 2010, 09:09:16 UTC
Там у него и так суровый компилятор - я, когда баг вылез, думал попробовать его найти в исходниках, но 250 Кб сишного кода его кодогенератора/оптимизатора с блэкджеком и шлюхами промежуточным кодом, математикой и графами - не осилил, проще и быстрее было вручную написать. С выключением оптимизатора он генерирует вообще в 5 раз больше кода (и тоже неправильного в этом случае). Надо будет в мэйллист его разработчиков написать, что ли... а то по нашему PR пока молчат ( ... )

Reply

andrewkochetkov March 1 2010, 09:15:36 UTC
«то это будут уже вещи как в функицональных языках» - тогда уж проще bpf заменить на лисп-машину. И не уверен, что это будет плохо :-)

Reply

nuclight March 1 2010, 09:57:40 UTC
Уверен, что лисп-машину в ядро (причем не одной оси, а кучи) не внесут. Реализация BPF-машины же - чуть более десятка килобайт.

Reply


Да, верно liopik December 19 2010, 10:19:00 UTC
И вот так всегда

Reply


Можно вам вопрос задать про BPF? arcbishop May 17 2011, 00:44:29 UTC
У меня такая ситуация: есть два multicast udp канала, по которым идет одинаковая дата. Их два, на тот случай если на одном канале пакет потеряется, то второй - дублирует. В заголовке каждого пакета есть его порядковый номер. Сейчас мне приходится читать оба канала, и выбрасывать пакеты с порядковым номером ниже текущего.

Например:
Канал А: пакет номер 5 (взять)
Канал Б: пакет номер 5 (выкинуть)
Канал Б: пакет номер 6 (взять)
Канал А: пакет номер 6 (выкинуть)

Если научиться фильтровать пакеты на уровне кернеля, то количество чтений сократится вдвое.
Сoбственно вопрос: С BPF это можно сделать? (т.е. это требует общий счетчик на два сокета)
A timestamp в UDP пакет можно добавить?

Заранее спасибо.

Reply

Re: Можно вам вопрос задать про BPF? nuclight May 17 2011, 15:16:27 UTC
Нет, нельзя, виртуальная машина BPF перезапускается на каждый пакет, общих счетчиков нет, модификации пакета тоже. Нужно писать что-то ядерное, например, netgraph-ноду, с таким счетчиком, или добавлением timestamp.

Reply

Re: Можно вам вопрос задать про BPF? arcbishop May 17 2011, 15:35:49 UTC
ок, спасибо.

Reply


kosogoroff August 6 2014, 03:28:11 UTC
Огромное спасибо, мощнейшая статья!
Концентрированный сгусток знания!

Reply


Leave a comment

Up