The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  правила/FAQ  поиск  регистрация  вход/выход  слежка  RSS
"IPFW NAT - порядок прохождения правил"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Firewall, Фильтрация пакетов / FreeBSD)
Изначальное сообщение [ Отслеживать ]

"IPFW NAT - порядок прохождения правил"  –1 +/
Сообщение от neekonoff (ok) on 17-Апр-17, 15:50 
Друзья, прошу помощи.
FreeBSD 10.3.
Есть вот такой набор правил. По структуре - пример правил из хэндбука.
---------------------------------------------------------------------------------
#!/bin/sh
ipfw -q -f flush

cmd="ipfw -q add"

$cmd 010 allow all from any to any via lo0
$cmd 020 allow all from any to any via fxp0

ipfw -q nat 1 config ip 1.2.3.4 same_ports reset deny_in \
                        redirect_port tcp 10.1.10.12:443 443 \
                        redirect_port tcp 10.1.10.12:25 25

$cmd 100 nat 1 ip from any to any in via em0
                        
$cmd 200 check-state

$cmd 300 skipto 800 tcp from 10.1.10.0/24 to any out via em0 setup keep-state

$cmd 400 deny all from any to any frag in via em0
$cmd 500 deny tcp from any to any established in via em0

$cmd 600 tcp from any to 10.1.10.12 25,443 in via em0 setup keep-state

$cmd 700 deny all from any to any via em0

$cmd 800 nat 1 ip from any to any out via em0

$cmd 900 allow all from any to any
$cmd 999 deny all from any to any

----------------------------------------------------------
sysctl net.inet.ip.fw.one_pass=0
----------------------------------------------------------------------------------
Подскажите, почему нет связи с 10.1.10.12 извне?

Ведь входящий трафик на внешний IP 1.2.3.4 на порт, например, 443:
На проходе IN:
1. Приходит на правило 100. Меняется адрес назначения (так как редирект_порт)
2. Далее выходит изната и, т.к. one_pass=0, доходит до правила 600 (в динамической таблице создается запись для пар адресов внутреннего и внешнего адреса), выходит из прохода IN и попадает в проход OUT.
На проходе OUT:
3. Доходит до правила 020 и отправляется на внутренний хост 10.1.10.12:443.

Ответный трафик от хоста 10.1.10.12
На проходе IN:
4. Доходит до правила 020, входит из прохода IN и попадает в проход OUT.
На проходе OUT:
5. Доходит до правила 200 и отправляется на внешний адрес (т.к. запись о соединении уже есть в динамической таблице).

Подскажите, где ошибка?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Аноним (??) on 17-Апр-17, 18:39 
> Подскажите, где ошибка?

начнём с трbвиального:
gateway_enable="YES" в /etc/rc.conf включил?
на хосте 10.1.10.12 шлюзом машина с IPFW прописана?


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Аноним (??) on 17-Апр-17, 18:41 
>> Подскажите, где ошибка?
> начнём с трbвиального:
> gateway_enable="YES" в /etc/rc.conf включил?
> на хосте 10.1.10.12 шлюзом машина с IPFW прописана?

$cmd 500 deny tcp from any to any established in via em0 <- ХЕРНЯ

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 17-Апр-17, 19:02 
>>> Подскажите, где ошибка?
>> начнём с трbвиального:
>> gateway_enable="YES" в /etc/rc.conf включил?
>> на хосте 10.1.10.12 шлюзом машина с IPFW прописана?
> $cmd 500 deny tcp from any to any established in via em0
> <- ХЕРНЯ

Почему херня? Оно запрещает ACK пакеты, которые не соответствуют динамической таблице правил.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 17-Апр-17, 19:22 
>>> Подскажите, где ошибка?
>> начнём с трbвиального:
>> gateway_enable="YES" в /etc/rc.conf включил?
>> на хосте 10.1.10.12 шлюзом машина с IPFW прописана?
> $cmd 500 deny tcp from any to any established in via em0
> <- ХЕРНЯ

Ок. Отключил правило 500. Все равно болт..

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

6. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Pahanivo (ok) on 18-Апр-17, 00:07 
> Ок. Отключил правило 500. Все равно болт..

А теперь включи log, man tcpdump, напряги внимание.

> Есть вот такой набор правил.

это не набор правил, а скрипт для их создания (конфигурации)
смотри рабочие правила, а не скрипт
а конфиг интерфейсов где?
> ---------------------------------------------------------------------------------
> #!/bin/sh
> ipfw -q -f flush
> cmd="ipfw -q add"
> $cmd 010 allow all from any to any via lo0
> $cmd 020 allow all from any to any via fxp0

fxp0 это типа внешний интерфейс??

> ----------------------------------------------------------
> sysctl net.inet.ip.fw.one_pass=0

нахуа??

> Подскажите, где ошибка?

ошибка в том что пакет пройдет фаер дважды (по кол-ву интерйефсов)

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 18-Апр-17, 01:47 
>[оверквотинг удален]
> это не набор правил, а скрипт для их создания (конфигурации)
> смотри рабочие правила, а не скрипт
> а конфиг интерфейсов где?
>> ---------------------------------------------------------------------------------
>> #!/bin/sh
>> ipfw -q -f flush
>> cmd="ipfw -q add"
>> $cmd 010 allow all from any to any via lo0
>> $cmd 020 allow all from any to any via fxp0
> fxp0 это типа внешний интерфейс??

