URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 93463
[ Назад ]

Исходное сообщение
"IPFW, как блочить всех, кроме нескольких хостов"

Отправлено AdVv , 07-Июн-12 03:27 
Народ подскажите, по идее примитивная задача, однако туплю:
Есть внутренняя сетка 192.168/16 за NAT на FreeBSD, на ней же живет почтовый сервер.
Чтобы залетные вредноносы не слали из сети наружу спам связь на 25 порт им разрешена только на корпоративный почтовик. Соответственно deny log ip from 192.168.0.0/16 to not me 25. После чего пакеты попадают на nat. Но в сети существуют несколько хостов, которые должны быть исключены из этого правила.
Вот только куда правильно внедрить исключение до меня не доходит. Если прописать allow для разрешенных хостов до deny, то пакеты попадают на него до nat и уходят наружу с частными адресами. Если после, то они на него не попадают, а рубятся на deny. Если же сначала пропустить их через nat, то уже невозможно отличить легитимный  почтовый траффик сервера от спама с внутренних хостов.
Очень хочется написать что-то типа from ( 192.168.0.0/16 and not 192.168.1.3 and not 192.168.1.4 ), но ipfw насколько я понимаю из man, "and" в теле правила обрабатывать не умеет. Так как же быть в таком случае, не городить же таблицы из за двух-трех хостов ?!
Заранее спасибо !

Содержание

Сообщения в этом обсуждении
"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено YuryD , 07-Июн-12 09:10 
> Чтобы залетные вредноносы не слали из сети наружу спам связь на 25
> порт им разрешена только на корпоративный почтовик. Соответственно deny log ip
> from 192.168.0.0/16 to not me 25. После чего пакеты попадают на
> nat. Но в сети существуют несколько хостов, которые должны быть исключены
> из этого правила.

Ну до deny написать skipto сразу на nat для этих адресов, хоть и не очень правильно


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 07-Июн-12 15:23 
> Вот только куда правильно внедрить исключение до меня не доходит. Если прописать
> allow для разрешенных хостов до deny, то пакеты попадают на него
> до nat и уходят наружу с частными адресами. Если после, то
> они на него не попадают, а рубятся на deny. Если же
> сначала пропустить их через nat, то уже невозможно отличить легитимный  
> почтовый траффик сервера от спама с внутренних хостов.

надо таки ман ipfw прочитать чтобы подобных глупостей не спрашивать:
ipfw deny..... in via $iif
ipfw allow ... out via $oif


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено AdVv , 07-Июн-12 19:06 
>> Вот только куда правильно внедрить исключение до меня не доходит. Если прописать
>> allow для разрешенных хостов до deny, то пакеты попадают на него
>> до nat и уходят наружу с частными адресами. Если после, то
>> они на него не попадают, а рубятся на deny. Если же
>> сначала пропустить их через nat, то уже невозможно отличить легитимный
>> почтовый траффик сервера от спама с внутренних хостов.
> надо таки ман ipfw прочитать чтобы подобных глупостей не спрашивать:
> ipfw deny..... in via $iif
> ipfw allow ... out via $oif

Спасибо что напомнил про man, об этом всегда очень полезно помнить !
Чтобы было понятнее перефразирую немного вопрос, как заблокировать подсетку исключив при этом несколько адресов. Предположим подсеть 192.168.0.0/16 заблокировать, но адреса  192.168.1.3 и 192.168.1.4 пропускать. Хочется узнать как это делается без глупостей, просто и элегантно, парой-тройкой правил.
Те два варианта, что выше, не принесли мне ясности, т.к. по моему все самое главное попало в область с многоточием.
Благодарю за ответы.


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 08-Июн-12 07:37 
>[оверквотинг удален]
>> ipfw deny..... in via $iif
>> ipfw allow ... out via $oif
> Спасибо что напомнил про man, об этом всегда очень полезно помнить !
> Чтобы было понятнее перефразирую немного вопрос, как заблокировать подсетку исключив при
> этом несколько адресов. Предположим подсеть 192.168.0.0/16 заблокировать, но адреса  192.168.1.3
> и 192.168.1.4 пропускать. Хочется узнать как это делается без глупостей, просто
> и элегантно, парой-тройкой правил.
> Те два варианта, что выше, не принесли мне ясности, т.к. по моему
> все самое главное попало в область с многоточием.
> Благодарю за ответы.

