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

Проблема с rdr в pf

Добавлено: 2009-07-29 12:28:32
kron
Господа возникла такая проблема, стоит роутер на FreBSD 7.0, работает давольно давно и продуктивно, но понадобилось поднять МТА, решил поднять postfix+dovecot с авторизацией в ldap, поднять поднял, внутри сети пашет, настраиваю редирект в pf, но грабли в том что письма внутрь не проходят, ситуация такая:
роутер:192.168.217.254
постфикс: 192.168.217.252
со инета telnet не может достучаться
Настройки в pf

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

mail_srv="192.168.217.252"
rdr on $ext_if inet proto tcp from any to $external_addr port 995 -> 192.168.217.252 port 995
rdr on $ext_if inet proto tcp from any to $external_addr port 993 -> 192.168.217.252 port 993
rdr on $ext_if inet proto tcp from any to $external_addr port 25 -> $mail_srv port 25
rdr on $ext_if inet proto tcp from any to $external_addr port 110 -> $mail_srv port 110
pass in on $ext_if inet proto tcp from any to $mail_srv port { 25, 110, 993, 995 } keep state
В логах pf встречается такое

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

1. 609517 IP 192.168.217.252.25 > 87.237.112.7.55296:  tcp 24 [bad hdr length 8 - too short, < 20]
3. 198259 IP 192.168.217.252.25 > 87.237.112.7.55296:  tcp 24 [bad hdr length 8 - too short, < 20]
2. 999918 IP 192.168.217.252.25 > 87.237.112.7.55296:  tcp 24 [bad hdr length 8 - too short, < 20]
6. 000174 IP 192.168.217.252.25 > 87.237.112.7.55296:  tcp 16 [bad hdr length 16 - too short, < 20]
Подскажите где грабли.

Re: Проблема с rdr в pf

Добавлено: 2009-07-29 14:09:10
kron
Вопрос несколько снялся, но проблема не решилась, проброс идет, тока все равно косяк где-то в правилах, но это не стоит обсуждения

Re: Проблема с rdr в pf

Добавлено: 2009-07-29 15:40:33
kron
Так и не смог сам решить, редирект отрабатывает, а вот на возврате затык, ни кто с таким не встречался?

Re: Проблема с rdr в pf

Добавлено: 2009-07-29 21:05:59
ban
что есть $external_addr ?

в руки тебе tcpdump, использовать можно например так:
# tcpdump -tn -i <твой интерфейс> port 995

задачи:
1) убедиться, что на $ext_if пакеты приходят на вышеозвученные порты
2) убедиться, что пакеты доходят на внутренний интерфейс роутера по тем же портам (если не доходят, то правило pass на внешнем)
3) если на внутренний интерфейс пакеты приходят, значит надо убедиться что они из него Выходят (если не выходят, то правило pass на внутреннем)

весь конфиг покажи

Re: Проблема с rdr в pf

Добавлено: 2009-07-29 21:45:51
GreenT
попробуй что нибудь вроди

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

mail_srv="{192.168.217.252}"
mail_srv_port = "{995,993,25,110}"
rdr pass on $ext_if  inet proto tcp from any to port $mail_srv_port -> $mail_srv
во всяком случае у меня такие правила работают

Re: Проблема с rdr в pf

Добавлено: 2009-07-30 7:52:25
kron
Пакеты доходят и выходят обратно, но роутер их в инет не пущает, а по правилу keep state должен. А весь конфиг страниц на 5 много разрешений для разных ПК.

Правила попробую отпишусь

Re: Проблема с rdr в pf

Добавлено: 2009-07-30 10:15:20
kron
Правила не помогли, собственно уже не знаю даже куда рыть, уже pf в ядро загрузил, а не модулем. Проблему решить не могу.
# Internet
ext_if="re1"
external_addr="217.195.xxx.xxx"

# Local network
int_if="re0"
internal_addr="192.168.xxx.xxx"
internal_net="192.168.xxx.0/24"

# Servers
spbfs="192.168.xxx.xxx"
mail_srv="192.168.xxx.xxx"
mail_srv_port="{ 25, 110, 993, 995 }"

table <me> const { $external_addr, $internal_addr }

# Redirect table
rdr on $int_if inet proto tcp from $internal_net to any port { 80, 8080 } -> 127.0.0.1 port 3128
rdr on $ext_if inet proto tcp from any to $external_addr port $mail_srv_port -> $mail_srv

# Block
block in log all
block on $ext_if from <sshblocked> to <me>

# Update
pass in on $int_if inet proto tcp from { $spbfs, $mail_srv } to any keep state

# ICMP
pass in inet proto icmp from any to any keep state

