Pass traceroute via PF (some solution)

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

Pass traceroute via PF (some solution)

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

Всем огромное спасибо за помощь! Кому интересно ниже описание варианта
решения.

Anton Maksimenkov wrote:

>>и отвечал только на ICMP echo и на traceroute давал ICMP time exceeded
>>(а в идеале пропускал traceroute на некоторые внутренние хосты). С
>>ICMP echo понятно, а вот с traceroute...
>>    
>>
>
>traceroute пользует udp, порты его посмотрите и приоткройте. Не помню
>в каком мане, но где-то описано.
>  
>
Задача:

- PF router блокирует все IN пакеты на адереса его интерфейсов,
- но отвечает:
   1) на icmp echo
   2) на проходящие через него traceroute udp сообщениями icmp time
exceeded
      (если PF - конечный пункт для traceroute, он и так ответит
      icmp port unreachable)

- от него разрешено все на OUT.

Описание traceroute:

traceroute посылает по 3 пакета на hop (по умолчанию) udp или icmp echo,
начиная с ttl = 1, и увеличивая ttl на 1 для каждого hopa, от
промежуточных возвращается icmp time exceeded, от конечного - icmp
port unreachable.
По умолчанию при UDP для каждой пробы используется порт начиная от
33435, далее + 1 (для большей гарантии попадания на неиспользуемый
порт), типа на 1-й hop 3 пробы на порты 33435, 33436, 33437 и тд.
Конечный порт зависит от количества hop'ов
По умолчанию Linux, FreeBSD и OpenBSD traceroute используют udp,
Windows XP - icmp echo.

Решение:

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

AllIFs = "{ fxp0 fxp1 fxp2 ... }"

InternalNet = "{ IPs ... }"

#Internal Traceroute IPs
TracerouteIPs = "{ IPs ... }"

block all

# PF router
# Pass IN
# UDP traceroute
pass in log quick inet proto udp from any to $AllIFs \
   port 33434 >< 33700

# ICMP Echo
pass in log quick inet proto icmp from any to $AllIFs \
   icmp-type 8 keep state

# Block all other IN
block in log quick from any to $AllIFs

# Pass all OUT
pass out log quick inet proto { tcp, udp, icmp } from $AllIFs to any \
   flags S/SA keep state

################

# For Traceroute to some Internal hosts
pass in log quick on $ext_if inet proto udp from any to $TracerouteIPs \
   port 33434 >< 33700 keep state
pass in log quick on $ext_if inet proto icmp from any to $TracerouteIPs \
   icmp-type 8 keep state

pass out log quick on $ext_if inet proto { tcp, udp, icmp } \
   from $InternalNet to any flags S/SA keep state

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

pass out log quick on $int_if inet proto { tcp, udp, icmp } \
   from any to $InternalNet flags S/SA keep state


Может что не правильно, уж поправьте :)))

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


Reply | Threaded
Open this post in threaded view
|

Re: Pass traceroute via PF (some solution)

Anton Maksimenkov
Hi, Grigory.

Я, Anton Maksimenkov, не писал ВСЕГО нижеперечисленного в этом треде,
и просил бы автора не счесть за труд более корректно составлять
письма.



> Anton Maksimenkov wrote:

>>>и отвечал только на ICMP echo и на traceroute давал ICMP time exceeded
>>>(а в идеале пропускал traceroute на некоторые внутренние хосты). С
>>>ICMP echo понятно, а вот с traceroute...
>>>    
>>>
>>
>>traceroute пользует udp, порты его посмотрите и приоткройте. Не помню
>>в каком мане, но где-то описано.
>>  
>>
> Задача:

> - PF router блокирует все IN пакеты на адереса его интерфейсов,
> - но отвечает:
>    1) на icmp echo
>    2) на проходящие через него traceroute udp сообщениями icmp time
> exceeded
>       (если PF - конечный пункт для traceroute, он и так ответит
>       icmp port unreachable)

> - от него разрешено все на OUT.

> Описание traceroute:

> traceroute посылает по 3 пакета на hop (по умолчанию) udp или icmp echo,
> начиная с ttl = 1, и увеличивая ttl на 1 для каждого hopa, от
> промежуточных возвращается icmp time exceeded, от конечного - icmp
> port unreachable.
> По умолчанию при UDP для каждой пробы используется порт начиная от
> 33435, далее + 1 (для большей гарантии попадания на неиспользуемый
> порт), типа на 1-й hop 3 пробы на порты 33435, 33436, 33437 и тд.
> Конечный порт зависит от количества hop'ов
> По умолчанию Linux, FreeBSD и OpenBSD traceroute используют udp,
> Windows XP - icmp echo.

> Решение:

> # PF IFs
> ext_if = "fxp0"
> int_if = "fxp1"

> AllIFs = "{ fxp0 fxp1 fxp2 ... }"

> InternalNet = "{ IPs ... }"

> #Internal Traceroute IPs
> TracerouteIPs = "{ IPs ... }"

> block all

> # PF router
> # Pass IN
> # UDP traceroute
> pass in log quick inet proto udp from any to $AllIFs \
>    port 33434 >< 33700

> # ICMP Echo
> pass in log quick inet proto icmp from any to $AllIFs \
>    icmp-type 8 keep state

> # Block all other IN
> block in log quick from any to $AllIFs