ipfw add 100 allow from 192.168.1.3,192.168.1.4 ...
ipfw add 200 deny from 192.168.0.0/16 ...


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Аноним , 08-Июн-12 07:46 
> ipfw add 100 allow from 192.168.1.3,192.168.1.4 ...
> ipfw add 200 deny from 192.168.0.0/16 ...

боюсь что сейчас будет реплика: "все самое главное попало в область с многоточием"... :)


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено user , 08-Июн-12 21:02 
>> ipfw add 100 allow from 192.168.1.3,192.168.1.4 ...
>> ipfw add 200 deny from 192.168.0.0/16 ...
> боюсь что сейчас будет реплика: "все самое главное попало в область с
> многоточием"... :)

Не все же такие "умные" как ты....


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено AdVv , 09-Июн-12 03:18 
>[оверквотинг удален]
>> Спасибо что напомнил про man, об этом всегда очень полезно помнить !
>> Чтобы было понятнее перефразирую немного вопрос, как заблокировать подсетку исключив при
>> этом несколько адресов. Предположим подсеть 192.168.0.0/16 заблокировать, но адреса  192.168.1.3
>> и 192.168.1.4 пропускать. Хочется узнать как это делается без глупостей, просто
>> и элегантно, парой-тройкой правил.
>> Те два варианта, что выше, не принесли мне ясности, т.к. по моему
>> все самое главное попало в область с многоточием.
>> Благодарю за ответы.
> ipfw add 100 allow from 192.168.1.3,192.168.1.4 ...
> ipfw add 200 deny from 192.168.0.0/16 ...

Гениально. Продолжаем разговор, возвращаясь к исходному вопросу, мне бы очень хотелось, чтобы после фильра пакеты попали на nat. С deny все чудесно, одна беда - после попадания на allow ipfw прекращает обработку правил, и пакет улетает на внешний интерфейс с приватным адресом. Где же мне разместить nat правило ?


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 09-Июн-12 09:12 
> Гениально. Продолжаем разговор, возвращаясь к исходному вопросу, мне бы очень хотелось,
> чтобы после фильра пакеты попали на nat. С deny все чудесно,
> одна беда - после попадания на allow ipfw прекращает обработку правил,
> и пакет улетает на внешний интерфейс с приватным адресом. Где же
> мне разместить nat правило ?

эээ а попытаться хоть чуточку напряч хотябы одну извилину? открыть наконец дефолтный /etc/rc.firewall, и снова напряч извилины? ах да, два раза напряч за одно строчку это слишком ...

если бы прочитал таки man ipfw, то понял что в ipfw гораздо больше действий чем аллоу и дени. например есть skipto которое не прерывает обработку.

берем мой пример:
> ipfw add 100 allow from 192.168.1.3,192.168.1.4 ...
> ipfw add 200 deny from 192.168.0.0/16 ...

и вуаля!
ipfw add 100 skipto 300 from 192.168.1.3,192.168.1.4 ...
ipfw add 200 deny from 192.168.0.0/16 ...
ipfw add 300 nat ...

или вообще цепочки:
ipfw add 10 skipto 1000 from any to any in via $oif
ipfw add 20 skipto 2000 from any to any out via $oif
ipfw add 30 skipto 3000 from any to any in via $iif
ipfw add 40 skipto 40000 from any to any out via $iif
....
ipfw add 1000 count from any to any // IN VIA OIf
... some rules ...
ipfw nat ...
... some rules ...
ipfw deny from any to any
ipfw add 2000 count from any to any // OUT VIA OIf
... some rules ...
ipfw nat ...
... some rules ...
ipfw deny from any to any
ipfw add 3000 count from any to any // IN VIA IIf
... some rules ...
ipfw deny from any to any
ipfw add 4000 count from any to any // OUT VIA IIf
... some rules ...
ipfw deny from any to any

iif - internal interface
oif - outer inteface


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено AdVv , 09-Июн-12 16:07 
>[оверквотинг удален]
> ... some rules ...
> ipfw deny from any to any
> ipfw add 3000 count from any to any // IN VIA IIf
> ... some rules ...
> ipfw deny from any to any
> ipfw add 4000 count from any to any // OUT VIA IIf
> ... some rules ...
> ipfw deny from any to any
> iif - internal interface
> oif - outer inteface