fxp0 - внутренний интерфейс 10.1.10.1
em0 - внешний 1.2.3.4

>> ----------------------------------------------------------
>> sysctl net.inet.ip.fw.one_pass=0
> нахуа??

Ну так ведь иначе после правила с NAT пакет не пойдет дальше по правилам. А структура этого конфига подразумевает как раз, чтобы пакет обрабатывался подходящим правилом после правила с NAT.
Ну и в дальнейшем чтоб прикрутить пайпы и очереди.

>> Подскажите, где ошибка?
> ошибка в том что пакет пройдет фаер дважды (по кол-ву интерйефсов)

Я понимаю, чтоб пакет пройдет фаер дважды.
Но, покурив вот это http://www.lissyara.su/articles/freebsd/tuning/ipfw_nat/ , думал, что пакет пройдет фаер дважды по проходам IN и OUT, а не из-за количества интерфейсов.
Объясните пжлста поподробней об "ошибка в том, что пакет пройдет фаер дважды (по кол-ву интерфейсов)"

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 18-Апр-17, 01:54 
.
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

11. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Pahanivo (ok) on 19-Апр-17, 10:24 
> смотри рабочие правила, а не скрипт
>> смотри рабочие правила, а не скрипт
>>> смотри рабочие правила, а не скрипт
>>>> смотри рабочие правила, а не скрипт
>>>>> смотри рабочие правила, а не скрипт
>>>>>> смотри рабочие правила, а не скрипт

$cmd 600 tcp from any to 10.1.10.12 25,443 in via em0 setup keep-state
убери нахер check and keep - сделать и отладь для начала статику

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

3. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 17-Апр-17, 19:00 
>> Подскажите, где ошибка?
> начнём с трbвиального:
> gateway_enable="YES" в /etc/rc.conf включил?
> на хосте 10.1.10.12 шлюзом машина с IPFW прописана?

Да, конечно. И firewall_nat_enable.. Все это есть.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

9. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Дум Дум on 18-Апр-17, 14:48 
> ipfw -q nat 1 config ip 1.2.3.4 same_ports reset deny_in \
>            

Вспомнить бы про deny_in. Вроде, в нат попадёт входящий - ответ на исходящий, но попытка установки соединения извне - нет...?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

10. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 18-Апр-17, 16:12 
>> ipfw -q nat 1 config ip 1.2.3.4 same_ports reset deny_in \
>>
> Вспомнить бы про deny_in. Вроде, в нат попадёт входящий - ответ на
> исходящий, но попытка установки соединения извне - нет...?

Случайный трафик извне - нет. Но трафик на порт 80 - обработается, так как есть папаметр "redirect_port..".

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

12. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Дум Дум on 19-Апр-17, 10:35 
>>Ответный трафик от хоста 10.1.10.12
>>На проходе IN:
>>4. Доходит до правила 020, входит из прохода IN и попадает в проход OUT.
>>На проходе OUT:
>>5. Доходит до правила 200 и отправляется на внешний адрес (т.к. запись о соединении >>уже есть в динамической таблице).

Тогда на проходе OUT доходит до правила 200 и отправляется на внешний адрес с адресом отправителя 10.1.10.12... ?

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

15. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 19-Апр-17, 23:11 
>>>Ответный трафик от хоста 10.1.10.12
>>>На проходе IN:
>>>4. Доходит до правила 020, входит из прохода IN и попадает в проход OUT.
>>>На проходе OUT:
>>>5. Доходит до правила 200 и отправляется на внешний адрес (т.к. запись о соединении >>уже есть в динамической таблице).
> Тогда на проходе OUT доходит до правила 200 и отправляется на внешний
> адрес с адресом отправителя 10.1.10.12... ?

Да, я этого не учел совсем.. Спасибо!

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

13. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от михалыч (ok) on 19-Апр-17, 11:54 
с динамическими правилами вы не разобрались

для проверки работоспособности выполните по шагам

0. проверить существование в /etc/rc.conf
firewall_nat_enable="YES"
firewall_nat_interface="em0"

1. устанавливаем
sysctl net.inet.ip.fw.one_pass=1

2. создаём /etc/ipfw_test тестовый файл с правилами ipfw для проверки

### очищаем перед загрузкой все правила
-f -q flush

### включаем nat 1
add 100 nat 1 all from any to any

### конфигурируем nat 1
nat 1 config redirect_port tcp 10.1.10.12:443 443 redirect_port tcp 10.1.10.12:25 25

### разрешаем всё и всем
add 200 allow all from any to any


3. загружаем правила
# ipfw /etc/ipfw_test

4. проверяем

если всё работает, то можно дополнять правилами фильтрации,
нарезать пайпы и очереди для изменения скорости


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

14. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Pahanivo (ok) on 19-Апр-17, 16:29 
пусть для начала научится ошибки в консоли читать ... см. выше.
афтар походу осознал и свалил.

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

