freebsd_10: ipfw + nat + dynamic_rules = не_работет

FreeBSD, NetBSD, OpenBSD, DragonFly и т. д.

Модератор: arachnid

Ответить
DoggoD
Сообщения: 71
ОС: debian, centos, freebsd

freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение DoggoD »

коллеги, приветствую!!
помогите разобраться: не получается выпустить машину в интернет..
дано: сервер freebsd с GENERIC ядром, фаервол ipfw, нат natd..

Код:

root@server:~ # uname -a FreeBSD server 10.2-RELEASE FreeBSD 10.2-RELEASE #0 r286666: Wed Aug 12 15:26:37 UTC 2015 root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC amd64


Код:

root@server:~ # cat /etc/rc.conf hostname="server" #ИНТЕРФЕЙС В ЛОКАЛЬНУЮ СЕТЬ ifconfig_re0="inet 192.168.0.1 netmask 255.255.255.0" #ИНТЕРФЕЙС В ISP1 ifconfig_rl0="inet 111.111.111.111 netmask 255.255.255.252" #ИНТЕРФЕЙС В ISP2 ifconfig_rl1="inet 222.222.222.222 netmask 255.255.255.252" defaultrouter="111.111.111.110" gateway_enable="YES" natd_enable="YES" natd_flags="-f /etc/natd.conf" firewall_enable="YES" firewall_type="/etc/firewall.conf" named_enable="YES" sshd_enable="YES"


Код:

root@server:~ # cat /etc/natd.conf instance default interface rl0 port 8668 use_sockets yes same_ports yes instance rl1 interface rl1 port 8669 use_sockets yes same_ports yes globalport 8670


никак не могу заставить ходить машину 192.168.0.3 в интернет через сервер

Код:

root@server:~ # cat /etc/firewall.conf add 1000 check-state add allow udp from me to any 53 keep-state add allow tcp from 192.168.0.2 to 192.168.0.1 22 setup keep-state add divert 8668 ip from any to any add allow ip from 192.168.0.3 to any keep-state


счетчики по правилам вроде как считают

Код:

root@server:~ # ipfw show 00100 11 664 allow ip from any to any via lo0 00200 0 0 deny ip from any to 127.0.0.0/8 00300 0 0 deny ip from 127.0.0.0/8 to any 00400 0 0 deny ip from any to ::1 00500 0 0 deny ip from ::1 to any 01000 0 0 check-state 01100 38 9984 allow udp from me to any dst-port 53 keep-state 01200 485 44462 allow tcp from 192.168.0.2 to 192.168.0.1 dst-port 22 setup keep-state 01300 34 2701 divert 8668 ip from any to any 01400 68 12178 allow ip from 192.168.0.3 to any keep-state 65535 20877 2529405 deny ip from any to any


при этом с таким правилом машина 192.168.0.3 в интернет ходит нормально

Код:

root@server:~ # cat /etc/firewall.conf add divert 8668 ip from any to any add allow ip from any to any

что-то упустил из вида, но никак не посещает меня озарение что именно..
прошу помощи у вас..
Debian 5.0 Lenny, 2.6.26-1-686, KDE 3.5.10.
Asus P5E-VM SE, e8400.
Спасибо сказали:
lazhu
Сообщения: 70
ОС: FreeBSD 9-STABLE / clang 3.3
Контактная информация:

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение lazhu »

Правило для ната переделайте в out на нат-интерфейсе и добавьте такое же правило in перед check-state
А вообще правильнее всего убрать допотопный натд и запустить ядерный нат. Модулем:

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

# kldload ipfw_nat
# kldload libalias
, либо пересобрать ядро с соответствующими опциями.
Далее man ipfw вам в помощь.
Спасибо сказали:
DoggoD
Сообщения: 71
ОС: debian, centos, freebsd

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение DoggoD »

lazhu писал(а):
21.12.2015 09:30
Правило для ната переделайте в out на нат-интерфейсе и добавьте такое же правило in перед check-state
А вообще правильнее всего убрать допотопный натд и запустить ядерный нат. Модулем:

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

# kldload ipfw_nat
# kldload libalias
, либо пересобрать ядро с соответствующими опциями.
Далее man ipfw вам в помощь.


по вашему совету переделал правила для ната в указанных местах, однако результат не изменился, НО я внял вашему совету и решил опробовать ipfw кернел нат..
с ходу добился возможности в STATEFUL режиме натить пакеты изнутри наружу