Ну то бишь ты наконец-то разобрался, о чем я спрашивал с самого начала, и понял, что высокомерно нес в ответ какую-то чушь ? Это хорошо, надеюсь полезно в первую очередь для тебя.
Вариант со skipto сразу посоветовал YuryD, за что ему собственно большое спасибо. Как он заметил, это рабочее, но не очень красивое решение. При большом количестве правил потом будет тяжело разобраться.


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 10-Июн-12 23:17 
> Ну то бишь ты наконец-то разобрался, о чем я спрашивал с самого
> начала, и понял, что высокомерно нес в ответ какую-то чушь ?
> Это хорошо, надеюсь полезно в первую очередь для тебя.
> Вариант со skipto сразу посоветовал YuryD, за что ему собственно большое спасибо.
> Как он заметил, это рабочее, но не очень красивое решение. При
> большом количестве правил потом будет тяжело разобраться.

Нука нука, покажи ка нам "красивое" решение ))


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено AdVv , 12-Июн-12 00:22 
>> Ну то бишь ты наконец-то разобрался, о чем я спрашивал с самого
>> начала, и понял, что высокомерно нес в ответ какую-то чушь ?
>> Это хорошо, надеюсь полезно в первую очередь для тебя.
>> Вариант со skipto сразу посоветовал YuryD, за что ему собственно большое спасибо.
>> Как он заметил, это рабочее, но не очень красивое решение. При
>> большом количестве правил потом будет тяжело разобраться.
> Нука нука, покажи ка нам "красивое" решение ))

Знал бы - не спрашивал.


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 12-Июн-12 14:13 
Epic fail

"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено AdVv , 12-Июн-12 14:59 
> Epic fail

Я, в отличи от некоторых, не боюсь признать, что чего-то не знаю.


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 13-Июн-12 09:50 
>> Epic fail
> Я, в отличи от некоторых, не боюсь признать, что чего-то не знаю.

Мммм и чего же я не знаю, обоснуй?
Ну если тебе не понятна элементарная конструкция ака "goto" ну и чьи это проблемы?


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено user , 13-Июн-12 10:37 

>[оверквотинг удален]
> ipfw add 1000 count from any to any // IN VIA OIf
> ... some rules ...
> ipfw nat ...
> ... some rules ...
> ipfw deny from any to any
> ipfw add 2000 count from any to any // OUT VIA OIf
> ... some rules ...
> ipfw nat ...
> ... some rules ...
> ipfw deny from any to any

А не подскажите как быть, например с icmptype 3 (PMTU) или другими типами для локальной сети.

Допустим,
ipfw add 1000 count from any to any // IN VIA OIf
... some rules ...
ipfw add allow icmp from any to any icmptypes 3,4,8,11,12
ipfw nat ...
... some rules ...
ipfw deny from any to any

тогда ни трейсроут ни PMTU для хостов в лок. сети работать не будут, т.к. обработка правил не будет доходить до правила обратного ната, а будет останавливаться на вышеуказанном правиле как для самого роутера так и для LAN.


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 13-Июн-12 13:48 
>[оверквотинг удален]
> ipfw add 1000 count from any to any // IN VIA OIf
> ... some rules ...
> ipfw add allow icmp from any to any icmptypes 3,4,8,11,12
> ipfw nat ...
> ... some rules ...
> ipfw deny from any to any
> тогда ни трейсроут ни PMTU для хостов в лок. сети работать не
> будут, т.к. обработка правил не будет доходить до правила обратного ната,
> а будет останавливаться на вышеуказанном правиле как для самого роутера так
> и для LAN.

вы шо издеваетесь? ))
выше же пример есть:

ipfw add 1000 count from any to any // IN VIA OIf
ipfw add 1001 skipto 1100 icmp from any to any icmptypes 3,4,8,11,12
// разрешаем нужные типы, но делаеь skipto вместо allow
ipfw add 1002 deny icmp from any to any
// глушим остально icmp
ipfw 1100 nat ...
ipfw deny from any to any


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено user , 13-Июн-12 19:51 
>[оверквотинг удален]
>> ipfw add allow icmp from any to any icmptypes 3,4,8,11,12
>> ipfw nat ...
>> ... some rules ...
>> ipfw deny from any to any
>> тогда ни трейсроут ни PMTU для хостов в лок. сети работать не
>> будут, т.к. обработка правил не будет доходить до правила обратного ната,
>> а будет останавливаться на вышеуказанном правиле как для самого роутера так
>> и для LAN.
> вы шо издеваетесь? ))
> выше же пример есть:

  Боюсь, это вы издеваетесь.

> ipfw add 1000 count from any to any // IN VIA OIf
> ipfw add 1001 skipto 1100 icmp from any to any icmptypes 3,4,8,11,12
> // разрешаем нужные типы, но делаеь skipto вместо allow
> ipfw add 1002 deny icmp from any to any
> // глушим остально icmp
> ipfw 1100 nat ...
> ipfw deny from any to any