16. "IPFW NAT - порядок прохождения правил"  –1 +/
Сообщение от neekonoff (ok) on 19-Апр-17, 23:16 
>[оверквотинг удален]
> add 100 nat 1 all from any to any
> ### конфигурируем nat 1
> nat 1 config redirect_port tcp 10.1.10.12:443 443 redirect_port tcp 10.1.10.12:25 25
> ### разрешаем всё и всем
> add 200 allow all from any to any
> 3. загружаем правила
> # ipfw /etc/ipfw_test
> 4. проверяем
> если всё работает, то можно дополнять правилами фильтрации,
> нарезать пайпы и очереди для изменения скорости

Подозреваю, что покажется бредом, но мне нравится логика и/или структура (или как это правильно назвать) конфига из хэндбука (последний пример от на этой странице https://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/fire... ).
И я хотел понять, возможно ли в к этой структуре прикрутить редирект. Ну и пайпы с очередями в дальнешем.
Переделанный под ядерный нат пример из хэндбука у меня работает. Мне кажется, что я его раскурил таки.
Понимаю, что скорее всего придется делать так, как вы говорите. Но все же :)

Спасибо

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

17. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Аноним (??) on 20-Апр-17, 20:02 
>[оверквотинг удален]
> это правильно назвать) конфига из хэндбука (последний пример от на этой
> странице https://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/fire...
> ).
> И я хотел понять, возможно ли в к этой структуре прикрутить редирект.
> Ну и пайпы с очередями в дальнешем.
> Переделанный под ядерный нат пример из хэндбука у меня работает. Мне кажется,
> что я его раскурил таки.
> Понимаю, что скорее всего придется делать так, как вы говорите. Но все
> же :)
> Спасибо

ну почему же покажется бредом? вовсе нет 😃
и мне нравится, иногда, при использовании динамических правил,
можно уложиться в меньшее количество этих самых правил

но надо быть очень внимательным, а то можно в системе
потенциальную дыру в безопасности создать и незаметить,
а оставив такую дыру последствия могут быть самыми печальными 😭

динамические правила они сложнее для понимания, а написание правил с натом
и вовсе становится нетривиальной задачей
жаль, что ты сдался, надо приложить усилие чтобы разобраться

а хочешь, я вот возьму и напишу за тебя эти правила?
думаешь дядя шутит? нет, серьёзно, я могу, если действительно надо

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

19. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 20-Апр-17, 21:22 
>[оверквотинг удален]
> и мне нравится, иногда, при использовании динамических правил,
> можно уложиться в меньшее количество этих самых правил
> но надо быть очень внимательным, а то можно в системе
> потенциальную дыру в безопасности создать и незаметить,
> а оставив такую дыру последствия могут быть самыми печальными 😭
> динамические правила они сложнее для понимания, а написание правил с натом
> и вовсе становится нетривиальной задачей
> жаль, что ты сдался, надо приложить усилие чтобы разобраться
> а хочешь, я вот возьму и напишу за тебя эти правила?
> думаешь дядя шутит? нет, серьёзно, я могу, если действительно надо

Сарказм detected ;)

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

18. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 20-Апр-17, 21:22 
Проблему я решил таким образом:
(другие адреса и интерфейсы, мушто на типа "тестовом стенде" на hyper-v, но в остальном все идентично)

#!/bin/sh
ipfw -q -f flush
cmd="ipfw -q add"
eif="hn0"       #внешний интерфейс
iif="hn1"       #внутренний интерфейс
ip1="192.168.100.5"    #типа белый ip на eif
#ip2="192.168.100.6"
#-----------------------------------------------------------
$cmd 008 allow all from any to any via lo0
$cmd 010 allow all from any to any via $iif
#-----------------------NAT config--------------------------
ipfw -q nat 1 config ip $ip1 same_ports reset deny_in redirect_port tcp 10.1.10.11:80 80 redirect_port tcp 192.168.100.5:22 22
#--------------------------NAT------------------------------
$cmd 100 nat 1 tcp from 10.1.10.11 80 to any out xmit $eif
$cmd 102 nat 1 ip from any to $ip1 not 80 in recv $eif
#-----------------------------------------------------------
$cmd 111 check-state
#------------------------Outgoing---------------------------
$cmd 210 skipto 820 tcp from 10.1.10.0/24 to any out via $eif setup keep-state
$cmd 212 skipto 820 icmp from 10.1.10.0/24 to any out via $eif keep-state
$cmd 330 deny all from any to any frag in via $eif
$cmd 332 deny tcp from any to any established in via $eif
#------------------------Incoming---------------------------
$cmd 350 skipto 850 tcp from any to $ip1 80 in recv $eif setup keep-state
$cmd 380 allow tcp from any to me 22 in via $eif setup limit src-addr 2
#---------------------------Log-----------------------------
$cmd 700 deny log all from any to any in via $eif
$cmd 710 deny log all from any to any out via $eif
#--------------------------Skipto---------------------------
$cmd 820 nat 1 ip from any to any out via $eif
$cmd 850 nat 1 tcp from any to $ip1 in recv $eif
$cmd 900 allow ip from any to any
#-----------------------------------------------------------
$cmd 999 deny log all from any to any
#---------------------------------------