#ICQ, Jabber, Mail agent
pass in on $int_if inet proto udp from $internal_net to any port 5190 keep state
pass in on $int_if inet proto tcp from $internal_net to any port 5190 keep state

# Mail
pass in on $int_if inet proto tcp from $internal_net to $mail_ru port { 25, 110, 135, 143, 465, 993, 995 } keep state
pass in on $int_if inet proto tcp from $internal_net to $list_ru port { 25, 110, 135, 143, 465, 993, 995 } keep state
pass in on $int_if inet proto tcp from $internal_net to $smtp_mail port 25 keep state
#pass in on $ext_if inet proto tcp from any to $external_addr port { 25, 110, 143, 465, 993, 995 } keep state
pass in on $int_if inet proto tcp from $internal_net to $argus port { 25, 110 } keep state
pass in on $int_if inet proto tcp from $internal_net to $list2_ru port { 25, 110, 135, 143, 465, 993, 995 } keep state
pass in on $int_if inet proto tcp from $internal_net to { $pop_mail, $smtp_mail } port { 25, 110, 135, 143, 465, 993, 995 } keep state
pass in on $ext_if inet proto tcp from any to $mail_srv port { 25, 110, 993, 995 } keep state
#pass in on $int_if inet proto tcp from $mail_srv to any port { 25, 110, 993, 995 } keep state
# DNS, DHCP
pass in on $int_if inet proto tcp from $internal_net to $internal_addr port 389 keep state
pass in on $int_if inet proto udp from $internal_net to $internal_addr port 389 keep state
pass in on $int_if inet proto udp from $internal_net to $internal_addr port { 53, 67, 68, 88 } keep state
pass in on $int_if inet proto tcp from $internal_net to $internal_addr port { 53, 67, 68, 88 } keep state
pass in on $ext_if inet proto udp from any to $external_addr port 53 keep state

# Samba
pass in on $int_if inet proto udp from $internal_net to $internal_addr port { 137, 138 } keep state
pass in on $int_if inet proto tcp from $internal_net to $internal_addr port { 139, 445 } keep state

# Unlim
pass in on $int_if from { $my_comp, $id_comp, $gd_comp, $gb_comp, $mail_srv } to any keep state
pass in on $int_if from $internal_net to $internal_addr keep state

# out ext
pass out from <me> to any keep state
Это основные конфиги, все что связано с мылом оставил как есть, может там у меня где ошибка, на неописанные имена не обращайте внимания они описаны, но сюда не выложены

Re: Проблема с rdr в pf

Добавлено: 2009-07-30 10:54:19
GreenT
во первых я бы написал

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

rdr pass on $ext_if inet proto tcp from any to $external_addr port $mail_srv_port -> $mail_srv
именно со словом pass

во вторых
если роутер не выпускает попробуй вторым правилом написать

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

pass out keep state

Re: Проблема с rdr в pf

Добавлено: 2009-07-30 11:24:49
GreenT
еще можно воспользоваться

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

tcpdump -e -t -n -i pflog0 port 25 
и посмотреть что где и каким правилом блокируется

Re: Проблема с rdr в pf

Добавлено: 2009-07-30 14:10:53
kron

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

rule 0/0(match): block in on re0: 192.168.217.252.25 > 77.241.39.246.62394: [|tcp]
Блочит вот так, тока хз чего ему не хватает, это уже пакет в ответ посланный на запрос, я уже изменил праило что пускать эту тачку во вне только по этим портам, но все равно блочит

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

pass in on $int_if inet proto tcp from $mail_srv to any port { 25, 110, 993, 995 } keep state

Re: Проблема с rdr в pf

Добавлено: 2009-07-30 14:30:29
GreenT
такого

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

rule 0/0(match)
я честно говоря не видел, но понятно что блокирует правило номер ноль, полный список всех правил можно увидеть введя команду

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

pfctl -sr

Re: Проблема с rdr в pf

Добавлено: 2009-07-30 14:44:02
GreenT
В догонку
я бы рекомендовал начинать секцию фильтрации с

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

anchor "ftp-proxy/*"
block log(all) all
pass out log keep state
pass in log(all) inet proto icmp all icmp-type $icmp_types keep state
и дальше писать правила используя вложенные списки и макросы т.к. конструкции вида

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

{ 25, 110, 143, 465, 993, 995 }
затрудняют понимание.

Re: Проблема с rdr в pf

Добавлено: 2009-07-30 16:14:31
ban
если проблема пока не решена, то разъясни
у тебя на данный момент пакеты не проходят:
1) [откуда] - [через что] - [куда]
2) на основании каких правил (из тех что выложены) они должны двигаться по-твоему