Введение в FreeBSD PF
Daniel Hartmeier (CX, 2001) (ip/ipnat gone)
http://ru.wikipedia.org/wiki/Packet_Filter
ядро + pfctl
Принципы:
- Last wins: 
- оптимизация правил и быстрый просмотр (⇒ большие объёмы правил, напр., генераты)
 - предсказуемое время
 - ⇒ быстрый поиск (таблицы адресов)
 - «якоря» (множества правил)
 - …
 
 - Команда = задача: 
- ⇒ списки и макросы (развёртываются в несколько правил) + таблицы
 - комплексные понятия (напр., state: +icmp, обслуживающий соединения; +UDP, NAT, …)
 - умолчания (напр., keep state по умолчанию, разные тайминги и т. п.)
 - различные формы (напр, адрес-ip ≠ адрес-FQDN, можно и то и то)
 - Атомарные задачи: scrub, reassemble, antispoof, OS fp, …
 - очереди и шейпинг
 
 
Уровень IP и выше.
Порядок правил:
- options
 - normalization
 - queueing
 - translation
 - filtering
 
pfctl
Command Purpose
pfctl -e Enable PF.
pfctl -d Disable PF.
pfctl -F all -f /etc/pf.conf Flush all NAT, filter, state, and table rules and reload /etc/pf.conf.
pfctl -s [ rules | nat state ] Report on the filter rules, NAT rules, or state table.
pfctl -vnf /etc/pf.conf Check /etc/pf.conf for errors, but do not load ruleset. -a anchor
pflog
dev pflog0 + pflogd (=tcpdump)
Пример
#
# Firewall for Home or Small Office
# http://www.openbsd.org/faq/pf/example1.html
#
# macros
ext_if="em0"
int_if="le0"
tcp_services="{ 22, 13 }"
icmp_types="echoreq"
comp3="10.30.50.3"
# options
set block-policy return
set loginterface $ext_if
set skip on lo
# scrub
scrub in
# nat/rdr
nat on $ext_if inet from !($ext_if) -> ($ext_if:0)
rdr on $ext_if proto tcp from any to any port 80 -> $comp3
# filter rules
block in
pass out
antispoof quick for { lo $int_if }
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services
pass in on $ext_if inet proto tcp from any to $comp3 port 80 synproxy state
pass in inet proto icmp all icmp-type $icmp_types
pass quick on $int_if no statepfsync/CARP
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-pf.html
http://www.freebsd.org/cgi/man.cgi?query=pfctl