Таким образом получается, что:

Трафик, приходящий извне на IP 192.168.100.5:80
На проходе IN
1. Доходит до правила 350 (в динамическую таблицу добалвяется запись вида 192.168.100.5:80<->"IP-адрес_инициатора:какой-то_порт") и "прыгает" на 850.
2. На правиле 850 адрес назначения заменяется с 192.168.100.5:80 на 10.1.10.11:80, далее выходит из NAT и, так как one_pass=0, доходит до правила 900 и выходит из прохода IN.
На проходие OUT
1. Доходит до правила 010 и выпускается на машину с адресом 10.1.10.11:80

Ответный трафик от машины 10.1.10.11:80
На проходе IN
1. Доходит до правила 010, выходит из прохода IN и попадает в проход OUT
На проходе OUT
1. Доходит до правила 100, заменяется адрес источника с 10.1.10.11:80 на 192.168.100.5:80, выходит из NAT и, так как one_pass=0, идет дальше до правила 111.
2. На правиле 111 проверяется динамическая таблица и, так как в ней уже присутствует запись вида 192.168.100.5:80<->"IP-адрес_инициатора:какой-то_порт", трафик выпускается наружу.

Может быть кому-то пригодится.

Отдельное спасибо Дум Дум за помосчь в рассуждениях! :)

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

20. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от михалыч (ok) on 21-Апр-17, 11:10 
> Может быть кому-то пригодится.

это вряд ли


я не знаю, заработает ли у вас ваша схема после переноса со стенда,
лично я в этом сильно сомневаюсь

у вас переменная sysctl net.inet.ip.fw.one_pass выставлена в 0
и нужно постоянно держать этот момент в уме при написании правил

нат вызывается аж четыре раза,

в 100 направление out и в 820 также out
в 102 есть in и в 850 опять in

в 100 и 850 нат только для TCP ? зачем?

из вашего описания (несколько туманного) непонятно,
для чего вообще нужно правило 102 ?

правила в секциях Outgoing (кроме 330 и 332) и Incoming вообще сомнительны,
какая-то каша
нет понимания ((

Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

25. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 24-Апр-17, 19:04 
Я держал в уме то, что мне нужно будет транслировать трафик на порты 80 443 и 25 с одним внешним IP, а трафик, от подсети 10.1.10.0/24 - с другим.
Да, соглашусь. Выглядит непонятно, запутанно.
Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

21. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от михалыч (ok) on 21-Апр-17, 20:08 
рабочий пример правил с сохранением состояний и поддержкой NAT

этот вариант в некотором смысле параноидальный, но, лучше уж перебздеть, чем не добдеть ))

в /etc/rc.conf присутствуют строки


firewall_enable="YES"
firewall_nat_enable="YES"
firewall_type="/etc/ipfw.conf"
defaultrouter="1.2.3.4"

где 1.2.3.4 внешний адрес

создаём файл /etc/ipfw.conf следующего содержания


### очищаем перед загрузкой все правила
-f -q flush


### запрещаем сканирование
add 10 deny tcp from any to any tcpflags syn,fin,ack,psh,rst,urg
add 11 deny tcp from any to any tcpflags !syn,!fin,!ack,!psh,!rst,!urg
add 12 deny tcp from any to any not established tcpflags fin

### антиспуфинг
add 20 deny ip from any to any not verrevpath in
#add 21 deny ip from any to any not antispoof in

### разрешаем всё на внутреннем интерфейсе
add 100 allow all from any to any via fxp0

### разрешаем всё на петлевом интерфейсе
add 200 allow all from any to any via lo0

### конфигурируем nat 1
nat 1 config if em0 deny_in same_ports unreg_only redirect_port tcp 10.1.10.12:25 25 redirect_port tcp 10.1.10.12:80 80 redirect_port tcp 10.1.10.12:443 443

### трансляция входящих пакетов
add 300 nat 1 all from any to any in recv em0

### проверяем состояние пакета
add 400 check-state

### ========================== ИСХОДЯЩИЙ ТРАФИК ========================== ###

### разрешаем исходящий трафик к DNS серверу провайдера
### x.x.x.x должен быть IP-адресом DNS сервера вашего провайдера
### продублируйте эти строки, если у вас больше одного DNS сервера
### эти IP-адреса можно взять из файла /etc/resolv.conf
#add 500 skipto 800 tcp from any to x.x.x.x 53 out xmit em0 setup keep-state
#add 501 skipto 800 udp from any to x.x.x.x 53 out xmit em0 keep-state

### разрешаем исходящий трафик для DNS
add 500 skipto 800 tcp from any to any 53 out xmit em0 setup keep-state
add 501 skipto 800 udp from any to any 53 out xmit em0 keep-state

### разрешаем исходящий трафик для HTTP
add 510 skipto 800 tcp from any to any 80 out xmit em0 setup keep-state

### разрешаем исходящий трафик для HTTPS
add 511 skipto 800 tcp from any to any 443 out xmit em0 setup keep-state