Код:

root@server:~ # cat /etc/firewall.conf nat 1 config log if rl0 reset same_ports deny_in add nat 1 ip from any to any via rl0 add check-state add allow tcp from 192.168.0.2 to 192.168.0.1 22 setup keep-state add allow tcp from 192.168.0.3 to any setup keep-state add allow udp from 192.168.0.3 to 192.168.0.1 53 keep-state

а это уже весьма обнадеживает..
как закончу с конфигом, то запосчу свой кейс и решение тут..
спасибо за инфу про ядерный нат, lazhu
Debian 5.0 Lenny, 2.6.26-1-686, KDE 3.5.10.
Asus P5E-VM SE, e8400.
Спасибо сказали:
lazhu
Сообщения: 70
ОС: FreeBSD 9-STABLE / clang 3.3
Контактная информация:

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение lazhu »

Если нат сконфигурирован с deny_in, зачем вообще стэйты?
Спасибо сказали:
DoggoD
Сообщения: 71
ОС: debian, centos, freebsd

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение DoggoD »

lazhu писал(а):
22.12.2015 14:57
Если нат сконфигурирован с deny_in, зачем вообще стэйты?

это просто черновой вариант, который решил озвученную в топе проблему.. вообще кейс у меня достаточно стандартный, но шире, чем описано в топе..
как сформирую решение -- оставлю его тут..
Debian 5.0 Lenny, 2.6.26-1-686, KDE 3.5.10.
Asus P5E-VM SE, e8400.
Спасибо сказали:
DoggoD
Сообщения: 71
ОС: debian, centos, freebsd

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение DoggoD »

коллеги, итого:
благодаря подсказке товарища lazhu о кернел нат я добился успешного решения по следующему кейсу:
КЕЙС:

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

1. сервер с тремя сетевыми интерфейсами
re0: 192.168.0.1/24 - смотрит в локальную сеть
rl0: 111.111.111.111/30 - ISP основной канал
rl1: 222.222.222.222/30 - ISP резервный канал
2. смена канала происходит путем замены default route без необходимости производить дополнительные манипуляции
3. возможность ограничивать доступ по ip и по портам как для входящих setup , так и для исходящих setup соединений

в общем-то, как я и говорил, достаточно стандартный кейс, однако решение по которому с ходу не нагуглил.
РЕШЕНИЕ:

root@server:~ # uname -srm

FreeBSD 10.2-RELEASE amd64


root@server:~ # cat /boot/loader.conf

ipfw_load="YES" #вообще указывать это не обязательно, т.к. подгрузится в любом случае как зависимость libalias_load="YES" # для работы ната, указывать это не обязательно, т.к. подгрузится в любом случае как зависимость ipfw_nat_load="YES" # для работы ната


root@server:~ # cat /etc/rc.conf

hostname="server" ifconfig_re0="inet 192.168.0.1 netmask 255.255.255.0" ifconfig_rl0="inet 111.111.111.111 netmask 255.255.255.252" ifconfig_rl1="inet 222.222.222.222 netmask 255.255.255.252" defaultrouter="111.111.111.110" gateway_enable="YES" firewall_enable="YES" firewall_type="/etc/firewall.conf" firewall_nat_enable="YES" rinetd_enable="YES" # в моем случае для перенаправления http трафика на http сервер за натом в локальную сеть named_enable="YES" sshd_enable="YES"


root@server:~ # cat /usr/local/etc/rinetd.conf

111.111.111.111 80 192.168.0.10 80 # собственно 192.168.0.10 -- http сервер, который должен обслуживать клиентов извне. перенаправляем трафик с 80 порта внешнего интерфейса на 80 порт http сервера


root@server:~ # cat /etc/firewall.conf

