29.2. BPF: пакетный фильтр BSD

29.2. BPF: пакетный фильтр BSD

4.4BSD и многие другие Беркли-реализации поддерживают BPF — пакетный фильтр BSD (BSD Packet Filter). Реализация BPF описана в главе 31 [128]. История BPF, описание псевдопроцессора BPF и сравнение с пакетным фильтром SunOs 4.1.x NIT приведены в [72].

Каждый канальный уровень вызывает BPF сразу после получения пакета и непосредственно перед его передачей выше, как показано на рис. 29.1.

Рис. 29.1. Захват пакета с использованием BPF

Примеры подобных вызовов для интерфейса Ethernet приведены на рис. 4.11 и 4.19 в [128]. Вызов BPF должен произойти как можно скорее после получения пакета и как можно позже перед его передачей, так как это увеличивает точность временных отметок.

Организовать само по себе перехватывание пакетов из канального уровня не очень сложно, однако преимущество BPF заключается в возможности их фильтрации. Каждое приложение, открывающее устройство BPF, может загрузить свой собственный фильтр, который затем BPF применяет к каждому пакету. В то время как некоторые фильтры достаточно просты (например, при использовании фильтра udp or tcp принимаются только пакеты UDP и TCP), другие фильтры позволяют исследовать значения определенных полей в заголовках пакетов. Например, фильтр

tcp and port 80 and tcp[13:l] & 0x7 != 0

использовался в главе 14 [128] для отбора сегментов TCP, направлявшихся к порту 80 или от него и содержащих флаги SYN, FIN или RST. Выражение tcp [13:1] соответствует однобайтовому значению, начинающемуся с 13-го байта от начала заголовка TCP.

В BPF реализован основанный на регистрах механизм фильтрации, который применяет специфические для приложений фильтры к каждому полученному пакету. Хотя можно написать свою программу фильтрации на машинном языке псевдопроцессора (он описан в руководстве по использованию BPF), проще всего будет компилировать строки ASCII (такие, как только что показанная строка, начинающаяся с tcp) в машинный язык с помощью функции pcap_compile, о которой мы рассказываем в разделе 29.7.

В технологии BPF применяются три метода, позволяющие уменьшить накладные расходы на ее использование.

1. Фильтрация BPF происходит внутри ядра, за счет чего минимизируется количество данных, которые нужно копировать из ядра в приложение. Копирование из пространства ядра в пользовательское пространство является довольно дорогостоящим. Если бы приходилось копировать каждый пакет, у BPF могли бы возникнуть проблемы при попытке взаимодействия с быстрыми каналами.

2. BPF передает приложению только часть каждого пакета. Здесь речь идет о длине захвата (capture length). Большинству приложений требуется только заголовок пакета, а не содержащиеся в нем данные. Это также уменьшает количество данных, которые BPF должен скопировать в приложение. В программе tcpdump, например, по умолчанию это значение равно 68 байт, и этого достаточно для размещения 14-байтового заголовка Ethernet, 20-байтового заголовка IP, 20-байтового заголовка TCP и 14 байт данных. Но для вывода дополнительной информации по другим протоколам (например, DNS или NFS) требуется, чтобы пользователь увеличил это значение при запуске программы tcpdump.

3. BPF буферизует данные, предназначенные для приложения, и этот буфер передается приложению только когда он заполнен или когда истекает заданное время ожидания для считывания (read timeout). Это время может быть задано приложением. Программа tcpdump, например, устанавливает время ожидания 1000 мс, а демон RARP задает нулевое время ожидания (поскольку пакетов RARP немного, а сервер RARP должен послать ответ сразу, как только он получает запрос). Назначением буферизации является уменьшение количества системных вызовов. При этом между BPF и приложением происходит обмен тем же количеством пакетов, но за счет того, что уменьшается количество системных вызовов, каждый из которых связан с дополнительными накладными расходами, уменьшается и общий объем этих расходов. Например, на рис. 3.1 [110] сравниваются накладные расходы, возникающие при системном вызове read, когда файл считывается в несколько приемов, причем размер фрагментов варьируется от 1 до 131 072 байт.