### разрешаем исходящий трафик для ICMP PING
add 520 skipto 800 icmp from any to any out xmit em0 keep-state

### разрешаем исходящий трафик для SSH
add 530 skipto 800 tcp from any to any 22 out xmit em0 setup keep-state

### разрешаем исходящий трафик для NTP
add 540 skipto 800 udp from any to any 123 out xmit em0 keep-state

### ========================== ВХОДЯЩИЙ ТРАФИК =========================== ###

### запрещаем весь входящий трафик с немаршрутизируемых и серых сетей
add 650 deny all from 192.168.0.0/16  to any in recv em0
add 651 deny all from 172.16.0.0/12   to any in recv em0
add 652 deny all from 10.0.0.0/8      to any in recv em0
add 653 deny all from 127.0.0.0/8     to any in recv em0
add 654 deny all from 0.0.0.0/8       to any in recv em0
add 655 deny all from 169.254.0.0/16  to any in recv em0
add 656 deny all from 192.0.2.0/24    to any in recv em0
add 657 deny all from 204.152.64.0/23 to any in recv em0
add 658 deny all from 224.0.0.0/3     to any in recv em0

### запрещаем MS/Windows сервисы и Netbios службы
### 81=hosts2, 113=ident, 137=name, 138=datagram, 139=session
add 660 deny tcp from any to any 81  in recv em0
add 661 deny tcp from any to any 113 in recv em0
add 662 deny tcp from any to any 137 in recv em0
add 663 deny tcp from any to any 138 in recv em0
add 664 deny tcp from any to any 139 in recv em0

### запрещаем любые фрагментированные пакеты
add 670 deny all from any to any frag in recv em0

### запрещаем не соответствующие динамической таблице правил ACK пакеты
add 680 deny tcp from any to any established in recv em0

### разрешаем входящий трафик для SMTP
add 700 skipto 800 tcp from any to any 25 in recv em0 setup limit src-addr 5

### разрешаем входящий трафик для HTTP
add 701 skipto 800 tcp from any to any 80 in recv em0 setup limit src-addr 5

### разрешаем входящий трафик для HTTPS
add 702 skipto 800 tcp from any to any 443 in recv em0 setup limit src-addr 5

### отбрасываем и заносим в журнал все неразрешенные входящие соединения из глобальной сети
add 750 deny log all from any to any in recv em0

### отбрасываем и заносим в журнал все неразрешенные исходящие соединения в глобальную сеть
add 751 deny log all from any to any out xmit em0

### место для skipto в правилах с сохранением состояния для соединений
add 800 nat 1 all from any to any out xmit em0
add 801 allow ip from any to any

### всё остальное запрещено по умолчанию
### запрещаем и заносим в журнал все пакеты для дальнейшего анализа
add 999 deny log all from any to any

### ============================ END OF FILE ============================= ###


правила 10,11,12, 20, 650-664 паранойя
правило 21 аналогично 20 , но в старых BSD правила 21 нет
в принципе, если есть 20 или 21 то 650-658 не нужны, но паранойя же

в 500 и 501 правилах вместо any 53 лучше указать IP-адрес DNS сервера провайдера

если убрать конфиг для nat выше 300 правила и если 300 правило заменить на

add 300 divert natd all from any to any in recv em0

а 800 правило на

add 800 divert natd all from any to any out xmit em0

то есть переписать их для для использования divert natd,
то можно использовать этот же набор правил ipfw для систем где нет поддержки kernel nat

в таком случае, не забываем скомпилировать ядро с поддержкой IPDIVERT
и в /etc/rc.conf должно быть вместо firewall_nat_enable="YES"


natd_enable="YES"
natd_flags="-f /etc/natd.conf"

и дополнительно необходимо будет создать файл /etc/natd.conf содержащий следующее

interface em0
deny_incoming
same_ports
unregistered_only
redirect_port tcp 10.1.10.12:25 25
redirect_port tcp 10.1.10.12:80 80
redirect_port tcp 10.1.10.12:443 443

переменная
sysctl net.inet.ip.fw.one_pass=1

дальше можно DUMMYNET прикручивать

данный набор правил протестирован с пробросом tcp порта RDP 3389 (в листинге удалён)
есть connect ! ))

такие дела

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

22. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 23-Апр-17, 16:52 
Я не поленислся и проверил то, что вы написали.
Скажите, для чего вам правила 700-702, если до них дело даже не доходит?
Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

23. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Аноним (??) on 23-Апр-17, 19:43 
> Я не поленислся и проверил то, что вы написали.
> Скажите, для чего вам правила 700-702, если до них дело даже не
> доходит?

ах вот даже как!?

гыг-гыг 😃😃
так это же тебе надо было ☝

это внутренний проброс 443 и 25 порта - твой пост
https://www.opennet.me/openforum/vsluhforumID1/96869.html#1
в конфиге нат тобой указаны порты 443 и 25

а 80 там попал до кучи - ты же его тоже пытался прокинуть
https://www.opennet.me/openforum/vsluhforumID1/96869.html#18

коменты для указанных тобой правил из примера
https://www.opennet.me/openforum/vsluhforumID1/96869.html#21
не совсем точно отражают суть написанного