# собственно конфиг натов nat 1 config if rl0 log deny_in same_ports unreg_only nat 2 config if rl1 log deny_in same_ports unreg_only #что разрешаем add allow tcp from DOMIC_V_DEREVNE to 111.111.111.111 22 setup keep-state # разрешаем коннект к ssh серверу извне только по признаку правильного "домашнего" ip адреса add allow tcp from DOMIC_V_DEREVNE to 222.222.222.222 22 setup keep-state add allow tcp from any to 111.111.111.111 80 setup limit src-addr 10 # разрешаем извне подключение на http порт и ограничиваем кол-во динамических правил каждому уникальному клиенту в 10 штук add allow tcp from 192.168.0.2 to 192.168.0.1 22 setup keep-state # разрешаем коннект для 192.168.0.2 к ssh серверу в локалке add allow tcp from 192.168.0.3 to any 80 via re0 # разрешаем машине 192.168.0.3 глобальный доступ по http add allow tcp from 192.168.0.0/24 to any 443 via re0 # разрешаем всей локальной сети глобальный доступ по https add allow udp from 192.168.0.0/24 to 192.168.0.1 53 via re0 keep-state # разрешаем всей локальной сети работать с поднятым на сервере DNS add allow tcp from 192.168.0.1 to 192.168.0.10 80 setup keep-state # это для того, чтобы http сервер смог разговаривать с внешними клиентами # перенаправляем трафик попавший на внешний интерфейс по правильному нату add skipto 11000 ip from any to any via rl0 # для внешних обращений по основному каналу ISP add skipto 12000 ip from any to any via rl1 # для внешних обращений по резервному каналу ISP add 11000 nat 1 ip from any to any via rl0 keep-state add 11999 skipto 65000 ip from any to any add 12000 nat 2 ip from any to any via rl1 keep-state add 12999 skipto 65000 ip from any to any add 65535 deny ip from any to any # запрет всего, что не предусмотрено правилами выше.. указывать не обязательно т.к правило является дефолтным для закрытого типа ipfw


root@server:~ #

route flush route add default 222.222.222.221 # переходим на резервный канал ISP


root@server:~ #

route flush route add default 111.111.111.110 # переходим на основной канал ISP соответственно


автоматизацию перехода с основного на резервный канал тут я рассматривать не стану..
данное решение стоит воспринимать как концепт и не более того (хотя оно и является полностью рабочим), т.к. тут не указаны полезности типа ведения логов, некоторые фичи для повышения безопасности типа "deny ... frag" и наверняка многих других нужных вещей..
НО старт положен, с него, пожалуй, и начну развивать конфиг дальше..
всем спасибо
Debian 5.0 Lenny, 2.6.26-1-686, KDE 3.5.10.
Asus P5E-VM SE, e8400.
Спасибо сказали:
lazhu
Сообщения: 70
ОС: FreeBSD 9-STABLE / clang 3.3
Контактная информация:

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение lazhu »

Забудьте про кип-стейт, как про страшный сон (тем более, что чек убрали :D )
При nat deny_in никакие пакеты извне, для которых нет записи в нат-таблице, не пройдут
ЗЫ. А конфиг какой-то жесткий :mellow: Обычно локальный трафик разрешается весь
Спасибо сказали:
DoggoD
Сообщения: 71
ОС: debian, centos, freebsd

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение DoggoD »

lazhu писал(а):
24.12.2015 16:16
Забудьте про кип-стейт, как про страшный сон (тем более, что чек убрали :D )
При nat deny_in никакие пакеты извне, для которых нет записи в нат-таблице, не пройдут
ЗЫ. А конфиг какой-то жесткий :mellow: Обычно локальный трафик разрешается весь

повторюсь: воспринимать его стоит как концепт.. как кто-то его будет менять под свои нужды (если оно кому-то вообще нужно), это вопрос нужд и фантазий ))) НО конфиг полностью рабочий.. чек-стейт тут не нужен.. если уберете кип-стейт в любом месте, где он присутствует, работать перестанет..
да, у меня с денай-ин ничто не проходит кроме того, что я определил в секции "что разрешаем"..
по поводу "локальный трафик разрешается" это частность.. кто-то разрешает, а кто-то контролирует жестче..
я вот выбрал для себя именно стейтфул фаервол, так как есть возможность ставить limit, что может быть весьма полезным..
lazhu, а вы по какой причине предлагаете не использовать кип-стейт?
--
небольшой upd про "add check-state":
он был бы нужен в случае, если конструкция правил предполагает на высоком уровне какие-нибудь deny правила. без чек-стэйта deny правило отработает жестко, в то время как с чек-стэйтом пакет пройдет дальше по цепочке правил в поисках оных с опцией keep-state..
--
небольшая ремарка про "deny_in":
если в моем конфиге его убрать с натов, то все с наружи смогут ходить по всем доступным наружу портам без ограничений, т.к. сам нат у меня с опцией keep-state.. в общем-то я не нашел иного безопасного способа натить в stateful режиме, чем как в моем конфиге..
Debian 5.0 Lenny, 2.6.26-1-686, KDE 3.5.10.
Asus P5E-VM SE, e8400.
Спасибо сказали:
lazhu
Сообщения: 70
ОС: FreeBSD 9-STABLE / clang 3.3
Контактная информация:

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение lazhu »

