PF rules: common question

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

PF rules: common question

Grigory Klyuchnikov
Здравствуй, openbsd.ru!

Благодарю всех за участие в моем просвещении! Не сочтите за
навязчивость, но для меня остался неясен один более общий вопрос по
составлению правил PF. Боюсь, что я все же "извращаюсь" в своей писанине.

По моему разумению лучше блокировать нежелательный трафик на входе, т.е.
в правилах на IN, чтобы не вызывать обработки таких пакетов на IP стеке
и повторную обработку на OUT. Но тогда, если интерфейсов 3 и более и
хочется разграничить доступ между ними, то приходится писать
дополнительные правила блокировки.

Далее длинный пример, не знаю как объяснить словами:
- три интерфейса, три сети: внешняя, внутренняя и dmz
- из внешней - в DMZ разрешено только - SMTP, HTTP, DNS
             - во внутреннюю только - SSH
- из DMZ - во внутреннюю только - SMTP
         - во внешнюю - все
- из внутренней разрешено все

Если не сложно, скажите, что не так может быть...

# PF IFs
ext_if = "fxp0"
int_if = "fxp1"
dmz_if = "fxp2"

dmz_smtp_server = "IP"
dmz_http_server = "IP"
dmz_dns_server = "IP"

int_ssh_server = "IP"
int_smtp_server = "IP"

table <InternalNet> { IPs }
 
block in all
block out all

#### IN ext_if
## -> dmz-if
pass in quick on $ext_if proto tcp from any to $dmz_http_server \
    port http flags S/SA synproxy state
pass in quick on $ext_if proto tcp from any to $dmz_smtp_server
    port smtp flags S/SA synproxy state
pass in quick on $ext_if proto udp from any to $dmz_dns_server \
    port dns keep state

## -> int_if
pass in quick on $ext_if proto tcp from any to $int_ssh_server \
    port ssh flags S/SA synproxy state

block in quick on $ext_if all

#### OUT ext_if
pass out quick on $ext_if proto tcp from any to any \
    flags S/SA synproxy state
pass out quick on $ext_if proto { udp, icmp } from any to any \
    keep state

#### IN dmz-if
##-> int_if
pass in quick on $dmz_if proto tcp from any to $int_smtp_server \
    flags S/SA synproxy state

block in quick on $dmz_if from any to <InternalNet>

## -> ext_if
pass in quick on $dmz_if proto tcp from any to any \
    flags S/SA synproxy state
pass in quick on $dmz_if proto { udp, icmp } from any to any \
    keep state

block in quick on $dmz_if all

#### OUT dmz_if
pass out quick on $dmz_if proto tcp from any to any \
    flags S/SA synproxy state
pass out quick on $dmz_if proto { udp, icmp } from any to any \
    keep state

#### IN int_if

pass in quick on $int_if proto tcp from any to any \
    flags S/SA synproxy state
pass in quick on $int_if proto { udp, icmp } from any to any \
    keep state

#### OUT int_if
pass out quick on $int_if proto tcp from any to any \
    flags S/SA synproxy state
pass out quick on $int_if proto { udp, icmp } from any to any \
    keep state

--
С уважением,
Григорий Ключников


Reply | Threaded
Open this post in threaded view
|

Re: PF rules: common question

Dmitry V. Kustov
On Fri, 23 Dec 2005 14:28:36 +0300, Grigory Klyuchnikov <[hidden email]>  
wrote:

> Далее длинный пример, не знаю как объяснить словами:
> - три интерфейса, три сети: внешняя, внутренняя и dmz
> - из внешней - в DMZ разрешено только - SMTP, HTTP, DNS
>              - во внутреннюю только - SSH
> - из DMZ - во внутреннюю только - SMTP
>          - во внешнюю - все
> - из внутренней разрешено все
>
> Если не сложно, скажите, что не так может быть...
>
>  block in all
> block out all
>
Заменяется на
block all

> #### IN ext_if
> ## -> dmz-if
> pass in quick on $ext_if proto tcp from any to $dmz_http_server \
>     port http flags S/SA synproxy state
> pass in quick on $ext_if proto tcp from any to $dmz_smtp_server
>     port smtp flags S/SA synproxy state
> pass in quick on $ext_if proto udp from any to $dmz_dns_server \
>     port dns keep state
>
> ## -> int_if
> pass in quick on $ext_if proto tcp from any to $int_ssh_server \
>     port ssh flags S/SA synproxy state
>
> block in quick on $ext_if all
>
А вот после этого правила у вас весь остальной трафик не пройдёт,
т.к стоит quick. Но это надо у народа уточнить.
А если без quick, то первое правило вверху сработает.

> #### OUT ext_if
> pass out quick on $ext_if proto tcp from any to any \
>     flags S/SA synproxy state
> pass out quick on $ext_if proto { udp, icmp } from any to any \
>     keep state
>
Здесь и далее from any to any можно заменить просто на all.

> #### IN dmz-if
> ##-> int_if
> pass in quick on $dmz_if proto tcp from any to $int_smtp_server \
>     flags S/SA synproxy state
>
> block in quick on $dmz_if from any to <InternalNet>
>
> ## -> ext_if
> pass in quick on $dmz_if proto tcp from any to any \
>     flags S/SA synproxy state
> pass in quick on $dmz_if proto { udp, icmp } from any to any \
>     keep state
>
> block in quick on $dmz_if all
>

Ниже правила не понятны. Зачем они?
> #### OUT dmz_if
> pass out quick on $dmz_if proto tcp from any to any \
>     flags S/SA synproxy state
> pass out quick on $dmz_if proto { udp, icmp } from any to any \
>     keep state
>