При таком раскладе пробуем пинговать роутер снаружи. И ничего не получается, потому что будет срабатывать правило 1100...


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 14-Июн-12 08:07 
>   Боюсь, это вы издеваетесь.
>  При таком раскладе пробуем пинговать роутер снаружи. И ничего не получается,
> потому что будет срабатывать правило 1100...

чего ради?
во-первых: приходит ipmp СНАРУЖИ на ВНЕШНИЙ АЙПИ попадает на нат и о чудо - у ната в таблице нет такой сесии, и он ЧУДОМ не переписывает dst_ip ))
во-вторых: вы хоть пробовали то, о чем говорите? ))
в-третих: в типы icmp НОЛЬ добавте, глядишь и с локалки все пинговаться начнет
в-четвертых: это, как я понимаю, мы делали набор правил для направления "IN VIA $OIF",
вот если еще выпустить наружу type 0 icmp, то роутер однозначно начнет пинговаться )



"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено user , 14-Июн-12 09:51 
>>   Боюсь, это вы издеваетесь.
>>  При таком раскладе пробуем пинговать роутер снаружи. И ничего не получается,
>> потому что будет срабатывать правило 1100...
> чего ради?
> во-первых: приходит ipmp СНАРУЖИ на ВНЕШНИЙ АЙПИ попадает на нат и о
> чудо - у ната в таблице нет такой сесии, и он
> ЧУДОМ не переписывает dst_ip ))

   И тут чудо, о котором вы не знаете. Если у вас стоит в конфигурации ната deny_in, то  
   обработка правил дальше НЕ ИДЕТ. Если же нет deny_in, то при отсутствии сесии в  
   таблице обработка правил идет дальше по нумерации.

> во-вторых: вы хоть пробовали то, о чем говорите? ))

  Да, пробовал. А вы судя по всему нет.

> в-третих: в типы icmp НОЛЬ добавте, глядишь и с локалки все пинговаться
> начнет
> в-четвертых: это, как я понимаю, мы делали набор правил для направления "IN
> VIA $OIF",
> вот если еще выпустить наружу type 0 icmp, то роутер однозначно начнет
> пинговаться )

Вот пример.

У меня тоже per-interface rules. Вот кусок IN VIA EXTERNAL INTERFACE.
В table(3) - адреса админов с которых они заходят на удаленные столы внутресетевых машин.
В table(1) - локальные подсети.
### in em0 (ext_if)

$cmd 3000 deny ip4 from any to any in via em0 ipoptions ssrr
.... тут всякие антиспуфинги и т.д.
$cmd 3012 deny ip4 from me to any in via em0

$cmd 3020 check-state
# nat-back-to-lan
$cmd 3025 nat 1 ip4 from not me to me in via $ext_if

# to ext_if only
$cmd 3030 allow tcp from not me to me 22 in via $ext_if setup limit src-addr 3
$cmd 3035 deny tcp from not "table(3)" to me 3389 in via $ext_if setup limit src-addr 3
$cmd 3040 allow icmp from not me to me icmptypes 0,3,4,8,11,12 in via $ext_if
$cmd 3045 deny ip4 from not me to me in via $ext_if

# to LAN only
$cmd 3050 allow ip4 from not me to "table(1)" in via $ext_if

$cmd 3999 deny log all from any to any

Вот так работате как положено. После входящего ната мы уже можем оперировать dst-addr, т.е. что пришло именно для роутера me или для локальной сети table(1).

Вот покаже исходящее на внешнем.

### out em0 (ext_if)

.... some rules from router (router traffic only)

$cmd 2140 deny all from me to any out via $ext_if

ipfw nat 1 config if $ext_if log same_ports reset unreg_only \ # тут без deny_in
        redirect_port tcp 192.168.10.12:3389 3389
$cmd 2150 nat 1 ip4 from "table(1)" to not me out via $ext_if

$cmd 2160 allow ip4 from me to not me out via $ext_if

$cmd 2999 deny log all from any to any

Не. Если я где-то неправ рад буду если покажите.


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 14-Июн-12 13:35 
>    И тут чудо, о котором вы не знаете. Если
> у вас стоит в конфигурации ната deny_in, то
>    обработка правил дальше НЕ ИДЕТ. Если же нет deny_in,
> то при отсутствии сесии в
>    таблице обработка правил идет дальше по нумерации.