Не нужны стэйты. Вообще совсем никак. Натится все any to any, все входящие запрещены. То, что надо открыть, открывается редиректами. Единственно возможный случай, когда могут потребоваться стэйты - это если надо ограничить число соединений. Для этого достаточно указать в правиле limit.
Спасибо сказали:
DoggoD
Сообщения: 71
ОС: debian, centos, freebsd

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение DoggoD »

lazhu писал(а):
25.12.2015 12:03
Не нужны стэйты. Вообще совсем никак. Натится все any to any, все входящие запрещены. То, что надо открыть, открывается редиректами. Единственно возможный случай, когда могут потребоваться стэйты - это если надо ограничить число соединений. Для этого достаточно указать в правиле limit.


именно -- limit..
и в тот момент как вы его указали (хотя бы раз, в любом месте) ipfw сразу же стал STATEFUL..
так почему стэйты не нужны? например: есть фаервол 1 и фаервол 2.. оба обеспечивают нужный уровень безопасности.. фаервол_1 = stateful, фаервол_2 = stateless.. почему из двух фаерволов вы предпочтете именно фаервол_2, lazhu?
открывается редиректами -- это как? можете привести пример?
Debian 5.0 Lenny, 2.6.26-1-686, KDE 3.5.10.
Asus P5E-VM SE, e8400.
Спасибо сказали:
lazhu
Сообщения: 70
ОС: FreeBSD 9-STABLE / clang 3.3
Контактная информация:

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение lazhu »

DoggoD писал(а):
26.12.2015 14:07
именно -- limit..
и в тот момент как вы его указали (хотя бы раз, в любом месте) ipfw сразу же стал STATEFUL..
так почему стэйты не нужны? например: есть фаервол 1 и фаервол 2.. оба обеспечивают нужный уровень безопасности.. фаервол_1 = stateful, фаервол_2 = stateless.. почему из двух фаерволов вы предпочтете именно фаервол_2, lazhu?
открывается редиректами -- это как? можете привести пример?

1. Зачем плодить лишние сущности?
2.

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

redirect_port <protocol> <ip>:<port> <port>
Это создает запись в нат-таблице, поэтому входящий пакет будет проходить.
Спасибо сказали:
DoggoD
Сообщения: 71
ОС: debian, centos, freebsd

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение DoggoD »

lazhu писал(а):
28.12.2015 16:27
DoggoD писал(а):
26.12.2015 14:07
именно -- limit..
и в тот момент как вы его указали (хотя бы раз, в любом месте) ipfw сразу же стал STATEFUL..
так почему стэйты не нужны? например: есть фаервол 1 и фаервол 2.. оба обеспечивают нужный уровень безопасности.. фаервол_1 = stateful, фаервол_2 = stateless.. почему из двух фаерволов вы предпочтете именно фаервол_2, lazhu?
открывается редиректами -- это как? можете привести пример?

1. Зачем плодить лишние сущности?
2.

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

redirect_port <protocol> <ip>:<port> <port>
Это создает запись в нат-таблице, поэтому входящий пакет будет проходить.

я вас понял..
конечно, конфиг вида

root@server:~ # cat /etc/firewall.conf

nat 1 config if rl0 deny_in same_ports nat 2 config if rl1 deny_in same_ports #add allow tcp from any to 111.111.111.111 80 setup limit src-addr 10 # если хотим ограничивать add allow tcp from any to 111.111.111.111 80 # если не хотим ограничивать add allow tcp from any to 222.222.222.222 80 add allow ip from any to any via re0 add skipto 11000 ip from any to any via rl0 add skipto 12000 ip from any to any via rl1 add 11000 nat 1 ip from any to any via rl0 add 11999 skipto 65000 ip from any to any add 12000 nat 2 ip from any to any via rl1 add 12999 skipto 65000 ip from any to any