Хотя на рис. 29.1 мы показываем только один буфер, BPF поддерживает по два внутренних буфера для каждого приложения и заполняет один, пока другой копируется в приложение. Эта стандартная технология носит название двойной буферизации (double buffering).

На рис. 29.1 мы показываем только получение пакетов фильтром BPF: пакеты, приходящие на канальный уровень снизу (из сети) и сверху (IP). Приложение также может записывать в BPF, в результате чего пакеты будут отсылаться по канальному уровню, но большая часть приложений только считывает пакеты из BPF. У нас нет оснований использовать BPF для отправки дейтаграмм IP, поскольку параметр сокета IP_HDRINCL позволяет нам записывать дейтаграммы IP любого типа, включая заголовок IP. (Подобный пример мы показываем в разделе 29.7.) Записывать в BPF можно только с одной целью — чтобы отослать наши собственные сетевые пакеты, не являющиеся дейтаграммами IP. Например, демон RARP делает это для отправки ответов RARP, которые не являются дейтаграммами IP.

Для получения доступа к BPF необходимо открыть (вызвав функцию open) еще не открытое каким-либо другим процессом устройство BPF. Скажем, можно попробовать /dev/bpf0, и если будет возвращена ошибка EBUSY, то — /dev/bpf1, и т.д. Когда устройство будет открыто, потребуется выполнить примерно 12 команд ioctl для задания характеристик устройства, таких как загрузка фильтра, время ожидания для считывания, размер буфера, присоединение канального уровня к устройству BPF, включение смешанного режима, и т.д. Затем с помощью функций read и write осуществляется ввод и вывод.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Фильтр фишинга

Из книги Компьютер на 100. Начинаем с Windows Vista автора Зозуля Юрий

Фильтр фишинга Фишинг – это способ получения мошенниками паролей, номеров кредитных карточек и другой личной информации. Мошенники направляют потенциальной жертве информационное письмо якобы от банка, электронной платежной системы или другого ресурса, услугами


Фильтр Извлечь

Из книги Photoshop. Мультимедийный курс автора Мединов Олег

Фильтр Извлечь Фильтр Извлечь позволяет извлечь из картинки определенный фрагмент, сделав все оставшееся изображение прозрачным. Фильтр имеет собственное окно, в котором вам нужно отметить фрагмент, который вы хотите извлечь (рис. 11.48). Рис. 11.48. Окно фильтра Extract


15.6. Отказ от рекламы. Баннерный фильтр

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

15.6. Отказ от рекламы. Баннерный фильтр Вам не хочется тратить лишнее время на загрузку рекламных баннеров? Мне тоже. К счастью, SQUID позволяет достаточно просто решить эту проблему. Просто вставьте следующие строки в свой файл /usr/local /etc/squid/squid.conf:acl good_url url_regex


Урок 18. Этот необычный фильтр Liquify

Из книги Adobe Fotoshop CS в примерах (III-IV) автора Топорков Сергей Сергеевич

Урок 18. Этот необычный фильтр Liquify Продолжаем наше обучение. Как можно понять из заголовка, проходить мы будем функцию Stroke (Обводка) и фильтр Liquify (Жидкий). Вы уже встречались с этими двумя функциями, особенно со Stroke (Обводка), но в этом уроке они будут рассмотрены


Активный резонансный полосовой фильтр

Из книги OrCAD PSpice. Анализ электрических цепей автора Кеоун Дж.

Активный резонансный полосовой фильтр В простой резонансной схеме резонансные свойства RLC-цепи используются для создания крутого спада характеристики на границах полосы пропускания. На рис. 5.32 показан входной колебательный контур, содержащий Vs, R, L и C. Выберем параметры


Активный RC полосовой фильтр

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

Активный RC полосовой фильтр Использование катушки индуктивности в полосовом фильтре не всегда желательно, тем более что в некоторых случаях значение индуктивности очень велико. На рис. 5.36 представлена схема, в которой для обеспечения заданной полосы пропускания


