The OpenNET Project / Index page

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



Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Firewall, Фильтрация пакетов / FreeBSD)
Режим отображения только ответов первого уровня [ Отслеживать ]

Оглавление

IPFW NAT - порядок прохождения правил, neekonoff (ok), 17-Апр-17, (0) [смотреть все] –1

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


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

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


Ответить | Правка | Наверх | Cообщить модератору
есть ответы, показать

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

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

Ответить | Правка | Наверх | Cообщить модератору
есть ответы, показать

13. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от михалыч (ok), 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. проверяем

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


Ответить | Правка | Наверх | Cообщить модератору
есть ответы, показать

18. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от neekonoff (ok), 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-адрес_инициатора:какой-то_порт", трафик выпускается наружу.

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

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

Ответить | Правка | Наверх | Cообщить модератору
есть ответы, показать

21. "IPFW NAT - порядок прохождения правил"  +/
Сообщение от михалыч (ok), 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 ! ))

такие дела

Ответить | Правка | Наверх | Cообщить модератору
есть ответы, показать

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

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




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

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