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

IPFW kernel NAT alias -> PBR

Добавлено: 2011-10-20 17:33:06
kharkov_max
На днях получил у провайдера белый доп. IP
Прицепил его как алиас к основному IP.

Теперь хочется реализовать проброс портов через этот доп. IP.
На сколько понимаю стоит крутить PBR и fib.

Фаервол ipfw с kernel nat.
Перечитал кучу док и манов по PBR но что то не сростается настроить фаервол.
Проброс портов - не работает.
Нужен только проброс портов ни какие хосты отдельно из локалки не будут ходить через алиас.
Сам сервер отвечает по доп IP на 80 22 и т.д. порты.

Поднял 2й nat, на доп IP:

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

${fw} nat 2 config ip ${ext_gateway_ip_alias} reset same_ports deny_in \
            redirect_port tcp 192.168.1.1:443 443
Далее

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

# ======= Все что приходит на алиас основного IP метим и пересылаем по правилам ниже =======
${fw} add skipto 20000 all from ${ext_gateway_ip_alias} to any out via ${ext_if}
${fw} add skipto 20000 all from any to ${ext_gateway_ip_alias}  in via ${ext_if}
......
......
# ===================== Настройка доп IP алиаса внешнего интрефейса ===================================================
${fw} add 20000 setfib 1 tag 1 all from any to any
${fw} add allow icmp from any to ${ext_gateway_ip_alias} icmptypes 8               in via ${ext_if} keep-state tagged 1

# ======================== Редирект портов через Nat ====================================================
${fw} add nat 2 tcp from 192.168.1.1 443 to any                      out via ${ext_if} tagged 1
${fw} add allow  tcp from ${ext_gateway_ip_alias} 443 to any   out via ${ext_if} tagged 1

${fw} add nat 2 tcp from any to ${ext_gateway_ip_alias} 443    in via ${ext_if} tagged 1
${fw} add allow  tcp from any to 192.168.1.1 443                     in via ${ext_if} tagged 1
# =======================================================================================================
${fw} add 30000 skipto 40000 all from any to any
####################################################################################################################################################

${fw} add 40000 allow all from any to any via ${int_if}

deny all
В таблице маршрутизации 1 - маршрут по умолчанию на шлюз сети алиаса интерфейса.
Вот такой вот редирект - не работает.

На сколько я понимаю пакеты возвращаются в инет на основной IP и естесственно ни чего не работает.

Подскажите пожалуйста как правильно настроить и возможно ли ... ?
Спасибо.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2011-10-31 8:44:11
kharkov_max
UP

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2011-11-11 17:08:18
kharkov_max
Народ что ни кто не подскажет ?

Смысл что б пакет пришедший из инета по определенному каналу (ip) по нему же и вернулся назад
Для внешних ip так работает, а вот если делать редирект в локалку - то нет, все идет по основному каналу, а доп IP не пашет

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2011-11-11 18:16:20
vadim64

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

uname -a
ifconfig -a
netstat -rn
и список правил целиком

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-23 10:35:08
kharkov_max
vadim64 писал(а):

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

uname -a
ifconfig -a
netstat -rn
и список правил целиком
Вернулся к данному вопросу.
Список правил целиком это слишком много ))).

Хочу понять не много теории происходящего.

И так.
Есть внешний IP1 и IP2. В моем случае IP2 это алиас IP,1 но по идее это не важно, как я понимаю IP2 можно считать отдельным провайдером.
Мне нужно все что приходит на IP2 с пробросом в локалку вернуть в инет по тому же IP2, но т.к. dafault route смотрит через IP1 все что приходит из локалки для IP2 уходит через IP1 в никуда.

Правильно ли я понимаю что мне необходимо на IP1 ловить все что приходит для IP2 из локалки, и пересылать на IP2 принудительно ?
Вопросы:
1. как поймать пакеты для IP2 ?
2. Для решения этой задачи достаточно крутить только внешние интерфейсы или необходимо будет задействовать фильтрацию еще и на внутреннем интерфейсе. (хотелось бы внутренний интерфейс "пока" не фильтровать).