Если на внутренней всё разрешено, то и не делайте там ничего, зачем?
Сделайте первое block правило только для ext и dmz.
---------------------------------

> #### IN int_if
>
> pass in quick on $int_if proto tcp from any to any \
>     flags S/SA synproxy state
> pass in quick on $int_if proto { udp, icmp } from any to any \
>     keep state
>
> #### OUT int_if
> pass out quick on $int_if proto tcp from any to any \
>     flags S/SA synproxy state
> pass out quick on $int_if proto { udp, icmp } from any to any \
>     keep state
>


Reply | Threaded
Open this post in threaded view
|

Re: PF rules: common question

Pavel Labushev
In reply to this post by Grigory Klyuchnikov


Grigory Klyuchnikov wrote:

> Если не сложно, скажите, что не так может быть...

Прочитайте pf-faq. Еще, на www.openbsd.ru есть примеры конфигов. Вам
подойдет вариант с block in по умолчанию + pass in на раздачу всего, что
не запрещено. quick'ом желательно не пользоваться. Из-за него, например,
пакеты не проходят через antispoof и прочие проверочные правила,
находящиеся в самом низу. Которые, вообще-то, нужны. :)


Reply | Threaded
Open this post in threaded view
|

Re: PF rules: common question

BSW-2
Pavel Labushev пишет:
> не запрещено. quick'ом желательно не пользоваться. Из-за него, например,
> пакеты не проходят через antispoof и прочие проверочные правила,
> находящиеся в самом низу. Которые, вообще-то, нужны. :)

А что мешает поместить "antispoof и прочие проверочные правила" в самом
начале?


Reply | Threaded
Open this post in threaded view
|

Re: PF rules: common question

Grigory Klyuchnikov
Hi,

On Mon, 26 Dec 2005, BSW wrote:

B> Pavel Labushev пишет:
B> > не запрещено. quick'ом желательно не пользоваться. Из-за него, например,
B> > пакеты не проходят через antispoof и прочие проверочные правила,
B> > находящиеся в самом низу. Которые, вообще-то, нужны. :)
B>
B> А что мешает поместить "antispoof и прочие проверочные правила" в самом
B> начале?

Речь идет о том, что если встречается pass (in/out) quick, то пакет
пропускается и до "antispoof и прочих проверочных правил" дело не
дойдет внизу они или вверху, т.к.  после quick обработка прекращается.

--

Grigory Klyuchnikov, System Engineer,
Institute for System Programming
Russian Academy of Sciences


Reply | Threaded
Open this post in threaded view
|

Re: PF rules: common question

Grigory Klyuchnikov
In reply to this post by Pavel Labushev
Hi,

On Fri, 23 Dec 2005, Pavel Labushev wrote:

PL> Grigory Klyuchnikov wrote:
PL>
PL> > Если не сложно, скажите, что не так может быть...
PL>
PL> Прочитайте pf-faq. Еще, на www.openbsd.ru есть примеры конфигов. Вам
PL> подойдет вариант с block in по умолчанию + pass in на раздачу всего, что
PL> не запрещено. quick'ом желательно не пользоваться. Из-за него, например,
PL> пакеты не проходят через antispoof и прочие проверочные правила,
PL> находящиеся в самом низу. Которые, вообще-то, нужны. :)

Реальное спасибо. Перечитал faq, переписал правила без quick'ов
(только в исключениях с block), отладил, запустил. Зациклился на
quick'ах, т.к. пришлось переписывать старые правила ipfilter'а на PF,
а они были построены на quick'ах и настолько запутанные, что я голову
сломал, подтверждая правило, что проще написать заново, чем
переписывать чужую работу :))

Еще раз всем спасибо за помощь!

--
Grigory Klyuchnikov, System Engineer,
Institute for System Programming
Russian Academy of Sciences


Reply | Threaded
Open this post in threaded view
|

Re: PF rules: common question

Pavel Labushev
In reply to this post by BSW-2


BSW wrote:

> А что мешает поместить "antispoof и прочие проверочные правила" в самом
> начале?

Antispoof-правила автоматически помещаются в самом конце и с quick быть
не могут. А в самом начале, если что-то делать, нужен будет quick в
каждом проверочном правиле, чтобы они оказались последними при
совпадении. Не вижу, зачем такие сложности, когда правила, стоящие в
конце, говорят сами за себя.


Reply | Threaded
Open this post in threaded view
|

Re: PF rules: common question

Oleg Safiullin
> Antispoof-правила автоматически помещаются в самом конце и с quick быть
> не могут. А в самом начале, если что-то делать, нужен будет quick в

antispoof правина никуда автоматически не помещаются и quick быть могут...
Собственно antispoof это обычное правило, только сокращенно написанное. Например

antispoof quick for lo0

на самом деле является правилом

block in quick on ! lo0 from lo0:network


Reply | Threaded
Open this post in threaded view
|

Re: PF rules: common question

Pavel Labushev


Oleg Safiullin wrote:
>
> > Antispoof-правила автоматически помещаются в самом конце и с quick быть
> > не могут. А в самом начале, если что-то делать, нужен будет quick в
>
> antispoof правина никуда автоматически не помещаются и quick быть могут...
> Собственно antispoof это обычное правило, только сокращенно написанное. Например

Мда. У меня они на всех файрволах (руками) внизу и без quick. Привык, и
казаться начало всякое. Ошибся, звиняйте. :)