> # Pass all OUT
> pass out log quick inet proto { tcp, udp, icmp } from $AllIFs to any \
>    flags S/SA keep state

> ################

> # For Traceroute to some Internal hosts
> pass in log quick on $ext_if inet proto udp from any to $TracerouteIPs \
>    port 33434 >< 33700 keep state
> pass in log quick on $ext_if inet proto icmp from any to $TracerouteIPs \
>    icmp-type 8 keep state

> pass out log quick on $ext_if inet proto { tcp, udp, icmp } \
>    from $InternalNet to any flags S/SA keep state

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

> pass out log quick on $int_if inet proto { tcp, udp, icmp } \
>    from any to $InternalNet flags S/SA keep state


> Может что не правильно, уж поправьте :)))

--
engineer


Reply | Threaded
Open this post in threaded view
|

Re: Pass traceroute via PF (some solution)

Pavel Labushev
In reply to this post by Grigory Klyuchnikov


Grigory Klyuchnikov wrote:

> Может что не правильно, уж поправьте :)))

Не надо так извращаться. :) Вот такой набор правил обеспечит прохождение
трейса с данного хоста (все остальное будет блокироваться, включая ssh
:) :

pass out quick on $ext_if proto udp keep state
pass out quick on $ext_if proto icmp keep state
block quick all

icmp-сообщения, приходящие в ответ на пакеты, для которых сделан keep
state, пропускаются, потому что тоже относятся к стейту. И городьба с
пропуском отдельных портов udp, типов icmp-сообщений и даже proto tcp +
flags S/SA (?!) нужна только для примера, как делать не надо. :)

Если закомментить только второе правило, udp-трейс будет работать. Если
закомментить только первое правило, icmp-трейс будет работать.


Reply | Threaded
Open this post in threaded view
|

Re: Pass traceroute via PF (some solution)

Grigory Klyuchnikov
In reply to this post by Anton Maksimenkov
Anton Maksimenkov wrote:

>Hi, Grigory.
>
>Я, Anton Maksimenkov, не писал ВСЕГО нижеперечисленного в этом треде,
>и просил бы автора не счесть за труд более корректно составлять
>письма.
>  
>
Прошу прощения.

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


Reply | Threaded
Open this post in threaded view
|

Re: Pass traceroute via PF (some solution)

Grigory Klyuchnikov
In reply to this post by Pavel Labushev
Pavel Labushev wrote:

>Grigory Klyuchnikov wrote:
>
>  
>
>>Может что не правильно, уж поправьте :)))
>>    
>>
>
>Не надо так извращаться. :) Вот такой набор правил обеспечит прохождение
>трейса с данного хоста (все остальное будет блокироваться, включая ssh
>:) :
>
>pass out quick on $ext_if proto udp keep state
>pass out quick on $ext_if proto icmp keep state
>block quick all
>  
>
может я чего не понимаю, только как по этим правилам пройдут udp пакеты
на IN on $ext_if с портами 33435 и далее, по-моему они будут блокироваться,
так же как и icmp

>icmp-сообщения, приходящие в ответ на пакеты, для которых сделан keep
>state, пропускаются, потому что тоже относятся к стейту. И городьба с
>пропуском отдельных портов udp, типов icmp-сообщений и даже proto tcp +
>flags S/SA (?!) нужна только для примера, как делать не надо. :)
>  
>
т.е. flags S/SA лишнее, не пойму только почему, потеря производительности
или это никак не влияет на безопасность?

>Если закомментить только второе правило, udp-трейс будет работать. Если
>закомментить только первое правило, icmp-трейс будет работать.
>  
>
--
С уважением,
Григорий Ключников, Ведущий инженер,
Институт Системного Программирования РАН
+7 095 912-56-59
[hidden email]

Regards,
Grigory Klyuchnikov, System Engineer,
Institute for System Programming
Russian Academy of Sciences
+7 095 912-56-59
[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: Pass traceroute via PF (some solution)

Dmitry V. Kustov
On Thu, 22 Dec 2005 20:43:18 +0300, Grigory Klyuchnikov wrote:

> т.е. flags S/SA лишнее, не пойму только почему, потеря производительности
> или это никак не влияет на безопасность?
>
Для UDP и ICMP они бессмысленны, см. мою правку.


Reply | Threaded
Open this post in threaded view
|

Re: Pass traceroute via PF (some solution)

Pavel Labushev
In reply to this post by Grigory Klyuchnikov


Grigory Klyuchnikov wrote:

> может я чего не понимаю, только как по этим правилам пройдут udp пакеты
> на IN on $ext_if с портами 33435 и далее, по-моему они будут блокироваться,
> так же как и icmp

Это я не понял вопрос (а потом и ответ), прошу прощения. Идея "сегодня
тоже не буду спать" только что благополучно скончалась. :)

Один момент: если все $TracerouteIPs находятся в $InternalNet, отдельные
правила для трейса к ним не имеют смысла, т.к. все пакеты и так проходят
в $InternalNet (последнее правило).

> т.е. flags S/SA лишнее, не пойму только почему, потеря производительности
> или это никак не влияет на безопасность?

Не лишнее. Это я ошибся. Могу только порекомендовать synproxy state
вместо (в последнем правиле), чтобы от син-флуда пользователей защитить.