чудес не бывает - бывают чудотворцы (с)
еще скажи что deny_incoming по дефолту включен (намек на чудотворца :))

>   Да, пробовал. А вы судя по всему нет.

ух )
ты спросил "как сделать конкретную вещь" я тебе конкретно ответил
а ты начал фапать на какието обстракции

>  Вот пример.

ну ты бы хоть правила приводил в порядке нумерации, а то знаете, это даже читать как-то недосук ...


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено user , 14-Июн-12 15:36 
>[оверквотинг удален]
>>    таблице обработка правил идет дальше по нумерации.
> чудес не бывает - бывают чудотворцы (с)
> еще скажи что deny_incoming по дефолту включен (намек на чудотворца :))
>>   Да, пробовал. А вы судя по всему нет.
> ух )
> ты спросил "как сделать конкретную вещь" я тебе конкретно ответил
> а ты начал фапать на какието обстракции
>>  Вот пример.
> ну ты бы хоть правила приводил в порядке нумерации, а то знаете,
> это даже читать как-то недосук ...

Мдаа... С вами, мсье, все ясно...
И да, "тыкань" не надо, мы свами не пили :-)


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 14-Июн-12 19:57 
> Мдаа... С вами, мсье, все ясно...
> И да, "тыкань" не надо, мы свами не пили :-)

О, простите благородный дон.
Не соблоговолит ли благородный дон пояснить мне неразумному пару моментов:
1) $cmd 3020 check-state
а где у благородного дона правила аля keep-state ?

2) $cmd 3035 deny tcp from not "table(3)" to me 3389 in via $ext_if setup limit src-addr 3
да простит меня благородный дон, но я что-то не осилил смысла этого правила

3) а не затруднит ли благородного дона показать `ipfw -a list`, чисто для умственного развития и примера для подражания.


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено user , 14-Июн-12 20:56 
>> Мдаа... С вами, мсье, все ясно...
>> И да, "тыкань" не надо, мы свами не пили :-)
> О, простите благородный дон.
> Не соблоговолит ли благородный дон пояснить мне неразумному пару моментов:
> 1) $cmd 3020 check-state
> а где у благородного дона правила аля keep-state ?

  Улыбнулся. Вы ж ман не читате. Кроме keep-state стейт также создает опция limit.

> 2) $cmd 3035 deny tcp from not "table(3)" to me 3389 in
> via $ext_if setup limit src-addr 3
> да простит меня благородный дон, но я что-то не осилил смысла этого
> правила

Таким образом фильтруется редирект на RDP внутрилокальновиндовых машин :-)

> 3) а не затруднит ли благородного дона показать `ipfw -a list`, чисто
> для умственного развития и примера для подражания.


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Pahanivo , 15-Июн-12 15:52 
> 2) $cmd 3035 deny tcp from not "table(3)" to me 3389 in
> via $ext_if setup limit src-addr 3

deny ... limit
что курит таки афтар ))

>  Таким образом фильтруется редирект на RDP внутрилокальновиндовых машин :-)

нуну
ipfw -ad list покажи



"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено Deac , 18-Июн-12 19:57 
>[оверквотинг удален]
> allow для разрешенных хостов до deny, то пакеты попадают на него
> до nat и уходят наружу с частными адресами. Если после, то
> они на него не попадают, а рубятся на deny. Если же
> сначала пропустить их через nat, то уже невозможно отличить легитимный  
> почтовый траффик сервера от спама с внутренних хостов.
> Очень хочется написать что-то типа from ( 192.168.0.0/16 and not 192.168.1.3 and
> not 192.168.1.4 ), но ipfw насколько я понимаю из man, "and"
> в теле правила обрабатывать не умеет. Так как же быть в
> таком случае, не городить же таблицы из за двух-трех хостов ?!
> Заранее спасибо !

Открой для себя таблицы, и не надо их "городить". :)
Таблицы надо юзать везде, где только можно. Это способствует ускорению обработки пакетов и значительно упрощает правила.


"IPFW, как блочить всех, кроме нескольких хостов"
Отправлено AdVv , 18-Июн-12 22:27 
>>[оверквотинг удален]
> Открой для себя таблицы, и не надо их "городить". :)
> Таблицы надо юзать везде, где только можно. Это способствует ускорению обработки пакетов
> и значительно упрощает правила.

Да я открыл давно. Второй раз попрошу, вместе с советами сразу примерные правила покажите. Может и раздумаете советовать тогда ;) Заранее спасибо.