[freebsd] Вопрос по pf и keep state

Victor Sudakov vas at sibptus.ru
Fri Dec 13 06:41:53 EET 2019


Anton Saietskii wrote:
> >
> > Простейшая конфигурация на роутере из трех правил:
> >
> > # DMZ 172.16.1.0/24
> > pass in on $dmz
> > block in on $dmz from any to 192.168.0.0/16
> > # Inside 192.168.10.0/24
> > pass in on $inside
> >
> > Пингуем хост 172.16.1.10 с хоста 192.168.10.3 через этот роутер.
> > Эти пинги создают state:
> >
> > root at fw:~ # pfctl -vvs state
> > No ALTQ support in kernel
> > ALTQ related functions disabled
> > all icmp 172.16.1.10:62211 <- 192.168.10.3:62211       0:0
> >    age 00:09:17, expires in 00:00:10, 531:0 pkts, 44604:0 bytes, rule 2
> >    id: 000000005de8b503 creatorid: e8f0f0df
> > root at fw:~ #
> >
> > Однако почему-то ответы на пинг (идущие с 172.16.1.10 на 192.168.10.3)
> > режутся на правиле "block in on $dmz from any to 192.168.0.0/16", хотя
> > я ожидаю, что созданный state (приведен выше) должен их пропускать
> > независимо от блокирующего правила "block in on $dmz ..."
> >
> > Почему так?
> >
> > По умолчанию state-policy=floating, т.е. по идее вышеприведенный state
> > не привязан к интерфейсу и значит должен пропускать обратный трафик
> > (echo reply с 172.16.1.10 на 192.168.10.3). Ан нет.

Вдруг кому пригодится результат исследования проблемы. Очень помог в личной
переписке Hauke Fath hf эт spg.tu-darmstadt.de, который уже ходил по этим
граблям при переходе с ipf на pf.

Вкратце суть. Состояния (state) в pf работают не так, как в ipfw
или ipf. Если например в ipfw создалось динамическое правило, то в
check-state оно будет пропускать трафик в обоих направлениях, прямой и
обратный.

В pf же состояния даже при state-policy=floating остаются привязанными то
ли к интерфейсу, то ли к направлению трафика (т.е. они не bidirectional).
Т.е. если (см. пример выше) создался state при срабатывании "pass in on
$inside", этот state не пропустит обратный входящий трафик через $dmz. Надо
создавать state правилом "pass out on $dmz", тогда обратный трафик пройдет.
Т.е. набор правил должен выглядеть так:

# DMZ 172.16.1.0/24
pass in on $dmz
block in on $dmz from any to 192.168.0.0/16
pass out on $dmz

Бага это или фича - не берусь судить. По мне так ближе к баге (как минимум
в документации). С другой стороны, это похоже на reflective acl в циске.

-- 
Victor Sudakov,  VAS4-RIPE, VAS47-RIPN
2:5005/49 at fidonet http://vas.tomsk.ru/


More information about the freebsd mailing list