ipfw - kerlel NAT.

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
kharkov_max
капитан
Сообщения: 1861
Зарегистрирован: 2008-10-03 14:56:40

ipfw - kerlel NAT.

Непрочитанное сообщение kharkov_max » 2011-09-16 16:44:18

Добрый день.

Сильно не пинайте.
Начал изучать ipfw, решил использовать ядерный nat.
Соответствующим образом сконфигурил и скомпилил ядро, sysctl - не трогал.

Ядро:

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

options IPFIREWALL
# options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_NAT
options LIBALIAS
rc.conf:

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

firewall_enable=«YES»
firewall_type=”/etc/ipfw.conf”
1. Задача как всегда проста:
1. С внешнего интерфейса в локалку делать проброс некоторых портов (к примеру 5223, 8000).
2. На внешнем интерфейсе натить для всей локалки несколько портов (к примеру 25,110).
3. Пускать на web сервер (80,443)

Правила ipfw:

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

тут переменные, списки и таблицы.
.....
{ipfw} nat 1 config if ${ext_if} reset same_ports unreg_only \
       redirect_port tcp 192.168.0.2:5223 5223 \ 
       redirect_port tcp 192.168.0.2:8000 8000 \ 
......
${ipfw} add 500 allow all from any to ${ext_if} 25,80,110,443,5223,8000 in via ${ext_if} keep-state
${ipfw} add 600 nat 1 all from any to ${ext_if} 25,110 in via ${ext_if}
${ipfw} add 700 nat 1 all from ${local_ip} to any 25,110 out via ${ext_if}
......

${ipfw} add 1000 allow all from any to any via ${int_if}
${ipfw} add 1100 deny all from any to any 
[code]

В результате:
 - 80,443 - работает
 - 25,110 - не натится в локалке.
 - редирект 5223 и 8000 - не работает.

Правильно ли я понимаю что, в начале нужно пустить пакет на интерфейс (500), потом загнать в нат (600).
И для исходящего (700).
Или правило NAT всегда должно быть первое на интерфейсе?

2. Как заставить ipfw пропускать пакеты дальше по фаерволу, для дальнейшей обработки?
К примеру в(500) я открыл несколько портов,но хочу сделать правило (800) в коротом дополнительно открою еще порт 21,20 и т.д

В данном кратком примере это не работает, как я понимаю пакет попадает в NAT и тухнет.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

rmn
старшина
Сообщения: 427
Зарегистрирован: 2008-10-03 18:52:02

Re: ipfw - kerlel NAT.

Непрочитанное сообщение rmn » 2011-09-16 21:52:28

kharkov_max писал(а): Правильно ли я понимаю что, в начале нужно пустить пакет на интерфейс (500), потом загнать в нат (600).
И для исходящего (700).
Или правило NAT всегда должно быть первое на интерфейсе?
нет. Пакеты, попавшие на правило allow/deny никуда дальше не пойдут - они окончательно разрешены/запрещены.
Первыми правилами выставляй deny (если нужно), потом nat. Если one_pass равна 1, действие nat работает как allow, т.е. после него пакет разрешен и по дальнейшим правилам обрабатываться не будет.
kharkov_max писал(а): 2. Как заставить ipfw пропускать пакеты дальше по фаерволу, для дальнейшей обработки?

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

net.inet.ip.fw.one_pass

Аватара пользователя
kharkov_max
капитан
Сообщения: 1861
Зарегистрирован: 2008-10-03 14:56:40

Re: ipfw - kerlel NAT.

Непрочитанное сообщение kharkov_max » 2011-09-19 16:11:13

Спасибо, с этим разобрался.
Выключил net.inet.ip.fw.one_pass, а дальше как в PF.

Возникло еще пару вопросов.
Настроил ipfw на редирект внешних портов в локалку, nat из локалки и фильтрацию в ipsec (по хостам, портам).

1. Как правильно сделать следующее.
На шлюзе висит VPN сервер mpd5, так же шлюз должен пропускать через себя VPN соединения от локальной сети в инет (NAT GRE и 1723).
Это по отдельности работает:

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

# ========= Для VPN сервера ============

${fw} add allow tcp from any to ${ext_gateway_ip} 1723  in via ${ext_if}
${fw} add allow tcp from ${ext_gateway_ip} to any 1723 out via ${ext_if}
${fw} add allow gre from any to ${ext_gateway_ip}  in via ${ext_if}
${fw} add allow gre from ${ext_gateway_ip} to any out via ${ext_if}

# ======================================

# ================= NAT VPN в инет ========================
${fw} add nat 3 tcp from table\(3\) to any 1723       out via ${ext_if}
${fw} add nat 3 gre from table\(3\) to any            out via ${ext_if}

${fw} add nat 3 tcp from any 1723 to ${ext_gateway_ip} in via ${ext_if}
${fw} add nat 3 gre from any to ${ext_gateway_ip}      in via ${ext_if}
${fw} add allow tcp from any 1723 to table\(3\)        in via ${ext_if}
${fw} add allow gre from any to table\(3\)             in via ${ext_if}
# =========================================================
Как заставить работать одновременно и VPN сервер и NAT VPN через шлюз ?
В PF все работало как нужно .....

2. Хочется настроить шейпер.
В PF был настроен HFSC. Поиски шейпера для ipfw (аналог HFSC) ни к чему не привели.
Есть ли аналог к ipfw, или придется шейпить на PF а потом в ipfw count ... ?
http://www.lissyara.su/articles/freebsd ... altq+ipfw/

Спасибо.

Аватара пользователя
kharkov_max
капитан
Сообщения: 1861
Зарегистрирован: 2008-10-03 14:56:40

Re: ipfw - kerlel NAT.

Непрочитанное сообщение kharkov_max » 2011-09-23 11:44:19

И тишина ...

Еще вопрос.
Почему Nat из локалки работает только так:

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

${fw} add nat 1 { tcp or udp or icmp } from table\(2\) to any        out via ${ext_if}
${fw} add allow { tcp or udp or icmp } from ${ext_gateway_ip} to any out via ${ext_if}

${fw} add nat 1 { tcp or udp or icmp } from any to ${ext_gateway_ip}  in via ${ext_if}
${fw} add allow { tcp or udp or icmp } from any to table\(2\)         in via ${ext_if}
В то время когда Nat GRE прекрасно работает так

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

${fw} add nat 3 tcp from table\(3\) to any 1723       out via ${ext_if}
${fw} add nat 3 gre from table\(3\) to any            out via ${ext_if}

${fw} add nat 3 tcp from any 1723 to ${ext_gateway_ip} in via ${ext_if}
${fw} add nat 3 gre from any to ${ext_gateway_ip}      in via ${ext_if}
${fw} add allow tcp from any 1723 to table\(3\)        in via ${ext_if}
${fw} add allow gre from any to table\(3\)             in via ${ext_if}
Т.е. в NAT GRE нет правила типа:
${fw} add allow { tcp or udp or icmp } from ${ext_gateway_ip} to any out via ${ext_if}