IPFW kernel NAT && MPD5 сервер

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

IPFW kernel NAT && MPD5 сервер

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

День добрый.

Подскажите пожалуйста, что-то немного запутался.

Есть сервер, на котором крутится VPN сервер mpd5, так же определенных клиентов из локалки нужно пустить через этот сервер в инет не другие VPN сервера.
Фаервол ipfw и kernel NAT, собственно про него и вопрос.

Есть 2 блока правил:

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

# ===================================== Для VPN сервера ================================================
# Общие правила
${fw} add allow tcp from ${ext_gateway_ip} 1723 to any out via ${ext_if}
${fw} add allow gre from ${ext_gateway_ip} to any      out via ${ext_if}
${fw} add allow tcp from any to ${ext_gateway_ip} 1723  in recv ${ext_if}
${fw} add allow gre from any to ${ext_gateway_ip}       in recv ${ext_if}
# Для пользрвателей на VPN интерфейсе
.........
# =======================================================================================================

# ====================== 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 из локалки, если он первый.

Как правильно увязать оба блока что б они работали одновременно ?
Спасибо.

Хостинговая компания 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/

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

Re: IPFW kernel NAT && MPD5 сервер

Непрочитанное сообщение kharkov_max » 2011-10-13 11:41:53

UP
Разве нет решения?

dimidrol80
рядовой
Сообщения: 38
Зарегистрирован: 2008-06-07 17:50:21
Контактная информация:

Re: IPFW kernel NAT && MPD5 сервер

Непрочитанное сообщение dimidrol80 » 2011-10-17 14:54:40

Сам над етой проблемой мучаюсь пока не придумал ничего стоящего.
Вариант возможен если есть два провайдера. через одного выпускаеш с локалки в мир с другого с мира на сервер.
Просто тут есть проблема в самом механизме IPFW. IPFW проверяет на первое совпадение в правилах.
В данном случае соеденение прошло через нат а при возвращение пакетов попадает на блок правил

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

# Общие правила
${fw} add allow tcp from ${ext_gateway_ip} 1723 to any out via ${ext_if}
${fw} add allow gre from ${ext_gateway_ip} to any      out via ${ext_if}
${fw} add allow tcp from any to ${ext_gateway_ip} 1723  in recv ${ext_if}
${fw} add allow gre from any to ${ext_gateway_ip}       in recv ${ext_if}
# Для пользрвателей на VPN интерфейсе
И соответствено пакет отбрасывается

Так же если правила ната стоят перед розришением GRE
тогда клиенты подключаются через нат а к серверу нет.

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

Re: IPFW kernel NAT && MPD5 сервер

Непрочитанное сообщение kharkov_max » 2011-10-17 15:01:46

dimidrol80 писал(а):Сам над етой проблемой мучаюсь пока не придумал ничего стоящего.
Вариант возможен если есть два провайдера. через одного выпускаеш с локалки в мир с другого с мира на сервер.
Просто тут есть проблема в самом механизме IPFW. IPFW проверяет на первое совпадение в правилах.
В данном случае соеденение прошло через нат а при возвращение пакетов попадает на блок правил

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

# Общие правила
${fw} add allow tcp from ${ext_gateway_ip} 1723 to any out via ${ext_if}
${fw} add allow gre from ${ext_gateway_ip} to any      out via ${ext_if}
${fw} add allow tcp from any to ${ext_gateway_ip} 1723  in recv ${ext_if}
${fw} add allow gre from any to ${ext_gateway_ip}       in recv ${ext_if}
# Для пользрвателей на VPN интерфейсе
И соответствено пакет отбрасывается

Так же если правила ната стоят перед розришением GRE
тогда клиенты подключаются через нат а к серверу нет.
Думаю что как-то можно решить.
Т.к. у меня связка PF и IPFW для VPN сервера (PF) и nat VPN из локалки (IPFW) - работает(ла).
Пока не перешел полностью на IPFW.
Вот теперь пытаюсь найти решение этого вопроса, пока не горит, но осадок от того что не работает есть.

Кстати у меня

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

sysctl -a | grep one_pass
net.inet.ip.fw.one_pass: 0

dimidrol80
рядовой
Сообщения: 38
Зарегистрирован: 2008-06-07 17:50:21
Контактная информация:

Re: IPFW kernel NAT && MPD5 сервер

Непрочитанное сообщение dimidrol80 » 2011-10-17 16:15:09

Да я тоже думаю что решения всегда есть
Но пока тож ничего не придумалось
Кстати у меня тоже самое

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

sysctl -a | grep one_pass
net.inet.ip.fw.one_pass: 0
но насколько я знаю етот параметр отвечяет за прохождение пакета по правилам фаервола один раз.
Если стоит 1 тогда пакет проходит проверку 2 раза один раз при попадании в фаервол другой раз при выходе из него.
Немного сумбурно написал правильней описано здесь http://www.lissyara.su/articles/freebsd ... /ipfw_nat/

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

Re: IPFW kernel NAT && MPD5 сервер

Непрочитанное сообщение kharkov_max » 2011-10-17 16:31:54

