Страница 1 из 1

правила PF

Добавлено: 2012-02-21 14:17:59
yumix
Доброго времени суток!
Что , собственно, имеется:
FreeBSD 9 STABLE c пересобранным ядром для PF+AltQ
На ней mpd5 в качестве vpn server, требуется так же форвардинг нескольких портов в локалку.
Просьба указать на ошибки в правилах фаервола, если таковые имеются.

Код: Выделить всё

# cat /etc/pf.conf
int_if="fxp1"  # локалка
ext_if_cheap="fxp0"  # inet
vpn_lan="172.16.16.96/27"
icmp_types="{ echoreq, unreach}"
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"

set block-policy drop
set skip on lo0
set skip on $int_if
set timeout { frag 10, tcp.established 3600 }
scrub in all

rdr pass on $ext_if_cheap inet proto tcp from any to port 80 -> 10.0.0.11 port 80
rdr pass on $ext_if_cheap inet proto tcp from any to port 22 -> 10.0.0.11 port 22
nat on $ext_if_cheap from $vpn_lan  -> ($ext_if_cheap)
nat on $ext_if_cheap from 10.0.0.11 -> ($ext_if_cheap)

block all

antispoof log quick for { lo0, $ext_if_cheap, $int_if }
block drop in log quick on $ext_if_cheap from $priv_nets to any

pass out on $ext_if_cheap from $ext_if_cheap to any keep state
pass log inet proto icmp all icmp-type $icmp_types

pass inet  from $vpn_lan
pass quick on $int_if

Re: правила PF

Добавлено: 2012-02-21 16:15:11
d.kalinin
7-ая строчка снизу (block all), под ней правила уже не сработают.

Заодно - set skip $int_if - фильтрация на этом интерфейсе отключена, поэтому смысл в правилах с этим интерфейсом отпадает.

Так же направление внешнего трафика ... с int_if на ext_if? mpd5 создает динамические интерфейсы ng*, про них в правилах ни слова

Re: правила PF

Добавлено: 2012-02-21 16:46:59
yumix
Спасибо за комментарий, но Вы не поверите - оно работает.
вот пример с закомментированными строчками
#pass out on $ext_if_cheap from $ext_if_cheap to any keep state
#pass log inet proto icmp all icmp-type $icmp_types

Код: Выделить всё

C:\Documents and Settings\yumi>ping ya.ru

Обмен пакетами с ya.ru [213.180.204.3] по 32 байт:

Превышен интервал ожидания для запроса.

Статистика Ping для 213.180.204.3:
    Пакетов: отправлено = 1, получено = 0, потеряно = 1 (100% потерь),
Control-C
теперь с раскомментированными этими же строками

Код: Выделить всё

C:\Documents and Settings\yumi>ping ya.ru

Обмен пакетами с ya.ru [213.180.204.3] по 32 байт:

Ответ от 213.180.204.3: число байт=32 время=24мс TTL=56
Ответ от 213.180.204.3: число байт=32 время=25мс TTL=56
Ответ от 213.180.204.3: число байт=32 время=24мс TTL=56
Ответ от 213.180.204.3: число байт=32 время=26мс TTL=56

Статистика Ping для 213.180.204.3:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь)
т.е правила после drop all работают.
Это подтверждается еще и логами pflog
C:\Documents and Settings\yumi>ping ya.ru

Обмен пакетами с ya.ru [213.180.204.3] по 32 байт:

Ответ от 213.180.204.3: число байт=32 время=24мс TTL=56
Ответ от 213.180.204.3: число байт=32 время=25мс TTL=56
Ответ от 213.180.204.3: число байт=32 время=24мс TTL=56
Ответ от 213.180.204.3: число байт=32 время=26мс TTL=56

Статистика Ping для 213.180.204.3:
Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь),
насколько я понял описание PF-а он просматривает все правила до последней строчки и то правило, которое подходит - срабатывает. в IPFW наоборот.

Re: правила PF

Добавлено: 2012-02-21 17:09:37
yumix
Две последние строчки действительно не работают или до них дело не доходит.
но дело даже не в этом. Переписал так

Код: Выделить всё

int_if="fxp1"  # локалка
ext_if_cheap="fxp0"  # inet
vpn_lan="172.16.16.96/27"
icmp_types="{ echoreq, unreach}"
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"

set block-policy drop
set skip on lo0
set skip on $int_if
set timeout { frag 10, tcp.established 3600 }
scrub in all

rdr pass on $ext_if_cheap inet proto tcp from any to port 80 -> 10.0.0.11 port 80
rdr pass on $ext_if_cheap inet proto tcp from any to port 22 -> 10.0.0.11 port 22
nat on $ext_if_cheap from $vpn_lan  -> ($ext_if_cheap)
nat on $ext_if_cheap from 10.0.0.11 -> ($ext_if_cheap)

block all

antispoof log quick for { lo0, $ext_if_cheap, $int_if }
block drop in log quick on $ext_if_cheap from $priv_nets to any

pass out on $ext_if_cheap from $ext_if_cheap to any keep state
pass log inet proto icmp all icmp-type $icmp_types
вроде работает, только одно маленькое но ...
Через некоторое время "затыкается" внешний интерфейс. Т.е ни с него ни на него пакеты не идут. Помогает только
ifconfig fxp0 down
ifconfig fxp0 up
Вот я и пытаюсь понять в чем ошибка.

Re: правила PF

Добавлено: 2012-02-21 17:40:31
yumix
обманул немножко для работы ВПН всетаки нужна в конце

Код: Выделить всё

pass inet  from $vpn_lan

Re: правила PF

Добавлено: 2012-02-22 16:36:18
d.kalinin
Вы правы, действительно в pf есть оптимизатор правил, который может менять порядок прохождения :)

Сетевая виснет - надо смотреть, что в момент зависания творится:
/var/log/messages
netstat -m

Re: правила PF

Добавлено: 2012-02-24 7:58:19
FrIcE
pf использует последнее подходящее правило, если не задана опция quick, читайте документацию.