Если есть простой пример правил поделитесь пожалуйста.
Спасибо.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-23 11:17:13
kharkov_max
На сколько я понимаю мне нужен source-routing

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-23 16:19:01
MASiK
так стоп, если это просто дополнительный белый ИП то шлюз что у первого что у этого один и тот же я прав?

Значт просто поднимите нат и сделайте переброс портов всё должно работать, пакеты всё равно через 1 и тот же шлюз будут уходить по обоим ипам

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

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-23 16:26:08
kharkov_max
MASiK писал(а):так стоп, если это просто дополнительный белый ИП то шлюз что у первого что у этого один и тот же я прав?

Значт просто поднимите нат и сделайте переброс портов всё должно работать, пакеты всё равно через 1 и тот же шлюз будут уходить по обоим ипам

Ну и конечно правила все было бы не плохо увидеть, так как второй ип надо тоже разрешить как и первый для естаблишедов всяких или просто открыть порт на нём
Нет шлюзы у IP разные ... (по сути это как 2 разных провайдера).
А моя цель, в кратце, выставить внутренний Web сервер в инет через разные IP через один шлюз.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-23 17:13:23
dikens3
kharkov_max писал(а): 1. как поймать пакеты для IP2 ?
Вы вроде хотели только WEB-Сервер использовать на другом IP? (Ну или другие сервисы).
Если так:
Сделать редирект на внутренний адрес (или одного порта).

1. Внешний мир -> Внешний IP -> NAT? -> Внутренний IP (или порт)
По сути ВСЕ внешние соединения на внешний IP-алиас транслировать на внутренний адрес IP-сервера.

2. Внутренний IP -> NAT+Шлюз -> внешний мир.
По сути ВСЕ внутренние соединения с IP-сервера транслировать на другой шлюз с другим IP.

Возможно повесить WEB-сервер на 2-а разных порта? Кидать через 1 канал XX порт, через другой - YY порт? (Для SSH вполне пофигу)
А моя цель, в кратце, выставить внутренний Web сервер в инет через разные IP через один шлюз.
Через разные шлюзы?

Может прокси (nginx) какой повесить на внешний IP1 и 2?
На сколько я понимаю пакеты возвращаются в инет на основной IP и естесственно ни чего не работает.
Попробуйте освоить опцию LOG. там всё понятно станет, куда что и как идёт.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-24 8:32:27
kharkov_max
Под шлюзом я имел ввиду шлюз в своей локальной сети к которому подключено 2 провайдера (на самом деле провайдер один, он но предоставляет 2 разных белых IP у которых свой default gateway)
Конечно для веб сервера можно Апач поднять как обратный прокси, но Web сервер я привел к примеру, цель научится пробрасывать порты в локалку через ядерный нат с 2х разных провайдеров. По сути разобраться в ipfw source-routing.
Проброс через 1 IP (ядерный nat) уже нормально работает.

С опцией Log конечно разберусь, но что б в лог что то писать нужны правила в ipfw для source-routing, я вот не могу понять логи ку прохождения пакетов через такой маршрутизатор. В PF я это дело решил через route-to, а вот с ipfw засада.

Народ пишет что можно использовать fib и пакетам менять роут при прохождении через фаер.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-24 12:06:01
dikens3
Я с fib незнаком вовсе.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-25 13:33:18
kharkov_max
Кто нить может помочь ?

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

В догонку, у меня

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

net.inet.ip.fw.one_pass: 0

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-25 16:03:01
kharkov_max
Выкладываю свой конфиг

net.inet.ip.fw.one_pass: 0

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

ext_if = "vr0"
int_if = "em0"
ext_gateway_ip = "111.111.111.111"
ext_gateway_ip_alias = "222.222.222.222"
jabber_server = 192.168.0.1


.....

${fw} nat 2 config ip ${ext_gateway_ip_alias} reset same_ports deny_in \
            redirect_port tcp ${jabber_server}:5223 5223

# ======= Все что приходит на алиас основного IP метим и пересылаем по правилам ниже =======
${fw} add skipto 7000 tag 1 log all from any to ${ext_gateway_ip_alias} in via ${ext_if} keep-state
${fw} add 7000 setfib 1 log tagged 1
${fw} add skipto 20000 log tagged 1

################################ Фильтрация на 1м внешнем интерфейсе ext_gateway_ip ######################
.......
Тут все работает


######################## Фильтрация на 2м внешнем интерфейсе ext_gateway_ip_alias ########################
======================== Редирект портов через Nat ====================================================
${fw} add 20000 nat 2 log tcp from ${jabber_server} 5223  to any out via ${ext_if}
${fw} add allow log tcp from ${ext_gateway_ip_alias} 5223 to any out via ${ext_if}

${fw} add nat 2 log tcp from any to ${ext_gateway_ip_alias} 5223 in via ${ext_if}
${fw} add allow log tcp from any to ${jabber_server} 5223        in via ${ext_if}
# =======================================================================================================

${fw} add 30000 skipto 40000 all from any to any via ${ext_if}
##########################################################################################################

${fw} add 40000 allow all from any to any via ${int_if} # Тут разрешено все и все работает

# Default deny, запрещено все что выше не прошло.
${fw} add 65534 deny ip from any to any
Ядро собрано с 3мя таблицами маршрутизации.
В fib 1 добавлен default route на шлюз провайдера, IP - ${ext_gateway_ip_alias}

В логе ipfw видно что входящие пакеты попадают в фаервол, проходят правила tag 1 и setfib далее попадают в правила in nat 2
И все ... пакетов попавших под правила out в логе нет...

Собственно поэтому проброс порта и не работает.
На основном IP все работает нормально.

Помогите допилить и разобраться.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-25 20:56:52
dikens3
1. До твоего Jabber сервера пакеты доходят?
2.
${fw} nat 2 config ip ${ext_gateway_ip_alias} reset same_ports deny_in \
redirect_port tcp ${jabber_server}:5223 5223
не мешает? Я просто не знаю как там jabber работает.

3. Назад ответ приходит на шлюз?
попадает под правило:

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

${fw} add skipto 20000 log tagged 1
Есть мысль что происходит приём пакета чуть раньше, например вот тут:

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

${fw} add skipto 7000 tag 1 log all from any to ${ext_gateway_ip_alias} in via ${ext_if} keep-state
если так, тогда просто переставь правило со skipto на 20000 чуть выше.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-26 6:17:45
kharkov_max
1. Да, приходящие из вне пакеты до jabber доходят.
2. Нет deny_in не мешает, аналогичное правило висит на 1м интерфейсе и все работает.
3. Выше этога правила, только deny и фильтрация для ssh (на всякий случай).

На сколько я понимаю то что сейчас происходит.
Пакет доходит на jabber, и jabber отвечает, возвращает его назад в шлюз, но по какой то причине шлюз забывает из какого fib пакет и пытается ответить через fib 0.
Странно, но гуглю и даже пару раз натыкался на аналогичную ситуацию - но решения с net.inet.ip.fw.one_pass: 0 так пока и не нашел ...

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-26 22:19:40
dikens3
может отдельную сетевуху поставить, глюк какой-нибудь с алиасом.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-26 23:28:48
Palich
Столкнулся с этой проблемой, правда у меня два отдельных интерфейса, решил следующим образом:

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

#!/bin/sh
##############################################################################
if [ -r /etc/rc.conf ]; then
        . /etc/rc.conf
fi
###############################################################################

# Our inside interface, ip, netmask and network
 inside_if="em0"
 inside_ip_prefix="192.168.0"
 inside_ip="${inside_ip_prefix}.9"

 inside_mask="255.255.255.0"
 lan="${inside_ip_prefix}.0/24"
 
 outside_if="em1"
 outside_ip="x.x.x.x"
 outside_mask="255.255.255.252"
 outside="x.x.x.x/30"
 
 reserve_if="em2"
 reserve_ip="y.y.y.y"
 reserve_mask="255.255.255.252"
 reserve="y.y.y.y/30"
 

# Other server & LAN IP:

 lan_servers="{ ${inside_ip_prefix}.0/29"
 lan_admins="{ ${inside_ip_prefix}.124 }"
 ftp_users="{ ${inside_ip_prefix}.1 or ${inside_ip_prefix}.2 or ${inside_ip_prefix}.4 or ${inside_ip_prefix}.5 or ${inside_ip_prefix}.6 }"

 no_routing_net="{ 10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16 or 0.0.0.0/8 or 169.254.0.0/16 or 192.0.2.0/24 or 224.0.0.0/4 or 240.0.0.0/4 }"

 tserver="{ ${inside_ip_prefix}.2 or ${inside_ip_prefix}.5 or ${inside_ip_prefix}.8 or ${inside_ip_prefix}.11 }"
  
# Start list number
 rule_num=1000
 step=10
 
###############################################################################

# Internal commands
case ${firewall_quiet} in
[Yy][Ee][Ss])
        fwcmd="/sbin/ipfw -q"
        ;;
*)
        # For testing
        fwcmd="/sbin/ipfw"
        ;;
esac

# For testing
if [ "$1" = "echo" ]; then
        fwcmd="/bin/echo"
fi

#addcmd ()  { ${fwcmd} add ${rule_num} $*         ; rule_num=`expr ${rule_num} + ${step}`; }
addcmd ()  { ${fwcmd} add ${rule_num} $*         ; rule_num=$((${rule_num}+${step})); }
pass ()    { ${fwcmd} add ${rule_num} pass    $@ ; rule_num=$((${rule_num}+${step})); }
deny ()    { ${fwcmd} add ${rule_num} deny    $@ ; rule_num=$((${rule_num}+${step})); }
reset ()   { ${fwcmd} add ${rule_num} reset   $@ ; rule_num=$((${rule_num}+${step})); }
reject ()  { ${fwcmd} add ${rule_num} reject  $@ ; rule_num=$((${rule_num}+${step})); }
divert ()  { ${fwcmd} add ${rule_num} divert  $@ ; rule_num=$((${rule_num}+${step})); }
tee ()     { ${fwcmd} add ${rule_num} tee     $@ ; rule_num=$((${rule_num}+${step})); }
forward () { ${fwcmd} add ${rule_num} forward $@ ; rule_num=$((${rule_num}+${step})); }
skipto ()  { ${fwcmd} add ${rule_num} skipto  $@ ; rule_num=$((${rule_num}+${step})); }
count ()   { ${fwcmd} add ${rule_num} count  $@ ; rule_num=$((${rule_num}+${step})); }
###############################################################################
# Flush out the list before we begin.
${fwcmd} -f flush
${fwcmd} -f pipe flush
############################# Firewall rules ##################################
rule_num=1000
# Allow loopbacks, deny imposters
pass all from any to any via lo0
deny all from any to 127.0.0.0/8
deny ip from 127.0.0.0/8 to any
###############################################################################
${fwcmd} nat 1 delete
${fwcmd} nat 2 delete
sleep 1
в локалке есть терминальный сервер, который должен быть доступен с основного канала и с резервного
${fwcmd} nat 1 config log if ${reserve_if} reset same_ports\
    redirect_port tcp 192.168.0.2:3389 3391\
    redirect_port tcp 192.168.0.5:3389 3392
    
${fwcmd} nat 2 config log if ${outside_if} reset same_ports\
    redirect_port tcp 192.168.0.11:5222 5222\
    redirect_port tcp 192.168.0.11:5233 5223\
    redirect_port tcp 192.168.0.11:9090 9090\
    redirect_port tcp 192.168.0.11:9091 9091\
    redirect_port tcp 192.168.0.2:3389 3391\
    redirect_port tcp 192.168.0.5:3389 3392\
    redirect_port tcp 192.168.0.11:3389 3393\
    redirect_port tcp 192.168.0.8:3389 3394\
    redirect_port tcp 192.168.0.10:443 443\
    redirect_port tcp 192.168.0.10:80 80\
    redirect_port tcp 192.168.0.10:902 902\
    redirect_port tcp 192.168.0.10:903 903\
    redirect_port tcp 192.168.0.254:5000 5000
для каждого прова своя таблица маршрутизации, default route можно вообще не указывать
setfib 1 route add default x.x.x.x
setfib 2 route add default y.y.y.y
##############################################################################
трафик от интерфейсов раскидывается по блокам правил (мой метод, мне кажется удобнее)
# for inside interface (not NAT)
skipto 10000 ip from any to any via ${inside_if}
# for reserve interface
skipto 20000 ip from any to any via ${reserve_if}
# for outside interface
skipto 30000 ip from any to any via ${outside_if}
##############################################################################
deny log all from any to any
rule_num=10000
# deny not LAN connections
deny log ip from not ${lan} to any in
# Deny fragmeted ICMP-packetes
deny icmp from any to any frag
# allow IP fragments to pass through
pass all  from any to any frag
addcmd check-state
# set routing table for same interface
!!! здесь самая суть. Устанавливаются ДИНАМИЧЕСКИЕ правила для для пакетов, пришедших с разных внешних интерфейсов и уходящих в локалку,
у обратных пакетов будет установлена та же таблица маршрутизации (check-state)
addcmd setfib 1 tagged 1 keep-state
addcmd setfib 2 tagged 2 keep-state

# Allow established connections from LAN to me & from me to LAN
pass tcp from ${lan} to me  established
pass tcp from me  to ${lan} established
# From server to LAN
pass tcp  from me to ${lan} out setup
pass udp  from me to ${lan} out
pass icmp from me to ${lan} keep-state

# DHCP
pass udp from any to any 67,68,69
pass udp from any 68 to any 67
pass udp from any 67 to any 68

deny log udp from any 67,68 to any
deny log udp from any to any 67,68

# DNS
pass udp from ${lan} to ${dns} 53 in
pass tcp from ${lan} to ${dns} 53 in setup
# NTP & Time-server
pass udp from ${lan} to ${ntp} 123 in
pass tcp from ${lan} to ${ntp} 525 in setup
pass tcp from ${lan} to ${mail}  25,${mailclient_ports} in setup
pass tcp from ${lan} to ${www}   80 in setup
pass tcp from ${lan} to ${ftp}   20,21 in setup
pass tcp from ${lan} to me ${unregister_ports} in setup
pass udp from ${lan} to me ${unregister_ports} in

# Deny all other incomming connections from LAN
deny log tcp from ${lan} to me
############################ From internet to LAN ##############################
# For transparent proxy: from SQUID&frox to users
pass tcp from any 20,21         to ${lan}  established
pass tcp from any ${http_ports} to ${lan}  established

# For services from Internet to LAN
# RDP
pass tcp from ${remote_users} to ${lan} 3389 keep-state
# VmWARE client
pass tcp from ${remote_users} to ${vmware} ${vmware_ports} keep-state
# OpenFire server
pass tcp from ${remote_users} to ${openfire} ${openfire_ports} keep-state
# Radmin
pass tcp from ${remote_admins} to ${tserver} ${radmin_ports} keep-state
############################ From LAN to internet ##############################
# Transparent proxy
forward ${proxy},3128 tcp from ${lan} to not me ${http_ports} in
forward ${proxy},3128 tcp from ${lan} to not me 3128          in

pass tcp from ${lan} to any 110,143,993,995,443,1024,1025 keep-state
# ICQ
pass tcp from ${lan} to any 5190 keep-state
# Jabber
pass tcp from ${lan} to any ${openfire_ports} keep-state
#pass tcp from ${lan_admins} to any ${sshd_port} keep-state
pass tcp from ${lan} to any ${sshd_port} keep-state

# Next rule - only if transparent proxy is not used
pass tcp from ${lan} to any 21,20 keep-state
# Next rule - only if transparent proxy is not used
pass tcp from ${lan} to any ${http_ports} keep-state
# Reject all setup of other incoming connections from the inside
deny log tcp from any to any in

############################ Other UDP rules ###################################
# TRACEROUTE - Allow outgoing
pass udp from ${lan} to any 33434-33523 keep-state

pass udp from me to ${lan} out
deny log udp from ${lan} to any

# Deny & log all other connections
deny log udp from any to any
############################ Other ICMP rules ##################################

pass icmp from ${lan_admins}    to me  keep-state

# Allow ICMP packets from our LAN
#pass icmp from ${lan} to ${inside_ip} keep-state

pass icmp from ${lan_admins} to any keep-state
#pass icmp from ${lan} to any keep-state

#0  - echo reply
#3  - destination unreachable
#4  - source quench
#5  - redirect
#8  - echo request
#9  - router adver-tisement
#10 - router solicitation
#11 - time-to-live exceeded
#12 - IP header bad
#13 - timestamp request
#14 - timestamp reply
#15 - information request
#16 - information reply
#17 - address mask request
#18 - and address mask reply

# Allow Destination Unreachable, Source Quench, Time Exceeded, and Bad Header
pass icmp from any to any icmptypes 0,3,4,8,11,12

# Deny the rest of them
deny log icmp from any to any

deny log all from any to any
skipto 65534 ip from any to any
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rule_num=20000
# Stop spoofing
deny log all from any to not me in
rule_num=21000
pass tcp from ${reserve_ip} to any out
addcmd nat 1 tag 10 ip from not me to any
##########################################################################
# Stop RFC1918 nets on the outside interface
# Stop draft-manning-dsua-03.txt (1 May 2000) nets (includes RESERVED-1,
# DHCP auto-configuration, NET-TEST, MULTICAST (class D), and class E)
# on the outside interface
deny all from ${no_routing_net} to any
# Allow access for remote admins
pass tcp from ${remote_admins} to me ${sshd_port} in
pass tcp from ${remote_admins} to me ${apache_ports},${webmin_port} in
pass tcp from any to me established
addcmd check-state
# From server to internet
заначенные пакеты выпускаются без образования динамических правил
pass ip  from me to any tagged 10
pass tcp  from me to any keep-state
pass udp  from me to any keep-state
pass icmp from me to any keep-state
########################## From remote users to LAN ############################
здесь метятся пакеты, пришедшие на внешний интерфейс и заначенные в локалку
pass tag 2 { tcp or udp } from not me to ${lan} in

# Reject all setup of other incoming connections from the outside
deny log tcp from any to any in
# Deny & log all other connections
deny log udp from any to any 
############################ Other ICMP rules ##################################

pass icmp from ${remote_admins} to me keep-state

#0  - echo reply
#3  - destination unreachable
#4  - source quench
#5  - redirect
#8  - echo request
#9  - router adver-tisement
#10 - router solicitation
#11 - time-to-live exceeded
#12 - IP header bad
#13 - timestamp request
#14 - timestamp reply
#15 - information request
#16 - information reply
#17 - address mask request
#18 - and address mask reply

# Allow Destination Unreachable, Source Quench, Time Exceeded, and Bad Header
pass icmp from any to any icmptypes 0,3,4,8,11,12

# ICMP from outside
#pass icmp from any           to ${outside_ip} in  icmptypes 0,3,4,11,12
#pass icmp from ${outside_ip} to any           out icmptypes 0,3,8,12

# Deny the rest of them
deny log icmp from any to any
deny log all from any to any
skipto 65534 ip from any to any
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rule_num=30000
два внешних интерфейса аналогичны, вся фольтрация на внутреннем, на внешнем можно настроить шейпинг
##########################################################################
# Stop RFC1918 nets on the outside interface
# Stop draft-manning-dsua-03.txt (1 May 2000) nets (includes RESERVED-1,
# DHCP auto-configuration, NET-TEST, MULTICAST (class D), and class E)
# on the outside interface
deny all from ${no_routing_net} to any
# Allow access for remote admins
pass tcp from ${remote_admins} to me ${sshd_port} in
pass tcp from ${remote_admins} to me ${apache_ports},${webmin_port} in
pass tcp from any to me established
addcmd check-state
# From server to internet
pass ip  from me to any tagged 20
pass tcp  from me to any keep-state
pass udp  from me to any keep-state
pass icmp from me to any keep-state
########################## From remote users to LAN ############################
аналогично 1-му интерфейсу
pass tag 1 { tcp or udp } from not me to ${lan} in

# Reject all setup of other incoming connections from the outside
deny log tcp from any to any in
# Deny & log all other connections
deny log udp from any to any 
############################ Other ICMP rules ##################################

pass icmp from ${remote_admins} to me keep-state

#0  - echo reply
#3  - destination unreachable
#4  - source quench
#5  - redirect
#8  - echo request
#9  - router adver-tisement
#10 - router solicitation
#11 - time-to-live exceeded
#12 - IP header bad
#13 - timestamp request
#14 - timestamp reply
#15 - information request
#16 - information reply
#17 - address mask request
#18 - and address mask reply

# Allow Destination Unreachable, Source Quench, Time Exceeded, and Bad Header
pass icmp from any to any icmptypes 0,3,4,8,11,12

# ICMP from outside
#pass icmp from any           to ${outside_ip} in  icmptypes 0,3,4,11,12
#pass icmp from ${outside_ip} to any           out icmptypes 0,3,8,12

# Deny the rest of them
deny log icmp from any to any
deny log all from any to any
#skipto 65534 ip from any to any
Конфиг с боевого сервера, много чего я вырезал, если скопипастить, может не заработать
net.inet.ip.fw.one_pass: 0

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-27 5:33:36
kharkov_max
Не думаю что проблема с алиасом, вот если бы пакеты попадали в out и нат out а дальше не шли, вот тогда да ...
Проблема в фаерволе, чего то я не докрутил, недопонял.

Palich

Спасибо конечно, но Ваш пример для меня достаточно крут ))), это мой следующий левел.

Как я понял keep-state Вы включаете на внутреннем интерфейсе, и в этом фишка ...
В кратце можете прокоментировать как работает ... принцип ...

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-28 22:16:14
Palych
kharkov_max
Если бы я привёл полный конфиг, было бы ещё сложнее, конфиг с боевого сервера, для частного случая можно упростить.
addcmd setfib 1 tagged 1 keep-state - здесь устанавливается таблица маршрутизации 1 (default getaway - интерфейс с которого пришел пакет) и создаётся динамическое динамическое правило для пакетов на ВНУТРЕННЕМ интерфейсе, которые пришли с внешнего, занатились, ПОМЕТИЛИСЬ tag 1и пришли на внутренний. Затем они попадут на комп в локалке, откуда будет выдан ответный пакет на IP и порт, с которого пришел первый пакет, попадут на внутренний интерфейс, где попадут в созданное до того динамическое правило (addcmd check-state) (динамическое правило - это ИП и порт наоборот, если пакет пришел с 1.1.1.1:1 на 2.2.2.2:2 то динамическое правило будет setfib 1 tcp from 2.2.2.2:2 to 1.1.1.1:1) получит таблицу маршрутизации fib 1 и вуаля, пойдёт в интерфейс какой надо. Не забывайте, что пакет проходит правила по новой для каждого интерфейса, команда для просмотра динамических правил ipfw -d show. Удачи

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-30 13:00:00
kharkov_max
И так, небольшая победа.
Огромное спасибо Palych
Мой приведенный выше конфиг превратился в такой:

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

ext_if = "vr0"
int_if = "em0"
ext_gateway_ip = "111.111.111.111"
ext_gateway_ip_alias = "222.222.222.222"
jabber_server = "192.168.0.1"
int_lan= "192.168.0.0/24
.....

${fw} nat 2 config ip ${ext_gateway_ip_alias} reset same_ports deny_in \
            redirect_port tcp ${jabber_server}:5223 5223

# ======= Все что приходит на алиас основного IP метим и пересылаем по правилам ниже =======
${fw} add skipto 20000 tag 1 log all from any to ${ext_gateway_ip_alias} in via ${ext_if}

################################ Фильтрация на 1м внешнем интерфейсе ext_gateway_ip ######################
.......
Тут все работает


######################## Фильтрация на 2м внешнем интерфейсе ext_gateway_ip_alias ########################
${fw} add 20000 setfib 1 log tcp from any to ${int_lan} keep-state tagged 1

======================== Редирект портов через Nat ====================================================
${fw} add allow nat 2 log tcp from ${jabber_server} 5223  to any out via ${ext_if}
${fw} add allow log tcp from ${ext_gateway_ip_alias} 5223 to any out via ${ext_if}

${fw} add nat 2 log tcp from any to ${ext_gateway_ip_alias} 5223 in via ${ext_if}
${fw} add allow log tcp from any to ${jabber_server} 5223        in via ${ext_if}
# =======================================================================================================
##########################################################################################################

${fw} add 40000 allow all from any to any via ${int_if} # Тут разрешено все и все работает

# Default deny, запрещено все что выше не прошло.
${fw} add 65534 deny ip from any to any
В результате на алиасе основоного интерфейса заработал проброс портов в локалку (на ПК в локальной сети ${int_lan} ).
Так
${fw} add 20000 setfib 1 log tcp from any to ${int_lan} keep-state tagged 1
сделал потому, что на алиасе на самом шлюзе висят определенные сервисы и если сделать так
${fw} add 20000 setfib 1 log keep-state tagged 1
то они отваливались.

Что не работает.
На внутреннем интерфейсе шлюза висит пару клеток (jail), порты которых необходимо выставить на алиас внешнего интерфейса.
Собственно jabber висит в клетке.
При реализации описанной мной выше такой проброс работает только в локалку (на ПК), но не работает на алиас внутреннего интерфейса шлюза.
В логе IPFW видно только in пакеты в правилах, пакетов out нет ...

Прошу помощи в дальнейшем "допиливании" конфига.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-30 13:17:19
kharkov_max
Похоже что пакетам предназначеным для алиаса внутреннего интерфейса не задается нужный fib ...

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-30 15:21:55
kharkov_max
Мда, видимо данный вопрос более чем связан непосредственно с jail и его маршрутизацией, нежели с данным конфигом ipfw.

Подкинул проброс порта алиаса внешнего интерфейса на порт внутреннего интерфейса шлюза - все работает.
Если делаю проброс порта алиаса внешнего интерфейса на порт в клетку - нет.
Хотя с основного интерфейса проброс порта в клетку работает.

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-04-30 15:36:27
kharkov_max
Обратил внимание на то что IP адрес (алиас внутреннего интерфейса) jail присутствует в таблице fib 0.
А в таблице fib 1 его нет.

Не в этом ли дело ?
Если да, то как правильно добавить в fib 1 роут для jail ?

Хотя вероятно это не так, ведь в fib 1 есть дефаулт роут и все должно пойти в него ...

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-05-05 11:16:43
kharkov_max
UP

Собственно 1я часть задачи успешно решена, заработал SBR из инета (2х разных внешних интерфейсов) в локалку.

Теперь более "сложная" часть.
Хочу перефразировать свой изначальный вопрос и проблему.

Как в ipfw реализовать SBR с двух внешних интерфейсов разных провайдеров, в jail, который привязан к алиасу внутреннего интерфейса и изначально привязан к fib0 ?

Т.е. на внутреннем интерфейсе висит клетка, ip клетки в сети внутреннего интерфейса, при создании клетки она, по умолчанию, садится на fib0.
Видимо правила применяемые для проброса портов в локалку (описанные выше), по каким то причинам не работают с jail.
Т.е. пакеты которые пришли в jail по 2му внешнему интерфейсу, должны уйти по fib1, а уходят в инет по fib0.
Правило

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

${fw} add 20000 setfib 1 log tcp from any to ${int_lan} keep-state tagged 1
не работает.
Как я понимаю для jail не устанавливаются keep-state ( динамические правила ).

Re: IPFW kernel NAT alias -> PBR

Добавлено: 2012-05-10 11:06:07
kharkov_max
Upp