вместо "разрешаем входящий трафик" нужно было писать "делаем проброс для"

ты, вероятно, думал что это типа разрешение на прохождение
обратного трафика на запросы от правил 510 и 511 ??
я тебя разочарую, нет, это редирект

если ты его действительно проверял (проброс портов),
то должен был увидеть изменение счётчиков на этих правилах

но ты можешь проверить и по другому
коли ты считаешь, что эти правила не нужны, раз до них дело даже не доходит,
убери их (закомментируй) и убедись, что редирект портов в таком случае не работает

что ж, то что ты "не поленислся и проверил" хорошо,
но лучше было бы, если бы ты не поленился, попытался хотя бы вникнуть и разобрался

Ответить | Правка | ^ к родителю #22 | Наверх | Cообщить модератору

24. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 24-Апр-17, 18:01 
Ok, скажите, что у вас с переменной sysctl net.inet.ip.fw.one_pass (конкретно с kernel nat, natd меня не интересует)?
Ответить | Правка | ^ к родителю #23 | Наверх | Cообщить модератору

26. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от михалыч (ok) on 24-Апр-17, 19:55 
> Ok, скажите, что у вас с переменной sysctl net.inet.ip.fw.one_pass (конкретно с kernel
> nat, natd меня не интересует)?

хм.. по идее эта переменная ни на что не влияет, кроме как на пайпы dummynet и узлы ng_ipfw
хотя.. если вы используете dummynet, то это вроде как ваш случай, пайпы использовать собираетесь или уже ?

вот что по этому поводу говорит
man ipfw | grep -B3 reinjected


Если установлено в 1, то, выходящий пакет из трубы dummynet или из узла ng_ipfw покидает брандмауэр.
В противном случае, пакет обрабатывается последующими правилами брандмауэра.

то есть если net.inet.ip.fw.one_pass=1 то pipe действуют на пакет как allow

возможно я и сам тумана напустил в комментах в своём примере ))
как говорил незабвенный Козьма Прутков -
"Пояснительные выражения объясняют темные мысли"

попробую ещё раз


### очищаем перед загрузкой все правила
-q -f flush

### устанавливаем net.inet.ip.fw.one_pass=1
enable one_pass
### а так в 0
#disable one_pass


### запрещаем сканирование nmap'ом на входящем интерфейсе
add 10 deny tcp from any to any tcpflags syn,fin,ack,psh,rst,urg in recv em0
add 11 deny tcp from any to any tcpflags !syn,!fin,!ack,!psh,!rst,!urg in recv em0
add 12 deny tcp from any to any not established tcpflags fin in recv em0

### антиспуфинг
add 20 deny all from any to any not verrevpath in
#add 21 deny all from any to any not antispoof in

### разрешаем всё на внутреннем интерфейсе
add 100 allow all from any to any via em1

### разрешаем всё на петлевом интерфейсе
add 200 allow all from any to any via lo0

### конфигурируем nat 1
nat 1 config if em0 same_ports unreg_only redirect_port tcp 192.168.1.100:3389 3389 redirect_port tcp 192.168.1.100:8080 8080

### трансляция входящих пакетов для IPv4, IPv6 не работает с NAT
add 300 nat 1 ip4 from any to any in recv em0

### проверяем состояние пакета
add 400 check-state

### ========================== ИСХОДЯЩИЙ ТРАФИК ========================== ###

### разрешаем исходящий трафик для DNS
add 500 skipto 800 tcp from any to any 53 out xmit em0 setup keep-state
add 501 skipto 800 udp from any to any 53 out xmit em0 keep-state

### разрешаем исходящий трафик
#add 510 skipto 800 tcp from any to any 22,80,443 out xmit em0 setup keep-state

### разрешаем исходящий трафик для HTTP
add 511 skipto 800 tcp from any to any 80 out xmit em0 setup keep-state

### разрешаем исходящий трафик для HTTPS
add 512 skipto 800 tcp from any to any 443 out xmit em0 setup keep-state

### разрешаем исходящий трафик для SSH
add 513 skipto 800 tcp from any to any 22 out xmit em0 setup keep-state

### разрешаем исходящий трафик для ICMP PING
add 514 skipto 800 icmp from any to any out xmit em0 keep-state

### разрешаем исходящий трафик для NTP
add 515 skipto 800 udp from any to any 123 out xmit em0 keep-state

### ========================== ВХОДЯЩИЙ ТРАФИК =========================== ###

### запрещаем весь входящий трафик с немаршрутизируемых и серых сетей
add 650 deny all from 192.168.0.0/16  to any in recv em0
add 651 deny all from 172.16.0.0/12   to any in recv em0
add 652 deny all from 10.0.0.0/8      to any in recv em0
add 653 deny all from 127.0.0.0/8     to any in recv em0
add 654 deny all from 0.0.0.0/8       to any in recv em0
add 655 deny all from 169.254.0.0/16  to any in recv em0
add 656 deny all from 192.0.2.0/24    to any in recv em0
add 657 deny all from 204.152.64.0/23 to any in recv em0
add 658 deny all from 224.0.0.0/3     to any in recv em0

