PF: Scrub (Packet Normalization)

Нормализация трафика нужна для того, чтобы исключить неопределённость с тем куда направляется пакет. Кроме того, при нормализации собираются вместе фрагментированные пакеты, происходит защита операционных систем от некоторого вида атак и отбрасываются TCP пакеты с невозможным сочетанием флагов. Простейшая директива выглядит так: scrub in all.

scrub in all раскрывается в scrub in all fragment reassemble

Это приводит к нормализации всего входящего трафика на всех интерфейсах.

Одна из возможных причин для неиспользования нормализации — использование NFS. Некоторые не OpenBSD платформы используют странные пакеты — фрагментированные, но с выставленным битом «нефрагментировано», которые должны отбрасываться пакетным фильтром при нормализации. Эту проблему можно разрешить при использовании опции no-df. Другая причина может состоять в том, что некоторые многопользовательские сетевые игры блокируются пакетным фильтром с запущенным нормализатором. Во всех остальных случаях, кроме приведённых весьма необычных ситуаций, нормализация трафика крайне желательна.

Синтаксис директивы scrub весьма напоминает синтаксис правил фильтрации (см. Раздел C.2.1.4, «Фильтрация пакетов»). Как и в случае с NAT трансляцией, первое правило выигрывает. Перед директивой scrub можно употреблять ключевое слово no, чтобы указанные пакеты не нормализовались.

Scrub имеет следующие опции:

  • no-df: Очищает бит «нефрагментировано» из заголовка IP. Про некоторые операционные системы известно, что они выставляют этот бит на фрагментированных пакетах при работе с NFS. Нормализатор будет отбрасывать такие пакеты, если не указана данная опция. Поскольку некоторые операционные системы генерируют такие пакеты с нулевым идентификатором IP, рекомендуется употреблять данную опцию вместе с опцией random-id.
  • random-id: Замещать идентификатор IP случайным значением для компенсации некоторых систем использующих предсказуемые идентификаторы. Опция может применяться только к нефрагментированным пакетам.
  • min-ttl num: Выставить минимальный TTL в пакете IP.
  • max-mss num Выставить максимальный размер сегмента в заголовке IP.
  • fragment reassemble: Буферизовать входящий трафик и собирать вместе фрагментированные пакеты перед отправкой на правила фильтра. Выигрыш в том, что фильтр имеет дело с заведомо нефрагментированным трафиком и видит пакет целиком. Проигрыш в расходе памяти и замедлении прохождения пакетов через пакетный фильтр.
  • fragment crop: В норме, при фрагментации IP пакетов они должны нарезаться на части без перехлёстов. Если фрагменты повторяются или накладываются, это не нормальная ситуация. В таком случае можно сделать одно из двух: либо повторы выкинуть, а накладывающиеся фрагменты обрезать, либо выкинуть и то и другое по параноидальным соображениям. Первое делает опция fragment crop, второе — fragment drop-ovl. В обоих случаях пакеты не буферизируются как в случае fragment reassemble.
  • fragment drop-ovl: Выбрасывать пакеты в которых происходят повторы и наложения (см. пояснение в предыдущей опции).
  • reassemble tcp: Нормализация соединений TCP на основе таблицы состояний. При использовании данной опции нельзя указывать направление in/out. Осуществляется следующая нормализация:
    1. Ни одна из сторон не может занижать TTL. Это нужно для предотвращения атак на брандмауэр, когда злоумышленник занижает TTL с целью замусорить таблицу состояний. TTL выставляется в наивысшее значение случившееся во время коннекта.
    2. Выставляется случайный timestamp в заголовке IP, с тем, чтобы злоумышленник не мог догадаться как много машин находится за шлюзом с NAT.
Examples:

    scrub in on fxp0 all fragment reassemble min-ttl 15 max-mss 1400
    scrub in on fxp0 all no-df
    scrub    on fxp0 all reassemble tcp 
PQ VPS сервера в 28+ странах.