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

Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 9:07:27
technotrance
Здравствуйте!
Решил я настроить почтовый шлюз на FreeBSD. Схема простенькая:
Изображение
Сервер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. Прошу помощи...
Ядро:

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

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

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 10:26:21
dmtr
поставьте нат-правило раньше, и лучше перед

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

allow all from me to any
собственно в вашей нумерации его надо поставить между 50 и 55.

Как только пакет попадает под условия правила, он обрабатывается и следующие правила уже не проходит.

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 10:28:12
harmless
Задвинь правило 75 после ната

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 11:44:11
technotrance
dmtr писал(а):поставьте нат-правило раньше, и лучше перед

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

allow all from me to any
собственно в вашей нумерации его надо поставить между 50 и 55.

Как только пакет попадает под условия правила, он обрабатывается и следующие правила уже не проходит.
Вот это помогло :)
Но возникла другая проблема... Щас почтовые серваки извне не могут подключиться к моему почтовому шлюзу, чтоб передать почту.

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 11:46:02
technotrance
правила вот так сделал:

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

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

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

add 00052 nat 1 all 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

# 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

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 11:49:05
technotrance
Т.е. получается, что щас правила 00100 и 00160 не срабатывают -- сервак не доступен извне никак, даже не пингуется

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 12:26:26
technotrance
Такс... Собственно, положение с правилом 00160 я исправил вот так:

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

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 хх.хх.хх.хх:хх redirect_port tcp хх.хх.хх.хх:465
хх.хх.хх.хх -- это белый ай-пишник сервера...
Как-то бы щас ещё сделать так, чтобы сервер извне пинговать можно было...

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 12:41:09
technotrance
technotrance писал(а):Как-то бы щас ещё сделать так, чтобы сервер извне пинговать можно было...
пинг поправил изменив вот это правило:

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

00052 nat 1 tcp from any to any via em0
вместо tcp стояло all
Правда, из-за этого, щас с зимбровкого сервера пинги во внеху не проходят...
Про прохождение пингов я уже гуглил -- с ними вобще всё плохо... У многих эта проблема встречается. Пинг либо из локалки в внеху проходит, но при этом с самого шлюза пинг не идёт. Либо же, наоборот, со шлюза пинг идёт, но при этом из локалки пинг не идёт :cz2:

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 14:55:43
dmtr
покажите как сейчас выглядит вывод

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

ipfw list

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 17:13:19
technotrance

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

00050 allow ip from any to any via lo0
00052 nat 1 tcp from any to any via em0
00055 allow ip from me to any
00075 allow tcp from any to any established
00100 allow icmp from any to me icmptypes 8 in via em0
00150 allow ip from 172.16.1.100 to me via re0
00160 allow tcp from any to me dst-port 25,465 via em0
00161 allow tcp from any to me dst-port 22,10000,25,465 via re0
00171 allow ip from 172.16.0.62 to any via re0
00172 allow ip from any to 172.16.0.62 via re0
10000 deny ip from any to any
65535 deny ip from any to any

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 17:29:57
harmless
К сожалению не вижу логики в данном наборе правил.

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 17:33:31
technotrance
А что не так?

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 17:37:57
harmless
Смысла нет!
Лучше написать себе что хочешь получить, а потом писать правила
Все понять даст выхлоп

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

ipfw -at list

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 17:43:51
technotrance
Да, собственно, что хотел получить -- я в самом первом посте написал... И с помощью dmtr я это почти и получил...
Единственно что пинги с компа, который за NATом, не проходят...

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