### запрещаем MS/Windows сервисы и Netbios службы
### 81=hosts2, 113=ident, 137=name, 138=datagram, 139=session
add 660 deny tcp from any to any 81  in recv em0
add 661 deny tcp from any to any 113 in recv em0
add 662 deny tcp from any to any 137 in recv em0
add 663 deny tcp from any to any 138 in recv em0
add 664 deny tcp from any to any 139 in recv em0

### запрещаем любые фрагментированные пакеты
add 670 deny all from any to any frag in recv em0

### запрещаем не соответствующие динамической таблице правил ACK пакеты
add 680 deny tcp from any to any established in recv em0

### разрешаем входящий трафик
#add 700 allow tcp from any to me 22,80,443 in recv em0 setup limit src-addr 2

### разрешаем входящий трафик для SSH
add 701 allow tcp from any to me 22 in recv em0 setup limit src-addr 2

### разрешаем входящий трафик для HTTP
add 702 allow tcp from any to me 80 in recv em0 setup limit src-addr 3

### разрешаем входящий трафик для HTTPS
add 703 allow tcp from any to me 443 in recv em0 setup limit src-addr 5

### ========================== ПРОБРОС ТРАФИКА =========================== ###

### делаем проброс в LAN за NAT для входящего трафикка
#add 720 skipto 800 tcp from any to any 3389,8080 in recv em0 setup limit src-addr 2

### делаем проброс в LAN за NAT для входящего трафикка RDP
add 721 skipto 800 tcp from any to any 3389 in recv em0 setup limit src-addr 1

### делаем проброс в LAN за NAT для входящего трафикка HTTP:8080
add 722 skipto 800 tcp from any to any 8080 in recv em0 setup limit src-addr 3

### отбрасываем и заносим в журнал все неразрешенные входящие соединения из глобальной сети
add 750 deny log all from any to any in recv em0

### отбрасываем и заносим в журнал все неразрешенные исходящие соединения в глобальную сеть
add 751 deny log all from any to any out xmit em0

### трансляция исходящих пакетов
### место для skipto в правилах с сохранением состояния для соединений
add 800 nat 1 ip4 from any to any out xmit em0
add 801 allow all from any to any

### всё остальное запрещено по умолчанию
### запрещаем и заносим в журнал все пакеты для дальнейшего анализа
add 999 deny log all from any to any

### ============================ END OF FILE ============================= ###


обращаю внимание на следующие моменты

входящий трафик на порты 22 80 и 443 это трафик предназначенный для самого сервера (шлюза)
трафик на порты 3389 и 8080 - пробрасываемый за NAT в локальную сеть

правила для входящего трафика (не пробрасываемого!) имеют отличный синтаксис от
секции с пробрасываемым трафиком: any to me в отличии от any to any и skipto

правила можно группировать по портам, но в таком случае мы лишаемся гибкости
задавать раздельные ограничения (limit) на количество соединений от одного хоста
и придётся довольствоваться некоторым средним значением

в данном листинге в конфигурации nat отсутствует deny_in
это принципиально, в противном случае не будет работать секция для входящего трафика
(не редиректа, он будет продолжать работать, как верно было подмечено выше)

если хочется сохранить deny_in то нужно секцию правил для входящего трафика (700-703)
разместить выше правила 300 для nat входящих пакетов
например под номерами 250-253

ограничение скорости лучше реализовать после того как будут отфильтрованы ненужные пакеты,
а уж потом нарезать полосы пропускания у оставшихся

можешь поиграться с net.inet.ip.fw.one_pass повключть и повыключать его прямо из листинга, после сброса правил,
но повторюсь, без пайпов это ни на что не влияет

хотя тут => https://ctopmbi4.wordpress.com/2013/11/12/nat-one_pass/
привязывают к нату, у меня сомнения

может проверка на стенде с локальными адресами не совсем корректно происходит?
или на реальных адресах?

Ответить | Правка | ^ к родителю #24 | Наверх | Cообщить модератору

28. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 25-Апр-17, 00:17 
> хм.. по идее эта переменная ни на что не влияет, кроме как
> на пайпы dummynet и узлы ng_ipfw

Эта переменная влияет на правила nat так же как и на правила dummynet.
И эти правила с переменной sysctl net.inet.ip.fw.one_pass=1 работать у вас не будут, хотя вы сказали, что "проверено".

> возможно я и сам тумана напустил в комментах в своём примере ))

Что есть, то есть. И еще вы ни разу не разбирались в том, о чем писал я.

> в данном листинге в конфигурации nat отсутствует deny_in
> это принципиально, в противном случае не будет работать секция для входящего трафика
> (не редиректа, он будет продолжать работать, как верно было подмечено выше)

Секция для входящего трафика будет работать с параметром deny_in, если к конфигурации nat добавить параметр "redirect_port tcp 1.2.3.4:22 22 redirect_port tcp 1.2.3.4:80 80" и т.д...
> если хочется сохранить deny_in то нужно секцию правил для входящего трафика (700-703)
> разместить выше правила 300 для nat входящих пакетов
> например под номерами 250-253

