Недавно довелось разворачивать простенький маршрутизатор на FreeBSD 9.2. Грабли обнаружились на ровном месте, где ни кто бы ни когда не предположил, а конкретно в PFNAT.
Я обычно пишу в /etc/pf.conf приблизительно подобную конструкцию :
int_if="em1" ext_if="em0" table <natnet> persist { 192.168.1.0/24 }
no nat on $ext_if inet from !<natnet> to any nat on $ext_if inet from <natnet> to any -> ($ext_if)
И тут меня ждал сюрприз. Теперь PFNAT по умолчанию не собирался работать с фрагментрированными пакетами. Команда ping -s 1501 ya.ru торжественно объявила о таймауте. Посмотрев tcpdump-ом на внешнем интерфейсе, удивился еще больше — пакеты уходили без трансляции адреса, от имени адресов RFC1918.
В результате переписки с Глебом Смирновым, был ткнут лицом в документацию на pf. Вообщем нынче перед передачей пакета в PF с интерфейса, надо его пересобрать из фрагментов. Делается нынче это приблизительно так :
scrub in on $int_if from <natnet> to any fragment reassemble no-df scrub in on $ext_if all fragment reassemble