Несколько слов о NAT в новом PF.

Недавно довелось разворачивать простенький маршрутизатор на 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

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *