Страница 1 из 2

IPFW + natd

Добавлено: 2008-06-26 14:15:43
$Alchemist
FreeBSD 7.0, IPFW, natd, squid 2.6...
В ядре есть:

Код: Выделить всё

options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=100
options         IPFIREWALL_FORWARD
options         IPDIVERT 
options         DUMMYNET
options         IPFIREWALL_DEFAULT_TO_ACCEPT
Правила:

Код: Выделить всё

#!/bin/sh

# при работе по SSH, чтобы перечитать конфиг набирать nohup sh /etc/rules

# Прежде, чем мы начнем, сбросим список
ipfw -q -f flush

# Установим префикс команды для набора правил
cmd="ipfw -q add"
skip="skipto 800"
wanip="xxx.xxx.xxx.xxx" # внешний IP
lannet="192.168.0.0/24" # внутренняя сеть

# Нет запретов внутри интерфейса смотрящего в локальную сеть
$cmd 005 allow all from any to any via re0

# Нет ограничений на Loopback интерфейсе
$cmd 010 allow all from any to any via lo0

# Отправляем всех на прозрачный прокси
#$cmd 011 fwd 127.0.0.1,3129 tcp from $lannet to any 80

# проверяем если пакет входящий и транслирован ли он
$cmd 014 divert natd ip from any to any in via rl0

# Позволяем пакету проходить, если предыдущий был добавлен
#в "динамическую" таблицу правил с разрешением состояния keep-state.
$cmd 015 check-state

#################################################################
# Интерфейс смотрящий в интернет (Исходящая секция)
#################################################################

# Разрешаем исходящий доступ к DNS провайдера.
$cmd 020 $skip tcp from $lannet to any 53 out via rl0 setup keep-state

# Allow ICQ
$cmd 035 $skip tcp from $lannet to any 5190 out via rl0 setup keep-state

# Разрешаем http запросы в обход сквида
$cmd 040 $skip tcp from $lannet to any 80 out via rl0 setup keep-state

# Разрешаем https запросы в обход сквида
$cmd 050 $skip tcp from $lannet to any 443 out via rl0 setup keep-state

# Разрешаем исходящий RDP
$cmd 050 $skip tcp from $lannet to any 3389 out via rl0 setup keep-state

# Разрешаем функцию отправки и приема почты
$cmd 060 $skip tcp from $lannet to any 25 out via rl0 setup keep-state
$cmd 061 $skip tcp from $lannet to any 110 out via rl0 setup keep-state

# Разрешаем полный доступ с локалхоста под рутом
$cmd 070 $skip tcp from me to any out via rl0 setup keep-state uid root

# Пытаемся выпустить запросы от сквида
$cmd 071 $skip tcp from me to any 80 out via rl0

# Разрешаем исходящий пинг
$cmd 080 $skip icmp from any to any out via rl0 keep-state

# Эта функция используется SSH
$cmd 110 $skip tcp from any to any 22 out via rl0 setup keep-state

# Разрешаем прохождение пакетов до ntp time server
$cmd 130 $skip udp from $lannet to any 123 out via rl0 keep-state

#################################################################
# Интерфейс смотрящий в Internet (Входящая секция)
# Опрашиваем запросы начала сессии идущие из Интернета
# в локальную сеть или к гейту
#################################################################

# Запрещаем весь входящий траффик из зарезервированных адресных пространств
$cmd 300 deny all from 192.168.0.0/16  to any in via rl0  #RFC 1918 private IP
$cmd 301 deny all from 172.16.0.0/12   to any in via rl0  #RFC 1918 private IP
$cmd 302 deny all from 10.0.0.0/8      to any in via rl0  #RFC 1918 private IP
$cmd 303 deny all from 127.0.0.0/8     to any in via rl0  #loopback
$cmd 304 deny all from 0.0.0.0/8       to any in via rl0  #loopback
$cmd 305 deny all from 169.254.0.0/16  to any in via rl0  #DHCP auto-config
$cmd 306 deny all from 192.0.2.0/24    to any in via rl0  #reserved for docs
$cmd 307 deny all from 204.152.64.0/23 to any in via rl0  #Sun cluster
$cmd 308 deny all from 224.0.0.0/3     to any in via rl0  #Class D & E multicast

# Запрещаем ident
$cmd 315 deny tcp from any to any 113 in via rl0

# Запрещаем весь сервис Netbios. 137=имя, 138=дейтаграмма, 139=сессия
# Netbios это сервис общего доступа MS/Windows .
# Блокируем MS/Windows hosts2 name server requests 81
$cmd 320 deny tcp from any to any 137 in via rl0
$cmd 321 deny tcp from any to any 138 in via rl0
$cmd 322 deny tcp from any to any 139 in via rl0
$cmd 323 deny tcp from any to any 81  in via rl0

# Запрещаем пакеты прибывшие позже
$cmd 330 deny all from any to any frag in via rl0

# Запрещаем ACK пакеты которые не совпадают с динамической таблицей правил
$cmd 332 allow tcp from any to any established in via rl0

# разрешаем некоторые типы ICMP траффика - эхо-запрос,
# эхо-ответ и время жизни пакета истекло
$cmd 360 allow icmp from any to $wanip in via rl0 icmptypes 0,8,11

# Разрешаем входящую www функцию
$cmd 370 allow tcp from any to $wanip 80 in via rl0 setup limit src-addr 2

# Разрешаем входящие безопасные SSH
$cmd 380 allow tcp from any to $wanip 2211 in via rl0 setup limit src-addr 2

# Разрешаем входящую почту
$cmd 390 allow tcp from any to $wanip 25 in via rl0 setup limit src-addr 2

# Разрешаем входящую почту
$cmd 390 allow tcp from any to $wanip 110 in via rl0 setup limit src-addr 2

# Разрешаем RDP
#$cmd 395 allow tcp from any to $wanip 3389 in via rl0 setup limit src-addr 2

# Разрешаем RAdmin
$cmd 395 allow tcp from any to $wanip 50505 in via rl0 setup limit src-addr 2

# Отбрасываем и протоколируем все входящие пакеты из внешнего мира
#$cmd 400 deny log all from any to any in via rl0

# # Отбрасываем и протоколируем все исходящие пакеты во внешний мир
#$cmd 450 deny log all from any to any out via rl0

# Местоположение skipto для исходящих правил состояния
$cmd 800 divert natd ip from $lannet to any out via rl0
$cmd 801 allow ip from any to any

# Режем все лишнее нах!
$cmd 999 deny log all from any to any
Суть вопроса: если активировать правила 400 и 450 - то весь трафик блокируется, а если их не активировать, то получается проходной двор (правило 801).
Заранее благодарен за содействие!

Re: IPFW + natd

Добавлено: 2008-06-26 14:36:50
dikens3

Re: IPFW + natd

Добавлено: 2008-06-27 19:15:38
$Alchemist
Спасибо, читал...

Перепробовал кучу разных вариантов, пробовал kernel nat, все сводится к одной проблеме:
К примеру, разрешаю только исходящий трафик на 80 порт, происходит соединение и в ответ отправляется пакет мне обратно.
У меня естественно входящий доступ закрыт. Пакет отбивается и исходящего соединения не происходит =\
Как заставить ipfw понять что входящий пакет - это ответ на мой запрос и пропускать такие вещи?!

Re: IPFW + natd

Добавлено: 2008-06-27 19:20:11
paradox
изучить фаревол от и до
как работает
каике политики бывают
как обычно строиться
итд
а новичкам нат я бы рекомендовал поднимать на ipnat вместо natd

Re: IPFW + natd

Добавлено: 2008-06-27 19:24:55
alex3
гм... а если почитать сам rc.firewall умолчальный... и посмыслить над порядком правил? я не претендую, просто - вдруг поможет.
paradox - плохому не учи...

Re: IPFW + natd

Добавлено: 2008-06-27 19:28:38
paradox
ты насчет natd ?
так его сложно поднимать
не каждый новичек поймет что такое divert
а ipnat
поднимаеться двумя строчками
kldload
и ipnat -f /etc/
итд

для новичков пойдет


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

и таких примеров много = ))

Re: IPFW + natd

Добавлено: 2008-06-27 19:35:36
alex3
я, когда был новичком, полгода вмысливал /etc/rc.firewall, а потом взял и написал то, что мне нужно.... заработало раза с пятого ;-)

Re: IPFW + natd

Добавлено: 2008-06-27 19:38:15
paradox
статья для новичков есть где то на опеннете
там очень неплохо расписано как пакеты гуляют по ipfw
нужно если на нее копилефта нет
сюда добавить
либо линками как то пинать

Re: IPFW + natd

Добавлено: 2008-06-27 21:33:16
$Alchemist
Проблему установки соединения должны решить keep-state, но что-то не помню, чтобы через нат эта схема у меня корректно отрабатывала... :(

Re: IPFW + natd

Добавлено: 2008-06-28 0:09:16
$Alchemist
Правила с keep-state попадают в динамическую таблицу, в дефолтное запрещающее правило ничего не попадает, в журнале запретов нет, но соединений не происходит! :st:

Re: IPFW + natd

Добавлено: 2008-06-28 0:32:43
paradox
видать барьер с divert побороть немогут = )))

Re: IPFW + natd

Добавлено: 2008-06-28 8:37:04
dikens3
Автор, посмотрите мой пример с ICMP и проследите по каким правилам идёт и возвращается пакет.
# Разрешаем исходящий доступ к DNS провайдера.
$cmd 020 $skip tcp from $lannet to any 53 out via rl0 setup keep-state
Лично мне не очень понятно действие этой конструкции.(я понимаю что она должна делать, а вот что будет не понимаю. Эксперимент нужен, по типу моего, по приведённой ссылке)

Короче, какое создаётся динамическое правило в момент срабатывания этого правила? Наверное allow, а не skip.. Тем самым при повторном срабатывании на правиле с check-state будет выполнено allow (а не переход к divert). Вобщем хз, только предположения.

Re: IPFW + natd

Добавлено: 2008-06-28 22:58:17
$Alchemist
Вобщем правила уже отточены, вроде как, до идеала, пакеты направляются куда нужно, но соединения не происходит:

Код: Выделить всё

mail# ipfw -de show
00001 837 174180 allow ip from any to any established
00020   3    144 allow ip from any to any via re0
00030   0      0 allow ip from any to any via lo0
00035   0      0 divert 8668 ip from any to any in via rl0
00040   0      0 allow icmp from any to any keep-state
00050   0      0 allow udp from any to any dst-port 53 out via rl0
00060   0      0 allow udp from any 53 to any in via rl0
00099   0      0 allow ip from me to any out via rl0 setup keep-state
00100   3    144 skipto 400 tcp from 192.168.0.0/24 to any dst-port 80 out via rl0 setup keep-state
00200   0      0 allow tcp from any to 213.221.11.22 dst-port 80 in via rl0 setup limit src-addr 2
00210   0      0 allow tcp from any to 213.221.11.22 dst-port 22 in via rl0 setup limit src-addr 2
00220   0      0 allow tcp from any to 213.221.11.22 dst-port 25 in via rl0 setup limit src-addr 2
00230   0      0 allow tcp from any to 213.221.11.22 dst-port 110 in via rl0 setup limit src-addr 2
00300   0      0 deny log logamount 300 ip from any to any
00400   3    144 divert 8668 ip from any to any out via rl0
00410   3    144 allow ip from any to any
00999   0      0 deny log logamount 300 ip from any to any
65535   0      0 allow ip from any to any
## Dynamic rules (2):
00100   1     48 (19s) STATE tcp 192.168.0.120 4379 <-> 213.180.204.11 80
00100   0      0 (15s) STATE tcp 192.168.0.120 4377 <-> 213.180.204.11 80

Re: IPFW + natd

Добавлено: 2008-06-28 23:11:14
paradox
вот 1000 раз говорил
неюзайте divert если не понимаете как он работает

tcpdump в зубы!
и logamount на ipfw
man nc

особенно вникните в 100 правило

Re: IPFW + natd

Добавлено: 2008-06-28 23:21:02
alex3
man nc
Norton Commander? :cz2:

Re: IPFW + natd

Добавлено: 2008-06-28 23:24:08
paradox
man 1 nc
netcat

Re: IPFW + natd

Добавлено: 2008-06-29 0:02:14
$Alchemist
paradox писал(а):вот 1000 раз говорил
неюзайте divert если не понимаете как он работает
это не наш метод
я изначально многое не понимал, но продолжал упорно разбираться и это приносило свои результаты...
paradox писал(а): tcpdump в зубы!
спасибо, посмотрю т.к. по логам полной картины не видно
paradox писал(а):и logamount на ipfw
а это как понимать?
paradox писал(а):man nc
в общих чертах понял что за зверь, но для каких целей мне его можно применить не понял :unknown:
paradox писал(а): особенно вникните в 100 правило
Понимаю его так:
исходящие пакеты из локальной сети на порт 80 перенаправляются в правило 800, где происходит трансляция NAT
при этом устанавливается соединение между исходящим адресом и адресом назначения (setup keep-state)

Re: IPFW + natd

Добавлено: 2008-06-29 0:31:38
paradox
вот изза не понимания 100 правила и диверта
у вас и появляються тараканы
а точнее отсутвуют

nc нужен что бы вы присоеденились на порт natd и увидели что там происходит
либо включили natd.conf debug

я вообще не понимаю что вы пытались сделать 100 правилом
я бы его вообще прибил
смысла оно не несет

пересмотрите свой фаер
а еще лучше переделайте его

Re: IPFW + natd

Добавлено: 2008-06-29 0:42:33
paradox
чуть не забыл

Код: Выделить всё

ps ax| grep natd
покажите
а то может порт natd никто и не обслуживает

Re: IPFW + natd

Добавлено: 2008-06-29 0:55:47
$Alchemist
paradox писал(а):чуть не забыл

Код: Выделить всё

ps ax| grep natd
покажите
а то может порт natd никто и не обслуживает
перезагрузил сервак с natd_flags="-mu" и он ушел в аут... :crazy: :pardon:
в понедельник с утра приеду на работу, верну его к жизни и покажу.
но на память, sockstat выдавал инфу по natd...

Re: IPFW + natd

Добавлено: 2008-06-29 0:59:55
paradox
sockstat не показывает информацию о том как и куда идет пакет и как он переписан
а использование divert при его непонимании
вы токо что убедились к чему приводит

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

Re: IPFW + natd

Добавлено: 2008-06-29 8:03:01
dikens3

Код: Выделить всё

00001 837 174180 allow ip from any to any established
Мля..... Ну а где divert (nat) до этого правила? Думаете что divert нужен только для SYN пакета, а для остальных нет?
Данное правило стоит не в том месте и вообще в изначальном примере его небыло, откуда оно взялось?

Самому не показалось странным, что входящие пакеты не попадают в нат?

Код: Выделить всё

00035   0      0 divert 8668 ip from any to any in via rl0

Re: IPFW + natd

Добавлено: 2008-06-29 8:04:12
Alex Keda
ipfw - единственный файрволл с челоеческим лицом

Re: IPFW + natd

Добавлено: 2008-06-29 19:36:23
$Alchemist
dikens3 писал(а):

Код: Выделить всё

00001 837 174180 allow ip from any to any established
Мля..... Ну а где divert (nat) до этого правила? Думаете что divert нужен только для SYN пакета, а для остальных нет?
Данное правило стоит не в том месте и вообще в изначальном примере его небыло, откуда оно взялось?

Самому не показалось странным, что входящие пакеты не попадают в нат?

Код: Выделить всё

00035   0      0 divert 8668 ip from any to any in via rl0
Делал по переводу хэндбука http://www.lissyara.su/?id=1356, последний скрипт.
Это правило вставил для того, чтобы меня не отрубало по SSH после применения скрипта с правилами.
Да и вообще, входящий нат мне по сути и не нужен т.к. пробросом портов на внутренние серваки у меня занимается rinetd

Re: IPFW + natd

Добавлено: 2008-06-29 20:51:38
Nix86
$Alchemist писал(а):
dikens3 писал(а):

Код: Выделить всё

00001 837 174180 allow ip from any to any established
Мля..... Ну а где divert (nat) до этого правила? Думаете что divert нужен только для SYN пакета, а для остальных нет?
Данное правило стоит не в том месте и вообще в изначальном примере его небыло, откуда оно взялось?

Самому не показалось странным, что входящие пакеты не попадают в нат?

Код: Выделить всё

00035   0      0 divert 8668 ip from any to any in via rl0
Делал по переводу хэндбука http://www.lissyara.su/?id=1356, последний скрипт.
Это правило вставил для того, чтобы меня не отрубало по SSH после применения скрипта с правилами.
Да и вообще, входящий нат мне по сути и не нужен т.к. пробросом портов на внутренние серваки у меня занимается rinetd
:smile: Входящий nat нужен. divert - это не проброс портов)