Вроде как net.inet.ip.fw.one_pass: 0 каcается только pipe и ng
net.inet.ip.fw.one_pass: 1
When set, the packet exiting from the dummynet(4) pipe or from
ng_ipfw(4) node is not passed though the firewall again. Other-
wise, after an action, the packet is reinjected into the firewall
at the next rule.

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

Re: IPFW kernel NAT && MPD5 сервер

Непрочитанное сообщение kharkov_max » 2011-10-20 16:19:45

Кто ищет, тот всегда найдет ...

Вроде все заработало, правила приняли следующий вид:

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

# ====================== NAT VPN в инет ======================================================
${fw} add nat 1 tag 8 tcp from table\(3\) to any 1723        out recv ${int_if} xmit ${ext_if}
${fw} add nat 1 tag 8 gre from table\(3\) to any                out recv ${int_if} xmit ${ext_if}
${fw} add nat 1 tag 8 gre from ${ext_gateway_ip} to any   out via ${ext_if}
${fw} add allow tcp from ${ext_gateway_ip} to any 1723    out via ${ext_if} tagged 8
${fw} add allow gre from ${ext_gateway_ip} to any            out via ${ext_if} tagged 8

${fw} add nat 1 tag 8 tcp from any 1723 to ${ext_gateway_ip}  in via ${ext_if}
${fw} add nat 1 tag 8 gre from any to ${ext_gateway_ip}          in via ${ext_if}
${fw} add nat 1 tag 8 gre from any to table\(3\)                       in via ${ext_if}
${fw} add allow tcp from any 1723 to table\(3\)                        in via ${ext_if} tagged 8
${fw} add allow gre from any to table\(3\)                                in via ${ext_if} tagged 8
# =============================================================================================
# ===================================== Для VPN сервера ================================================
# Общие правила
${fw} add allow tcp from ${ext_gateway_ip} 1723 to any out via ${ext_if}
${fw} add allow gre from ${ext_gateway_ip} to any         out via ${ext_if}

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

# Для пользователей VPN
${fw} add allow ip from ${int_lan},${vpn_lan} to ${vpn_user1} out via ${vpn_if}
${fw} add allow ip from ${vpn_user1} to ${int_lan},${vpn_lan}  in via ${vpn_if}
...... и т.д.
# ===============================================================
Конструкцию out recv ${int_if} xmit ${ext_if} применил на всякий случай, будет и с via работать, но будет полезно тому у кого 2 внутренних интерфейса.
Тегирование пакетов тоже прилепил на всякий случай, что б лишнего не пошло по этим правилам.
Ключевым правилом является:

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

${fw} add nat 1 tag 8 gre from ${ext_gateway_ip} to any      out via ${ext_if}
Важно 1 !!!
Тестирование начинал с правила

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

${fw} add nat 1 tag 8 gre from any to any      out via ${ext_if}
После его применения - все заработало, но дальнейшая правка фаервола и изменения правил до абсурда приводило к тому что трафик gre пропускался и для сервера и для nat VPN. А после перезагрузки сервера, доступа к VPN серверу уже не было, а nat VPN работал нормально.
Соответственно когда будете править свой фаервол, перед тем как сказать себе "Все заработало" - ребутните сервер и проверьте работу фаервола еще раз.

Важно 2 !!!
Правила NAT GRE должны быть выше правил фильтрации для VPN сервера, иначе доступ к VPN серверу работать не будет.

dimidrol80
Я так понимаю данная настройка Вам важна - отпишитесь если у Вас тоже заработает.
Удачи ...

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

Re: IPFW kernel NAT && MPD5 сервер

Непрочитанное сообщение kharkov_max » 2011-10-20 16:33:45

Правило не нужно, оно не работает.

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

${fw} add nat 1 tag 8 gre from any to table\(3\)                       in via ${ext_if}
Окончательный конфиг:

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

# ====================== NAT VPN в инет ======================================================
${fw} add nat 1 tag 8 tcp from table\(3\) to any 1723        out recv ${int_if} xmit ${ext_if}
${fw} add nat 1 tag 8 gre from table\(3\) to any                out recv ${int_if} xmit ${ext_if}
${fw} add nat 1 tag 8 gre from ${ext_gateway_ip} to any   out via ${ext_if}
${fw} add allow tcp from ${ext_gateway_ip} to any 1723    out via ${ext_if} tagged 8
${fw} add allow gre from ${ext_gateway_ip} to any            out via ${ext_if} tagged 8

${fw} add nat 1 tag 8 tcp from any 1723 to ${ext_gateway_ip}  in via ${ext_if}
${fw} add nat 1 tag 8 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} tagged 8
${fw} add allow gre from any to table\(3\)                                in via ${ext_if} tagged 8
# =============================================================================================
# ===================================== Для VPN сервера ================================================
# Общие правила
${fw} add allow tcp from ${ext_gateway_ip} 1723 to any out via ${ext_if}
${fw} add allow gre from ${ext_gateway_ip} to any         out via ${ext_if}

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

# Для пользователей VPN
${fw} add allow ip from ${int_lan},${vpn_lan} to ${vpn_user1} out via ${vpn_if}
${fw} add allow ip from ${vpn_user1} to ${int_lan},${vpn_lan}  in via ${vpn_if}
...... и т.д.
# ===============================================================