Здравствуйте!
Решил я настроить почтовый шлюз на FreeBSD. Схема простенькая:
http://technotrance.su/images/4/scheme.png
Сервер2 -- это почтовый шлюз
Сервер1 -- это сервер с зимброй.
Собственно, для почтового шлюза задачи простые:
1. обеспечить серверу1 NAT во внеху.
2. передавать почту с сервера1 дальше в всемирную паутину.
3. обеспечить проброс портов 80 и 443 из внехи к серверу1.
И вот у меня дошло дело до настройки ipfw. Седлал вот так:

# сброс всех правил
-f flush

# разрешить любой доступ через интерфейс-петлю
add 00050 allow all from any to any via lo0

# разрешить любой исходящий трафик с сервера
add 00055 allow all from me to any

# разрешить прохождение пакетов со статусом 'установлен'
# add 00075 allow tcp from any to any established

# разрешить пинг почтового шлюза извне
add 00100 allow icmp from any to me icmptypes 8 in via em0

# разрешить серверу обмениваться любым трификом с локальным DNS-сервером
add 00150 allow all from 172.16.1.100 to me via re0

# открытые порты к серверу.
add 00160 allow tcp from any to me 25,465 via em0
add 00161 allow tcp from any to me 22,10000,25,465 via re0

# разрешить любой трафик с зимброй
add 00171 allow all from 172.16.0.62 to any via re0
add 00172 allow all from any to 172.16.0.62 via re0

# NAT для зимбера и проброс портов к нему
nat 1 config if em0 reset same_ports deny_in redirect_port tcp 172.16.0.62:443 443 redirect_port tcp 172.16.0.62:80 80
add 00180 nat 1 all from any to any via em0

# Запретить всё остальное
add 10000 deny all from any to any

Проблема у меня в том, что если я раскомментирую правило 00075, то у меня не будет работать NAT. А если его закомментировать, то NAT работает, но почтовый шлюз уже не может соединиться с другими серверами по 25-ому порту.
Вот как бы решить эту делему...
Честно говоря, после iptables, я не могу до конца вникнуть в логику работы ipfw. Прошу помощи...

2

Ядро:

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_FORWARD
options IPFIREWALL_NAT
options LIBALIAS
options DUMMYNET
options ROUTETABLES=2
options HZ="1000"

в /etc/sysctl.conf:
net.inet.ip.fw.one_pass=1

3

С фряхой лучше к лисере обратиться =)

MX Linux 21.2 x86_64
Чем больше я работаю админом, тем больше понимаю, насколько волшебна фраза - "Нет технической возможности!"

4

Хм... Продублировал у лисяры...

5

Откройте для себя замечательную опцию log в правилах, которая очень полезна в диагностике проблем. Чтоб увидеть логи на интерфейсе ipfw0, надо выставить переменную net.inet.ip.fw.verbose в 0 и запустить tcpdump.

sysctl net.inet.ip.fw.verbose=0
tcpdump -n -i ipfw0

Попробуйте изменить правила таким образом:

# сброс всех правил
-f flush
# 
add 00010 check-state
# разрешить любой доступ через интерфейс-петлю
add 00050 allow all from any to any via lo0
# разрешить любой исходящий трафик с сервера
add 00055 allow all from me to any keep-state
# разрешить пинг почтового шлюза извне
add 00100 allow icmp from any to me icmptypes 8 in via em0
# разрешить серверу обмениваться любым трификом с локальным DNS-сервером
add 00150 allow all from 172.16.1.100 to me via re0
# открытые порты к серверу.
add 00160 allow tcp from any to me 25,80,443,465 via em0
add 00161 allow tcp from any to me 22,10000,25,465 via re0
# NAT для зимбера и проброс портов к нему
nat 1 config if em0 reset same_ports redirect_port tcp 172.16.0.62:443 443 redirect_port tcp 172.16.0.62:80 80
add 00180 nat 1 all from any to any via em0
# разрешить любой трафик с зимброй
add 00190 allow all from 172.16.0.62 to any keep-state
add 00191 allow tcp from any to 172.16.0.62 80,443
# Запретить всё остальное
add 10000 deny log all from any to any

6

Собственно, на форуме лисяры подсказали наиболее правильное решение:

# сброс всех правил
-f flush

# разрешить любой доступ через интерфейс-петлю
add 00050 allow all from any to any via lo0

