FreeBSD FAQ по пакетным фильтрам и NAT (firewall faq ipfw freebsd nat)

Последняя редакция разделов FAQ про пакетные фильтры и NAT.
> Q.: Во FreeBSD существует несколько пакетных фильтров - bpf, PF, ipf, IPFilter, IPFW,
> IPFW2. Чем они отличаются?
A.: Пакетный фильтр bpf не используется для построения МСЭ (межсетевых экранов aka firewall). Этот фильтр используется программами анализа и учета
трафика, например, trafd. Правила фильтрации задаются программой на псевдо-машинном языке.
Пакетные фильтры PF, IPFilter, IPFW и IPFW2 используются для построения МСЭ. IPFilter (он же ipf) - небольшой по размеру пакетный фильтр, включенный в
ядро FreeBSD с версии 3.3.3. До этого был доступен в виде порта.
PF - пакетный фильтр, заимствованный из OpenBSD. В настоящее время доступен в виде порта. С точки зрения пользователя очень похож на IPFilter, но имеет
дополнительную функциональность (нормализация пакетов, управление приоритетеми пакетов, управление полосой пропускания, фильтрация по uid/gid,
аутентификация пользователя на маршрутизаторе и пассивное определение удаленной ОС).
IPFW - пакетный фильтр по-умолчанию начиная с FreeBSD 2.0.
IPFW2 является более новой версией IPFW, имеющей больше возможностей по сравнению с IPFW. Во FreeBSD 4.* и старше по-умолчанию используется IPFW, в
версиях 5.* и новее - IPFW2.
 
> Q.: Что лучше использовать, IPFW, IPFilter или PF?
А.: Hеобходимо использовать IPFW если:
  - нужно разделять или ограничивать полосу пропускания;
  - нужно использовать divert-сокеты (для natd или tcpmssd)
  - нужны правила с указанием uid/gid пакетов.
  - нужна оптимизация сложного дерева правил (сложнее, чем head/group
   в ipf).
В противном случае - на Ваш выбор.
Пакетные фильтры можно использовать совместно в разных комбинациях.
Hапример, можно использовать для фильтрации пакетов IPFilter, а для управления полосой пропускания - DUMMYNET из IPFW.
 
> Q.: В каком порядке пакеты проходят через фильтры при использовании
> нескольких фильтров?
A.: Если все фильтры вкомпилированы в ядро, то порядок следующий:
interface in->bpf->ipnat->ipfilter->ipfw->pkt
pkt->ipfilter->ipnat->ipfw->bpf->interface out
Если фильтры подгружаются модулями, то порядок прохождения зависит от порядка загрузки.
 
> Q.: Что лучше использовать, natd или ipnat ?
A.: Политика трансляции для natd задается в IPFW, что дает большую гибкость в настройках и позволяет, например, выполнять несимметричную фильтрацию,
когда исходящие пакеты уходят через один интерфейс, а входящие приходят через другой.
Кроме того, natd поддерживает transparent proxy для протоколов FTP, IRC, ICMP, PPTP, RTSP, PNA, NetBios over TCP/IP и Cisco Skinny Station protocol,
а ipnat - только FTP, H.323, ipsec, NetBios over TCP/IP, raudio и rcmd.
Однако natd работает в userland и на каждый пакет выполняется 2 переключения контекста, что дает overhead, заметный на слабом железе (i486, i586).
В отличие от natd, ipnat потребляет значительно меньше процессорных ресурсов, ipnat можно настроить на GENERIC-ядре, подгрузив модуль ipl, а для
natd придется перекомпилировать ядро с опцией IPDIVERT и ipnat работает с любым пакетным фильтром, а для natd обязательно нужен ipfw.
Так что если у Вас слабое железо, Вы не хотите перекомпилировать ядро или не хотите использовать ipfw и функциональность ipnat Вас устраивает -
используйте ipnat.
 
Обновлено: 12.03.2015