.. и не нужно будет портить структуру конфига

> ограничение скорости лучше реализовать после того как будут отфильтрованы ненужные пакеты,
> а уж потом нарезать полосы пропускания у оставшихся

Ограничение скорости можно даже организовать в обе стороны. Структура конфига об этом "кричит".

> можешь поиграться с net.inet.ip.fw.one_pass повключть и повыключать его прямо из листинга,
> после сброса правил,
> но повторюсь, без пайпов это ни на что не влияет

Правила эти будут работать при условии, что переменная sysctl net.inet.ip.fw.one_pass=0.
В оригинальном примере правил из хэндбука об этом ничего не говорится, т.к. там используется демон natd и не используется dummynet (который, к слову сказать, как и "ipfw nat", работает в ядре), а sysctl net.inet.ip.fw.one_pass дефолтно равна 1.

Ответить | Правка | ^ к родителю #26 | Наверх | Cообщить модератору

30. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от михалыч (ok) on 25-Апр-17, 18:02 
> Эта переменная влияет на правила nat так же как и на правила dummynet.
> И эти правила с переменной sysctl net.inet.ip.fw.one_pass=1 работать у вас не будут,
> хотя вы сказали, что "проверено".

да, проверено, с natd действительно работает

каюсь, с nat проверить сейчас возможности нет, возможно завтра, самому интересно стало ))

по идее, и natd и nat используют libalias, да, kernel nat производительнее,
но в остальном.. да там даже синтаксис правил очень схож

к тому же, в
man ipfw | grep -A2 -B3 reinjected

говорится о пайпах и ничего не говорится о nat, выходит врёт, подлец? ))

я ж недаром привёл линк https://ctopmbi4.wordpress.com/2013/11/12/nat-one_pass/
у меня проверить достоверность этого заявления в данный момент нет
проверьте сами

> И еще вы ни разу не разбирались в том, о чем писал я.

это в чём же?
в первом посте https://www.opennet.me/openforum/vsluhforumID1/96869.html#0
ерунда написана
$cmd 600 tcp from any to 10.1.10.12 25,443 in via em0 setup keep-state
непонятно, что делает это правило - где allow или deny ??
это правило вообще работать не будет

про https://www.opennet.me/openforum/vsluhforumID1/96869.html#18
я уже писал - для чего нат вызывать 4 раза, когда можно обойтись 2-мя ??

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

> Секция для входящего трафика будет работать с параметром deny_in, если к конфигурации
> nat добавить параметр "redirect_port tcp 1.2.3.4:22 22 redirect_port tcp 1.2.3.4:80 80" и т.д...
> .. и не нужно будет портить структуру конфига

странный у нас диалог происходит
вот смотрите: я вам говорю, что дважды два - четыре
а вы мне отвечаете: нет, трижды пять - пятнадцать!

ну да, то что вы написали сработает, но вы тем самым в угоду сохранения deny_in
делаете проброс трафика предназначенного для сервисов самого шлюза!!
это моветон чистой воды, зачем так извращаться?

то есть представим себе следующее


----------------------   --------------------------------------------------   -------
| LAN 192.168.1.0/24 |---| 192.168.1.1/32 <=> fxp0 ROUTER <=> em0 X.X.X.X |---| WAN |
----------------------   --------------------------------------------------   -------

и вы делаете на 192.168.1.1/32 редирект для ssh и http трафика предназначенного для роутера!!
то есть для этого, тем самым, используете nat дважды - на in и out

можно обойтись без ната и отправить трафик для роутера напрямую

указанный адрес 1.2.3.4 в примере выше это, насколько я понимаю, внутренний адрес роутера
(в моём примере 192.168.1.1/32)

нет, ну, вероятно, можно гланды удалять и через задний проход,
но, думаю, что напрямую, через рот, оно как то удобнее будет

> Ограничение скорости можно даже организовать в обе стороны. Структура конфига об этом "кричит".

уж не знаю, кто там и что там кричит, однако, хочу заметить, что по большому счёту,
влиять мы можем на скорость только исходящую, на входящую увы..
не можем заставить удалённую сторону снизить скорость

Ответить | Правка | ^ к родителю #28 | Наверх | Cообщить модератору

27. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от Аноним (??) on 24-Апр-17, 20:33 
> Ok, скажите, что у вас с переменной sysctl net.inet.ip.fw.one_pass (конкретно с kernel
> nat, natd меня не интересует)?

если используешь стенд с серыми адресами
убери все правила до 100 (если скопировал их из примера)
и убери из конфигурации нат unreg_only (опять же, если есть)

Ответить | Правка | ^ к родителю #24 | Наверх | Cообщить модератору

29. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok) on 25-Апр-17, 00:22 
> если используешь стенд с серыми адресами
> убери все правила до 100 (если скопировал их из примера)
> и убери из конфигурации нат unreg_only (опять же, если есть)

Параметр unreg_only предписывает проводить маскировку только для тех исходящих пакетов, чей адрес отправителя находится в классах "незарегистрированных" IP адресов.
Так что в данном случае можно смело использовать параметр unreg_only.

Ответить | Правка | ^ к родителю #27 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру