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

FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 12:33:47
Alekc
Добрый день.

Пытаюсь разобраться в ipfw nat. Схема такая: есть сервер FreeBSD с IPFW, есть три сети. Внутренняя - int0, внешняя - ext0 и изолированная sub0. Требуется настроить чтобы пакеты между сетями int0 и sub0 роутились, а из сети int0 в сеть ext0 - NATились. sub0 в ext0 соответственно доступа иметь не должна. Но затык возникает уже на этапе настройки ната...

соответственно настройки:

/etc/rc.conf

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

ifconfig_em0_name="ext0"
ifconfig_ext0="SYNCDHCP -rxcsum -txcsum -tso"
ifconfig_em1_name="int0"
ifconfig_int0="inet 192.168.36.254 netmask 255.255.255.0"
ifconfig_em2_name="sub0"
ifconfig_sub0="inet 192.168.52.254 netmask 255.255.255.128"

gateway_enable="YES"
firewall_enable="YES"
firewall_nat_enable="YES"
#firewall_nat_interface="ext0"
firewall_logging="YES"
firewall_type="/etc/firewall"
/etc/firewall

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

# Правила для локальной сети
add 1010 allow all from any to any via int0.
add 1020 allow all from any to any via sub0.

# Правила для роутера
add 1520 allow udp from me to any ntp out via ext0 keep-state
add 1530 allow tcp from me to any out via ext0 setup keep-state uid root

# Доступ к ДНС и ДХЦП
add 2010 allow tcp from any to 192.168.212.2 53 out via ext0 setup keep-state
add 2020 allow udp from any to 192.168.212.2 53 out via ext0 keep-state
add 2030 allow tcp from any to 192.168.212.3 53 out via ext0 setup keep-state
add 2040 allow udp from any to 192.168.212.3 53 out via ext0 keep-state

# SSH и пинги из внешней сети
add 3010 allow log tcp from any to me ssh in recv ext0 keep-state
add 3020 allow log icmp from any to me via ext0 keep-state

# Настройка NAT
nat 1 config log if ext0 reset same_ports deny_in
add 10000 nat 1 ip from 192.168.36.0/24 to any out xmit ext0
add 10010 nat 1 ip from any to 192.168.36.0/24 in recv ext0

#add 15000 allow all from any to any
# Запретим все что не разрешено и в журнал
add 20000 deny all from any to any
one.pass = 1

При этом при пинге с машины 192.168.36.50 пакеты уходят на роутер, натятся во внешнюю подсеть, доходят до адресата, возвращаются на роутер и там пропадают (смотрел tcpdump'ом на ext0 и int0). Правило 10010 не отрабатывает ни разу. Если включить правило 15000, то ничего не меняется.

Кто-нибудь может подсказать, что и где я делаю не так?..

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 12:47:23
skeletor
потому что должно быть так:

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

add 10010 nat 1 ip from any to ${EXT_IP} in recv ext0

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 12:57:21
Alekc
Спасибо! Теперь работает.
Увы, нигде так и не смог найти описания команды add nat :(

Тогда в команде 10000 под "to any" понимается внешний адрес в интернете?..

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

add 10000 nat 1 ip from 192.168.36.0/24 to any out xmit ext0

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 13:11:19
snorlov
Alekc писал(а):Спасибо! Теперь работает.
Увы, нигде так и не смог найти описания команды add nat :(
Тогда в команде 10000 под "to any" понимается внешний адрес в интернете?..

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

add 10000 nat 1 ip from 192.168.36.0/24 to any out xmit ext0
Любой ...

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 15:03:20
lazhu
А зачем вообще нужно правило 10010? Оно тут лишнее, при установленном соединении входящие пакеты будут натиться по записи в таблице.
И, кстати, dhcp слушает на 67 порту.

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 15:06:43
Alekc
lazhu писал(а):А зачем вообще нужно правило 10010? Оно тут лишнее, при установленном соединении входящие пакеты будут натиться по записи в таблице.
Я так понимаю, что именно это правило и заставляет приходящие пакеты натиться по таблице, т.к. без него не работает.

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 15:09:52
lazhu
В 10000 правиле вместо out xmit поставьте via

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 15:15:33
Alekc
lazhu писал(а):В 10000 правиле вместо out xmit поставьте via
Ничего не поменялось.
У меня же 10000 правило не from any to any, которое работает в обе стороны, а from {net} to any, а оно в обратную сторону не работает.

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 15:23:08
lazhu
Упс, извиняюсь, не обратил внимания. Тогда в обратку должно работать from any to me

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-25 16:15:33
Alekc
lazhu писал(а):Упс, извиняюсь, не обратил внимания. Тогда в обратку должно работать from any to me
Ага, так работает, спасибо.

Re: FreeBSD 9 + ipfw + ipfw nat

Добавлено: 2013-09-27 9:25:04
Alekc
В итоге получилось что-то такое:

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

# Правила для локальной сети
add 1000 allow all from 192.168.36.0/24 to any via int0 
add 1010 allow all from any to 192.168.36.0/24 via int0
add 1020 allow all from 192.168.36.0/24 to 192.168.52.128/25 recv int0 keep-state

# Доступ к ДНС и ДХЦП, 'from me' - потому что NAT.
add 2000 allow tcp from me to any domain via ext0 setup keep-state
add 2010 allow log udp from me to any domain via ext0 keep-state

# Правила для роутера
add 2510 allow udp from me to any ntp out via ext0 keep-state
add 2520 allow tcp from me to any out via ext0 setup keep-state uid root

# SSH на роутер из внешней сети
add 2600 allow tcp from any to me ssh in recv ext0 setup keep-state
add 2610 allow tcp from me ssh to any out xmit ext0 keep-state
add 2620 allow icmp from me to any keep-state

# Настройка NAT
nat 1 config log if ext0 reset same_ports
nat 2 config log same_ports redirect_addr 192.168.36.50 192.168.3.245

# Маппинг серверного IP
add 8000 nat 2 log ip from 192.168.36.50 to any out xmit ext0
add 8010 nat 2 log ip from any to 192.168.3.245 in recv ext0

add 10000 nat 1 log ip from 192.168.36.0/24 to any out xmit ext0
add 10010 nat 1 log ip from any to me recv ext0

# Разрешим входящие пинги роутера из внешней сети
add 10020 allow icmp from any to me in recv ext0

# Запретим все что не разрешено
add 20000 deny all from any to any
Требуемая схема взаимодействия между сетями: ext0 <- NAT -> int0 ---> sub0

Есть тут какие-нибудь явные или неявные косяки?..