Активный полосовой резонансный фильтр

Из книги Ubuntu 10. Краткое руководство пользователя автора Колисниченко Д. Н.

Активный полосовой резонансный фильтр Используем схему на рис. 5.32 как другой пример активного фильтра. Начните новый проект в Capture с именем actvbpfr. Представьте идеальный ОУ, использовав Е с коэффициентом усиления 200 000 и внутренним сопротивлением Rin=1 МОм. Другие компоненты


18.7. Отказ от рекламы. Баннерный фильтр

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

18.7. Отказ от рекламы. Баннерный фильтр Вам не хочется тратить лишнее время на загрузку рекламных баннеров? Мне тоже. К счастью, SQUID позволяет достаточно просто решить эту проблему. Просто вставьте следующие строки в свой файл squid.conf:acl good_url url_regex "/usr/local/etc/sguid/acl/good_url"acl bad_urlpath


19.6. IPTables — пакетный фильтр для ядер 2.4.x. и 2.6.x

Из книги Раскрутка: секреты эффективного продвижения сайтов автора Евдокимов Николай Семенович

19.6. IPTables — пакетный фильтр для ядер 2.4.x. и 2.6.x Фильтр IPTables, очень похожий на IPChains, называется так потому, что хранит цепочки правил в таблицах. Главной таблицей, в которой хранятся правила обработки всех стандартных типов трафика, является таблица filter. Именно с ней мы и будем


21.4.2. Команда grep — текстовый фильтр

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич

21.4.2. Команда grep — текстовый фильтр Предположим, что у нас есть файл протокола /var/log/messages, и вы хотите вывести все сообщения, связанные с демоном pppd. Понятно, что вручную выделить все нужные сообщения будет довольно трудно. Но с помощью grep можно автоматизировать данную


Пример H-1. VIEWDATA.BAT: пакетный файл DOS

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Пример H-1. VIEWDATA.BAT: пакетный файл DOS REM VIEWDATAREM INSPIRED BY AN EXAMPLE IN "DOS POWERTOOLS"REM BY PAUL SOMERSON@ECHO OFFIF !%1==! GOTO VIEWDATAREM IF NO COMMAND-LINE ARG...FIND "%1" C:BOZOBOOKLIST.TXTGOTO EXIT0REM PRINT LINE WITH STRING MATCH, THEN EXIT.:VIEWDATATYPE C:BOZOBOOKLIST.TXT | MOREREM SHOW ENTIRE FILE, 1 PAGE AT A TIME.:EXIT0Результат преобразования в сценарий командной


Аффилиат-фильтр

Из книги Священные войны мира FOSS автора Федорчук Алексей Викторович

Аффилиат-фильтр Введенный в игру поисковыми системами аффилиат-фильтр призван очищать выдачу от монополистов, делая ее разнообразнее.Принцип работы фильтра сводится к следующему: он не применяется к сайту в целом и не ведет к его «пессимизации» или тотальному изъятию


4.11.1. Фильтр по умолчанию

Из книги Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода автора Larsson Thomas

4.11.1. Фильтр по умолчанию Исходя из принципа всеобщего запрета, в качестве правила по умолчанию мы должны запретить любые действия. Изначально в Linux все разрешено, а это безопасно только для отдельно стоящего сервера, который даже не подключен к сети. Проверьте ваши


6.5. Пакетный ввод

Из книги автора

6.5. Пакетный ввод К сожалению, наша функция str_cli все еще не вполне корректна. Сначала вернемся к ее исходной версии, приведенной в листинге 5.4. Эта функция работает в режиме остановки и ожидания (stop-and-wait mode), что удобно для интерактивного использования: функция отправляет


Пакетный менеджмент

Из книги автора

Пакетный менеджмент Разговоры о репозиториях и политиках обновления повисают в воздухе без сравнения инструментария, обеспечивающего доступ к первым и реализацию вторых. Сравнением их мы сейчас и