Ситуация в следующем:
- два провайдера с разными сетями;
- primary mx (серый ip);
- secondary mx (серый ip);
- шлюз с 4-мя интерфейсамина шлюзе, к которому заведены оба провайдера, smtp трафик пробрасывается с помощью dnat.
правила абсолютно идентичные, за исключением, конечно имен интерфейсов и ip адресов шлюза и ip адресов mx-ов.первый набор правил работает отлично.
$IPTABLES -t nat -A PREROUTING -i $IF1 -p tcp -d $IP1 --dport $SMTP_PORT -j DNAT --to-destination $MX1_IP$IPTABLES -A FORWARD -i $IF1 -p tcp -m state --state NEW -d $MX1_IP --dport $SMTP_PORT -j ACCEPT
аналогичное правило для интерфейса второго провайдера ни в какую не хочет тарахтеть.счетчики цепочек показывают, что dnat отрабатывает, а в правиле форвардинга по нулям.
т.е. меняется адрес назначения, а дальше пакет пропадает.
сделал совсем радикально, в самом начале FORWARD я поставил правило LOG(на все что форвардится со второго интерфейса в локальную сеть) - ни одного пакета.
Маршруты ко всем этим сетям есть.
В чем еще может быть дело, ума не приложу.
Заранее спасибо за советы.
>- primary mx (серый ip);
>- secondary mx (серый ip);
Вариантов два, либо почта используется cугубо внутри организации, либо ошибка в постановке вопроса. Зачем для primary и secondary mx прописаны серые адреса? быть может прописаны-то нормальные адреса, но на маршрутизаторе делается проброс на серые?>Маршруты ко всем этим сетям есть.
К которым сетям, можно уточнить и как настроена маршрутизация?
В частности интересует default getaway(s)
>>- primary mx (серый ip);
>>- secondary mx (серый ip);
>Вариантов два, либо почта используется cугубо внутри организации, либо ошибка в постановке
>вопроса. Зачем для primary и secondary mx прописаны серые адреса? быть
>может прописаны-то нормальные адреса, но на маршрутизаторе делается проброс на серые?в dns, естественно адреса белые.
я имел ввиду, что сами машинки находятся в локальной сети.
связь с внешним миром обеспечивается на шлюзе через dnat и snat
>>Маршруты ко всем этим сетям есть.
>К которым сетям, можно уточнить и как настроена маршрутизация?
>В частности интересует default getaway(s)на шлюзе четыре интерфеса.
eth0 - локальная сеть (серые ip)
eth1 - локальная сеть еще одной организации (серые ip)
eth2 - сеть провайдера 1 (реальный ip)
eth3 - сеть провайдера 2 (реальный ip)маршрутизация посредствам iproute2
1)
provider_net1 - сеть первого провайдера
provider_net2 - сеть второго провайдераreal_ip1 - 1-й реальный ip шлюза
real_ip2 - 2-й реальный ip шлюзаprovider_gw1 - шлюз первого провайдера
provider_gw2 - шлюз второго провайдера/sbin/ip route show
помимо маршрутов на серые сети
.....
provider_net1 dev eth3 proto kernel scope link src real_ip1
provider_net2 dev eth2 proto kernel scope link src real_ip2
...
default via provider_gw2 dev eth2 src real_ip2
2) правила для выбора адреса источника и интерфейса0: from all lookup local
32764: from real_ip2 lookup T2
32765: from real_ip1 lookup T1
32766: from all lookup main
32767: from all lookup default
3) таблицы T1 и T2/sbin/ip route show table T1
provider_net1 dev eth3 scope link src real_ip1
default via provider_gw2 dev eth3
/sbin/ip route show table T2
provider_net2 dev eth2 scope link src real_ip2
default via provider_gw1 dev eth2только что следил за dnat-нутыми пакетами - после действия dnat в prerouting пакет не появляется в forward.
если dnat не делать, в input пакеты замечательно приходят.
странно, что правило для первого провайдера работает, а для второго - нет.
смотрел настройки sysctl для двух интерфейсов - абсолютно одинаковые.
cat /etc/sysctl.conf.....
net.ipv4.ip_forward = 1net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.icmp_echo_ignore_broadcasts = 0
net.ipv4.icmp_ignore_bogus_error_responses = 0net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_rmem=4096 87380 174760
net.core.rmem_max = 110592
net.core.rmem_default = 110592
net.ipv4.tcp_wmem = 4096 16384 131072
net.core.wmem_max = 110592
net.core.wmem_default = 110592net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth1.rp_filter = 1
net.ipv4.conf.eth2.rp_filter = 1
net.ipv4.conf.eth3.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.eth0.arp_filter = 1
net.ipv4.conf.eth1.arp_filter = 1
net.ipv4.conf.eth2.arp_filter = 1
net.ipv4.conf.eth3.arp_filter = 1
net.ipv4.conf.default.arp_filter = 1net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.eth1.accept_source_route = 0
net.ipv4.conf.eth2.accept_source_route = 0
net.ipv4.conf.eth3.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0
net.ipv4.conf.eth2.accept_redirects = 0
net.ipv4.conf.eth3.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0net.ipv4.conf.eth0.log_martians = 1
net.ipv4.conf.eth1.log_martians = 1
net.ipv4.conf.eth2.log_martians = 1
net.ipv4.conf.eth3.log_martians = 0net.ipv4.ip_no_pmtu_disc = 0
....
пробовал вместо dnat пробрасывать через rinetd, тогда все отлично доставляется на почтавик и обратно.
но для стройности хочется dnat сделать и для второго канала. да и странно это как-то. где протупил - не пойму :(
в Т1 и Т2 добавь маршруты во внутренние сети (сеть), должно помочь, об этом, кстати, написано в документации к iproute2, если мне память не изменяет
>в Т1 и Т2 добавь маршруты во внутренние сети (сеть), должно помочь,
>об этом, кстати, написано в документации к iproute2, если мне память
>не изменяет
да, я читал замечание от Рода Роака (Rod Roark). и первоначально в T1 и T2 были маршруты. я убрал их буквально вчера, так как пробовал разные варианты.как на работу канала 1, так и на работу канала 2, наличие или отсутствие маршрутов к локальным сетям никак не повлияло. поэтому я их убрал.
Но на всякий случай пропиши, я не помню, что именно, но у меня без серых маршрутов что-то не работало.> eth2 - сеть провайдера 1 (реальный ip)
> eth3 - сеть провайдера 2 (реальный ip)> provider_net1 - сеть первого провайдера
> provider_net2 - сеть второго провайдера> provider_net1 dev eth3 proto kernel scope link src real_ip1
> provider_net2 dev eth2 proto kernel scope link src real_ip2случаем не eth3 и eth2 местами поменять не надо в последних двух строках? или опечатка?
>Но на всякий случай пропиши, я не помню, что именно, но у
>меня без серых маршрутов что-то не работало.
>
>> eth2 - сеть провайдера 1 (реальный ip)
>> eth3 - сеть провайдера 2 (реальный ip)
>
>> provider_net1 - сеть первого провайдера
>> provider_net2 - сеть второго провайдера
>
>> provider_net1 dev eth3 proto kernel scope link src real_ip1
>> provider_net2 dev eth2 proto kernel scope link src real_ip2
>
>случаем не eth3 и eth2 местами поменять не надо в последних двух
>строках? или опечатка?
да. спешил во время ответа.
только что добавил серые маршруты - тот же эффект.
/sbin/iptable -L -v -n -t nat
....
2 120 DNAT tcp -- eth3 * 0.0.0.0/0 real_ip2 tcp dpt:25 to:mx2_internal_ip
...
/sbin/iptable -L -v -n -t filter
...
0 0 ACCEPT tcp -- eth3 * 0.0.0.0/0 mx2_internal_ip state NEW tcp dpt:25
...
а у тебя от обоих провайдеров только по одному ip выдано?
>а у тебя от обоих провайдеров только по одному ip выдано?от каждого по сетке 255.255.255.252 (/30).
>>а у тебя от обоих провайдеров только по одному ip выдано?
>
>от каждого по сетке 255.255.255.252 (/30).Один - тебе, один - gw прова, один - сеть и один - бродкаст, значит по одному IP'шнику в твое личное распоряжение... Так, iproute2 значит должен вроде работать нормально.
> $IPTABLES -A FORWARD -i $IF1 -p tcp -m state --state NEW -d $MX1_IP --dport $SMTP_PORT -j ACCEPT
Попробуй без
-m state --state NEW
и с
-m tcp
маловероятно, конечно, что поможет, но...
>>>а у тебя от обоих провайдеров только по одному ip выдано?
>>
>>от каждого по сетке 255.255.255.252 (/30).
>
>Один - тебе, один - gw прова, один - сеть и один
>- бродкаст, значит по одному IP'шнику в твое личное распоряжение... Так,
>iproute2 значит должен вроде работать нормально.
>
>> $IPTABLES -A FORWARD -i $IF1 -p tcp -m state --state NEW -d $MX1_IP --dport $SMTP_PORT -j ACCEPT
>
>Попробуй без
>-m state --state NEW
>и с
>-m tcp
>маловероятно, конечно, что поможет, но...
попробовал без state
$IPTABLES -A FORWARD -i $IF1 -p tcp -d $MX1_IP --dport $SMTP_PORT -j ACCEPTтот же эффект.
пойду убивать себя об стену :) больше ничего не остается
а
$IPTABLES -A FORWARD -i $IF1 -p tcp -m tcp -d $MX1_IP --dport $SMTP_PORT -j ACCEPT
не помогло тоже?Об стену рано, а вот все вычистить и настроить заново, это хорошая идея;-) может где-то что-то осталось лишнее.
>а
>$IPTABLES -A FORWARD -i $IF1 -p tcp -m tcp -d $MX1_IP --dport
>$SMTP_PORT -j ACCEPT
>не помогло тоже?в счетчиках также по нулям.
>Об стену рано, а вот все вычистить и настроить заново, это хорошая
>идея;-) может где-то что-то осталось лишнее.Точно рано, вначале настроить нужно...
к сожалению нет ;-)
iptables изначально настраивал сам. после очень глубокого прочтения разного рода документации. правила то у меня как на ладони. лишнего нету.да и второй канал появился недавно совсем, там кроме двух разрешаюших правил в INPUT (53 tcp и 53 udp) и этого слощасного DNAT нету больше ничего.
пока что идеи иссякли...
>а у тебя от обоих провайдеров только по одному ip выдано?
я бы с большой радостью отказался от nat, но, только по 1-му ip от каждого.
поставь net.ipv4.conf.default.rp_filter в 0 обязательно
и правила в ip rule между серыми сетями
>счетчики цепочек показывают, что dnat отрабатывает, а в правиле форвардинга по нулям.
>
Извиняюсь, если не в тему скажу, так как некогда вчитываться. Так, в порядке бреда.
Может не хватает каких-то опций в ядре?
Я тут впервые настраивал подключение ко второму провайдеру через связку natd-ipfw. Оказалось, что мало иметь в ядре опции IPDIVERT, IPFIREWALL, IPFIREWALL_FORWARD, но обязательно IPFIREWALL_FORWARD_EXTENDED иначе правило fwd в следующем примере не работало.divert natd tcp from ${lan_net} to any 80,443 recv ${lan_if}
fwd ${def2_ip} tcp from ${wan2_ip} to any 80,443
divert natd tcp from any 80,443 to ${wan2_ip} recv ${wan2_if}
pass tcp from any 80,443 to any via ${wan2_if}
deny ip from any to any via ${wan2_if}
>>счетчики цепочек показывают, что dnat отрабатывает, а в правиле форвардинга по нулям.дак получилось или нет настроить? столкнулся с такой же проблемой, грешу на rp_filter
>>>счетчики цепочек показывают, что dnat отрабатывает, а в правиле форвардинга по нулям.
>
>дак получилось или нет настроить? столкнулся с такой же проблемой, грешу на
>rp_filter
да получилось.
когда я открыл для себя iproute2 :) до этого как-то не приходилось...
смысл был в том, что dnat отрабатывал, и пакет убегал через default gateway, а не через второго провайдера.добавил два ip rule, для каждого почтового сервера и сделал две таблицы.
в первой прописал default gateway одного прова, а во второй другого - теперь mx1 и mx2 ходят через разных провайдеров.если не получится, пиши, я сброшу свои правила.
>>>счетчики цепочек показывают, что dnat отрабатывает, а в правиле форвардинга по нулям.
>
>дак получилось или нет настроить? столкнулся с такой же проблемой, грешу на
>rp_filterПравильно грешишь, он виноват:
Была аналогичная проблемма, только провов побольше.
Помогло отключение rp_filter:
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
Столкнулся с подобной проблемой. Если из инета обращаться к сервисам, которые висят непосредственно на шлюзе (например ssh) то соединение происходит нормально по обоим каналам связи. Если же запрос проходит DNAT, то назад в инет он возвращается по default route, игнорируя маршруты, прописаные в Т1 и Т2. Т.е. iproute не отрабатывает.. Может, кто подскажет, куда дальше то копать??
>Столкнулся с подобной проблемой. Если из инета обращаться к сервисам, которые висят
>непосредственно на шлюзе (например ssh) то соединение происходит нормально по обоим
>каналам связи. Если же запрос проходит DNAT, то назад в инет
>он возвращается по default route, игнорируя маршруты, прописаные в Т1 и
>Т2. Т.е. iproute не отрабатывает.. Может, кто подскажет, куда дальше то
>копать??выше решение для статического распределения mx1 в один канал а mx2 в другой
а если надо динамически - с какого пришел маршрута на тот и ушел - вот кто бы подсказал как, тоже себе всю голову сломал
>[оверквотинг удален]
>>он возвращается по default route, игнорируя маршруты, прописаные в Т1 и
>>Т2. Т.е. iproute не отрабатывает.. Может, кто подскажет, куда дальше то
>>копать??
>
>выше решение для статического распределения mx1 в один канал а mx2 в
>другой
>
>а если надо динамически - с какого пришел маршрута на тот и
>ушел - вот кто бы подсказал как, тоже себе всю голову
>сломалтоже надо пробросить с двух каналов на один внутренний хост, тоже не получается