# ipfw -at list
00050     0       0                         allow ip from any to any via lo0
00052  1633  830321 Tue Jan 29 20:19:08 2013 nat 1 tcp from any to any via em0
00055  3952 1580582 Tue Jan 29 20:39:23 2013 allow ip from me to any
00075  4286  967312 Tue Jan 29 20:39:23 2013 allow tcp from any to any established
00100   660   54832 Tue Jan 29 20:39:01 2013 allow icmp from any to me icmptypes 8 in via em0
00150    50   11746 Tue Jan 29 17:28:36 2013 allow ip from 172.16.1.100 to me via re0
00160     0       0                         allow tcp from any to me dst-port 25,465 via em0
00161    59    3540 Tue Jan 29 17:28:35 2013 allow tcp from any to me dst-port 22,10000,25,465 via re0
00171     9     636 Tue Jan 29 20:12:57 2013 allow ip from 172.16.0.62 to any via re0
00172    27    1404 Tue Jan 29 20:01:00 2013 allow ip from any to 172.16.0.62 via re0
10000 40397 4571904 Tue Jan 29 20:39:20 2013 deny ip from any to any
65535     0       0                         deny ip from any to any

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 17:48:07
Гость
technotrance писал(а):Такс... Собственно, положение с правилом 00160 я исправил вот так:

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

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 хх.хх.хх.хх:хх redirect_port tcp хх.хх.хх.хх:465
хх.хх.хх.хх -- это белый ай-пишник сервера...
Как-то бы щас ещё сделать так, чтобы сервер извне пинговать можно было...
Если ставите нат выше то обратите внимание на директиву deny_in

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 17:51:02
technotrance
Гость писал(а): Если ставите нат выше то обратите внимание на директиву deny_in
А я на неё давно внимание обратил :) Если её не поставить, то сервер вобще становится полностью открыт для внехи. А мне этого никак не надо. Только 25-ый и 465-ый порты у сервера должны быть открыты для внешнего мира.

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 18:05:48
Гость
technotrance писал(а): Но возникла другая проблема... Щас почтовые серваки извне не могут подключиться к моему почтовому шлюзу, чтоб передать почту.
Поставить правило 100 выше нат.

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 18:10:30
Гость
technotrance писал(а): Как-то бы щас ещё сделать так, чтобы сервер извне пинговать можно было...
Имелось в виду это.

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 18:20:39
Гость
technotrance писал(а):
Гость писал(а): Если ставите нат выше то обратите внимание на директиву deny_in
А я на неё давно внимание обратил :) Если её не поставить, то сервер вобще становится полностью открыт для внехи. А мне этого никак не надо. Только 25-ый и 465-ый порты у сервера должны быть открыты для внешнего мира.
А для чего тогда правило 10000?

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-29 19:52:27
harmless

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

add 53 nat 1 icmp from any to any via em0
Спасет твою ситуацию и для сервера и для тех кто за натом

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-30 7:37:13
technotrance
Спасло :) Но зато щас сам сервер из внехи не пингуется...

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-30 7:49:28
technotrance
Гость писал(а):А для чего тогда правило 10000?
Ну оно, так то, бесполезно... Ибо опцию IPFIREWALL_DEFAULT_TO_ACCEPT я не стал в ядре включать. Но оно и мешать не должно, ибо стоит в самом конце.

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-30 7:56:27
technotrance
Гость писал(а):А для чего тогда правило 10000?
И кстати, это правило не помогает, если deny_in не стоит.

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-01-30 9:21:36
Гость
А если так?

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

 add 00100 check-state
 add 00200 allow ip from me to any keep-state
 add 00300 allow icmp from any to me icmptypes 8
 add 00400 nat 1 all from any to any via em0
 add 00500 nat 1 icmp from any to any via em0
и т.д.

Re: Прошу помощи знатоков ipfw

Добавлено: 2013-02-02 17:08:58
technotrance
Вобщем, покуралесил я ещё немного и добился желаемого. Правила 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 в линуксе, то я наткнулся вот на такую схемку:
Изображение
И после неё, мне стало всё намного понятнее -- я понял где и какие правила надо подставлять.
Вот и хочу спросить, не натыкался ли кто-нибудь где-нибудь на подобную схемку, но для IPFW? Которая бы также наглядно демонстрировала, как именно трафик проходит через все таблички и правила фаервола?