# NAT для зимбера
nat 1 config if em0 reset same_ports deny_in redirect_port tcp 172.16.0.62:443 443 redirect_port tcp 172.16.0.62:80 80 redirect_port tcp <белый ip>:25 25 redirect_port tcp <белый ip>:465 465
add 00052 nat 1 tcp from any to any via em0

# разрешить любой исходящий трафик с сервера
add 00055 allow all from me to any

# разрешить прохождение пакетов со статусом 'установлен'
add 00075 allow tcp from any to any established

# разрешить пинг почтового шлюза извне
add 00100 allow icmp from any to me icmptypes 8 in via em0

# разрешить серверу обмениваться любым трификом со DNS-сервером
add 00150 allow all from 172.16.1.100 to me via re0

# открытые порты к серверу.
add 00160 allow tcp from any to me 25,465 via em0
add 00161 allow tcp from any to me 22,10000,25,465 via re0

# разрешить любой трафик с зимброй
add 00171 allow all from 172.16.0.62 to any via re0
add 00172 allow all from any to 172.16.0.62 via re0

# Запретить всё остальное
add 10000 deny all from any to any

Правда, при таком раскладе, пинг из локалки (т.е. с зимбровкого сервера) во внеху не проходит...

7

Вобщем, покуралесил я ещё немного и добился желаемого. Правила ipfw такие:

# сброс всех правил
-f flush

# разрешить любой доступ через интерфейс-петлю
add 00050 allow all from any to any via lo0

# разрешить любой трафик с моим компом
add 00051 allow all from 172.16.1.2 to any via re0
add 00052 allow all from any to 172.16.1.2 via re0

# NAT для зимбера. Опцию переноса строк "\" надо убрать, все должно быть в одну строчку
nat 1 config if em0 reset same_ports deny_in redirect_port tcp 172.16.0.62:443 443 redirect_port tcp 172.16.0.62:80 \
\ 80 redirect_port tcp <белый ip>:25 25 redirect_port tcp <белый ip>:465 465
add 00053 nat 1 tcp from any to any via em0

# второй NAT, чтобы проходил ping везде
nat 2 config if em0 reset same_ports
add 00054 nat 2 icmp from any to any icmptypes 0,8 via em0

# разрешить любой исходящий трафик с сервера
add 00055 allow all from me to any

# разрешить прохождение пакетов со статусом 'установлен'
add 00075 allow tcp from any to any established

# разрешить весь icmp трафик
add 00100 allow icmp from any to any

# разрешить серверу обмениваться любым трификом со DNS-сервером
add 00150 allow all from 172.16.1.100 to me via re0

# открытые порты к серверу.
add 00160 allow tcp from any to me 25,465 via em0
add 00161 allow tcp from any to me 22,10000,25,465 via re0

# разрешить любой трафик с зимброй
add 00171 allow all from 172.16.0.62 to any via re0
add 00172 allow all from any to 172.16.0.62 via re0

# Запретить всё остальное
add 10000 deny all from any to any

при этом, что имею:
- сервер открыт извне только по портам 25 и 465 и для пинга.
- сервер обеспечивает проброс 80 и 443 портов извне до машины с зимброй.
- сервер обеспечивает NAT во внеху для машины с зимброй. В том числе и NAT для пинга.
Собственно, для прохождения пинга пришлось создать второй nat просто...
Возможно, тему стоит и закрыть, но я бы у вас, камрады, хотел бы спросить ещё кое-что. Дело в том, что я всё равно так до конца и не понял логику работы ipfw. А понять бы её очень хотелось. В своё время, когда учился работать с iptables в линуксе, то я наткнулся вот на такую схемку:
http://www.opennet.ru/docs/RUS/iptables/misc/iptables-tutorial/images/tables_traverse.jpg
И после неё, мне стало всё намного понятнее -- я понял где и какие правила надо подставлять.
Вот и хочу спросить, не натыкался ли кто-нибудь где-нибудь на подобную схемку, но для IPFW? Которая бы также наглядно демонстрировала, как именно трафик проходит через все таблички и правила фаервола?

8

Там нет цепочек подобных iptables, нет никаких таблиц. Логика совсем другая, похожая больше на acl у Cisco.
Есть входящий и исходящий трафик, есть интерфейсы, есть протоколы и порты и все. Максимум что есть еще, это номера правил.
Так что в данном случае очень важно смотреть куда и какой трафик вы хотите впускать и выпускать.