так же является рабочим, и многие будут использовать именно такой вариант (я даже осознаю, что такой фаервол будет производительнее), НО как только мы хотим натить пакеты изнутри по конкретным портам (например хотим разрешить доступ внутренним клиентам сети только к 80, 443 и пр.) нам приходится избавляться от
add allow ip from any to any via re0
и как только мы от него избавляемся, у нас нет иного выхода (или просто я его не вижу), как начинать писать для пакетов, генерируемых внутренними клиентами правила с кип-стейтами (как описано в решении для моего кейса)..
в хай-лоад я не знаю как оно, но с нагрузками нашего офиса оно справляется (по крайней мере пока)..
если есть вариант ограничить клиентов внутри без повсеместного втыкания кип-стейт, то я бы выбрал такой вариант, но я его просто не смог осилить ((
Debian 5.0 Lenny, 2.6.26-1-686, KDE 3.5.10.
Asus P5E-VM SE, e8400.
Спасибо сказали:
lazhu
Сообщения: 70
ОС: FreeBSD 9-STABLE / clang 3.3
Контактная информация:

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение lazhu »

DoggoD писал(а):
29.12.2015 05:31
lazhu писал(а):
28.12.2015 16:27
DoggoD писал(а):
26.12.2015 14:07
именно -- limit..
и в тот момент как вы его указали (хотя бы раз, в любом месте) ipfw сразу же стал STATEFUL..
так почему стэйты не нужны? например: есть фаервол 1 и фаервол 2.. оба обеспечивают нужный уровень безопасности.. фаервол_1 = stateful, фаервол_2 = stateless.. почему из двух фаерволов вы предпочтете именно фаервол_2, lazhu?
открывается редиректами -- это как? можете привести пример?

1. Зачем плодить лишние сущности?
2.

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

redirect_port <protocol> <ip>:<port> <port>
Это создает запись в нат-таблице, поэтому входящий пакет будет проходить.

я вас понял..
конечно, конфиг вида

root@server:~ # cat /etc/firewall.conf

nat 1 config if rl0 deny_in same_ports nat 2 config if rl1 deny_in same_ports #add allow tcp from any to 111.111.111.111 80 setup limit src-addr 10 # если хотим ограничивать add allow tcp from any to 111.111.111.111 80 # если не хотим ограничивать add allow tcp from any to 222.222.222.222 80 add allow ip from any to any via re0 add skipto 11000 ip from any to any via rl0 add skipto 12000 ip from any to any via rl1 add 11000 nat 1 ip from any to any via rl0 add 11999 skipto 65000 ip from any to any add 12000 nat 2 ip from any to any via rl1 add 12999 skipto 65000 ip from any to any


так же является рабочим, и многие будут использовать именно такой вариант (я даже осознаю, что такой фаервол будет производительнее), НО как только мы хотим натить пакеты изнутри по конкретным портам (например хотим разрешить доступ внутренним клиентам сети только к 80, 443 и пр.) нам приходится избавляться от
add allow ip from any to any via re0
и как только мы от него избавляемся, у нас нет иного выхода (или просто я его не вижу), как начинать писать для пакетов, генерируемых внутренними клиентами правила с кип-стейтами (как описано в решении для моего кейса)..
в хай-лоад я не знаю как оно, но с нагрузками нашего офиса оно справляется (по крайней мере пока)..
если есть вариант ограничить клиентов внутри без повсеместного втыкания кип-стейт, то я бы выбрал такой вариант, но я его просто не смог осилить ((

Локалку-то зачем рубить?

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

add 1000 skipto 1200 ip from any to any ${allowed_ports} via ${ext_if}
add 1100 deny ip from any to any via ${ext_if}
add 1200 nat 1 ip from any to any via ${ext_if}
Спасибо сказали:
DoggoD
Сообщения: 71
ОС: debian, centos, freebsd

Re: freebsd_10: ipfw + nat + dynamic_rules = не_работет

Сообщение DoggoD »

lazhu писал(а):
29.12.2015 12:30
Локалку-то зачем рубить?

всех с прошедшими праздниками!!
размышлял я тут недавно сам себе, будучи в праздничном настроении и таки да, соглашусь с вами, lazhu, локалку рубить особого смысла нет, во всяком случае с подходом, который я рисовал у себя в голове.. имеет смысл ее рубить только если используется подход "разрешить домен1.рф:порт1; домен2.рф:порт1; домен2.рф:порт2; все остальное запретить", чего я делать пока не планирую точно.. так что да, вы заставили меня поразмышлять и изменить свое мнение по вопросу..
спасибо..
Debian 5.0 Lenny, 2.6.26-1-686, KDE 3.5.10.
Asus P5E-VM SE, e8400.
Спасибо сказали:
Ответить