URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 69133
[ Назад ]

Исходное сообщение
"2 isp и 2 dnat - голова уже пухнет"

Отправлено chocholl , 25-Сен-06 18:48 
Ситуация в следующем:
- два провайдера с разными сетями;
- 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(на все что форвардится со второго интерфейса в локальную сеть)  -  ни одного пакета.


Маршруты ко всем этим сетям есть.
В чем еще может быть дело, ума не приложу.


Заранее спасибо за советы.


Содержание

Сообщения в этом обсуждении
"2 isp и 2 dnat - голова уже пухнет"
Отправлено Эдмон , 26-Сен-06 11:26 
>- primary mx (серый ip);
>- secondary mx (серый ip);
Вариантов два, либо почта используется cугубо внутри организации, либо ошибка в постановке вопроса. Зачем для primary и secondary mx прописаны серые адреса? быть может прописаны-то нормальные адреса, но на маршрутизаторе делается проброс на серые?

>Маршруты ко всем этим сетям есть.
К которым сетям, можно уточнить и как настроена маршрутизация?
В частности интересует default getaway(s)


"2 isp и 2 dnat - голова уже пухнет"
Отправлено chocholl , 26-Сен-06 12:49 
>>- 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 = 1

net.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 = 0

net.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 = 110592

net.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 = 1

net.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 = 1

net.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 = 0

net.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 = 0

net.ipv4.ip_no_pmtu_disc = 0
....


пробовал вместо dnat пробрасывать через rinetd, тогда все отлично доставляется на почтавик и обратно.
но для стройности хочется dnat сделать и для второго канала. да и странно это как-то. где протупил - не пойму :(


"2 isp и 2 dnat - голова уже пухнет"
Отправлено Эдмон , 26-Сен-06 12:59 
в Т1 и Т2 добавь маршруты во внутренние сети (сеть), должно помочь, об этом, кстати, написано в документации к iproute2, если мне память не изменяет

"2 isp и 2 dnat - голова уже пухнет"
Отправлено chocholl , 26-Сен-06 13:06 
>в Т1 и Т2 добавь маршруты во внутренние сети (сеть), должно помочь,
>об этом, кстати, написано в документации к iproute2, если мне память
>не изменяет


да, я читал замечание от Рода Роака (Rod Roark). и первоначально в T1 и T2 были маршруты. я убрал их буквально вчера, так как пробовал разные варианты.

как на работу канала 1, так и на работу канала 2, наличие или отсутствие маршрутов к локальным сетям никак не повлияло. поэтому я их убрал.



"2 isp и 2 dnat - голова уже пухнет"
Отправлено Эдмон , 26-Сен-06 13:15 
Но на всякий случай пропиши, я не помню, что именно, но у меня без серых маршрутов что-то не работало.

> 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 местами поменять не надо в последних двух строках? или опечатка?


"2 isp и 2 dnat - голова уже пухнет"
Отправлено chocholl , 26-Сен-06 13:22 
>Но на всякий случай пропиши, я не помню, что именно, но у
>меня без серых маршрутов что-то не работало.
>
>> 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
...



"2 isp и 2 dnat - голова уже пухнет"
Отправлено Эдмон , 26-Сен-06 13:27 
а у тебя от обоих провайдеров только по одному ip выдано?

"2 isp и 2 dnat - голова уже пухнет"
Отправлено chocholl , 26-Сен-06 13:31 
>а у тебя от обоих провайдеров только по одному ip выдано?

от каждого по сетке 255.255.255.252 (/30).


"2 isp и 2 dnat - голова уже пухнет"
Отправлено Эдмон , 26-Сен-06 13:51 
>>а у тебя от обоих провайдеров только по одному 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
маловероятно, конечно, что поможет, но...


"2 isp и 2 dnat - голова уже пухнет"
Отправлено chocholl , 26-Сен-06 14:07 
>>>а у тебя от обоих провайдеров только по одному 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

тот же эффект.
пойду убивать себя об стену :) больше ничего не остается



"2 isp и 2 dnat - голова уже пухнет"
Отправлено Эдмон , 26-Сен-06 14:12 
а
$IPTABLES -A FORWARD -i $IF1 -p tcp -m tcp -d $MX1_IP --dport $SMTP_PORT -j ACCEPT
не помогло тоже?

Об стену рано, а вот все вычистить и настроить заново, это хорошая идея;-) может где-то что-то осталось лишнее.


"2 isp и 2 dnat - голова уже пухнет"
Отправлено chocholl , 26-Сен-06 14:23 

>$IPTABLES -A FORWARD -i $IF1 -p tcp -m tcp -d $MX1_IP --dport
>$SMTP_PORT -j ACCEPT
>не помогло тоже?

в счетчиках также по нулям.

>Об стену рано, а вот все вычистить и настроить заново, это хорошая
>идея;-) может где-то что-то осталось лишнее.

Точно рано, вначале настроить нужно...

к сожалению нет ;-)
iptables изначально настраивал сам. после очень глубокого прочтения разного рода документации. правила то у меня как на ладони. лишнего нету.

да и второй канал появился недавно совсем, там кроме двух разрешаюших правил в INPUT (53 tcp и 53 udp) и этого слощасного DNAT нету больше ничего.



"2 isp и 2 dnat - голова уже пухнет"
Отправлено Эдмон , 26-Сен-06 14:32 
пока что идеи иссякли...

"2 isp и 2 dnat - голова уже пухнет"
Отправлено chocholl , 26-Сен-06 13:50 
>а у тебя от обоих провайдеров только по одному ip выдано?


я бы с большой радостью отказался от nat, но, только по 1-му ip от каждого.


"2 isp и 2 dnat - голова уже пухнет"
Отправлено deep_admin , 30-Сен-06 15:20 
поставь net.ipv4.conf.default.rp_filter в 0 обязательно
и правила в ip rule между серыми сетями

"2 isp и 2 dnat - голова уже пухнет"
Отправлено Johhn , 29-Сен-06 14:36 
>счетчики цепочек показывают, что 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}



"2 isp и 2 dnat - голова уже пухнет"
Отправлено Plazmid , 23-Янв-07 15:55 
>>счетчики цепочек показывают, что dnat отрабатывает, а в правиле форвардинга по нулям.

дак получилось или нет настроить? столкнулся с такой же проблемой, грешу на rp_filter


"2 isp и 2 dnat - голова уже пухнет"
Отправлено andrey , 23-Янв-07 18:37 
>>>счетчики цепочек показывают, что dnat отрабатывает, а в правиле форвардинга по нулям.
>
>дак получилось или нет настроить? столкнулся с такой же проблемой, грешу на
>rp_filter


да получилось.
когда я открыл для себя iproute2 :) до этого как-то не приходилось...


смысл был в том, что dnat отрабатывал, и пакет убегал через default gateway, а не через второго провайдера.

добавил два ip rule, для каждого почтового сервера и сделал две таблицы.
в первой прописал default gateway одного прова, а во второй другого - теперь mx1 и mx2 ходят через разных провайдеров.

если не получится, пиши, я сброшу свои правила.


"2 isp и 2 dnat - голова уже пухнет"
Отправлено Darrax , 27-Авг-08 12:39 
>>>счетчики цепочек показывают, что dnat отрабатывает, а в правиле форвардинга по нулям.
>
>дак получилось или нет настроить? столкнулся с такой же проблемой, грешу на
>rp_filter

Правильно грешишь, он виноват:

Была аналогичная проблемма, только провов побольше.
Помогло отключение rp_filter:
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0


"2 isp и 2 dnat - голова уже пухнет"
Отправлено ktulhu99 , 13-Фев-07 19:14 
Столкнулся с подобной проблемой. Если из инета обращаться к сервисам, которые висят непосредственно на шлюзе (например ssh) то соединение происходит нормально по обоим каналам связи. Если же запрос проходит DNAT, то назад в инет он возвращается по default route, игнорируя маршруты, прописаные в Т1 и Т2. Т.е. iproute не отрабатывает.. Может, кто подскажет, куда дальше то копать??

"2 isp и 2 dnat - голова уже пухнет"
Отправлено zuzuk , 17-Июн-10 01:24 
>Столкнулся с подобной проблемой. Если из инета обращаться к сервисам, которые висят
>непосредственно на шлюзе (например ssh) то соединение происходит нормально по обоим
>каналам связи. Если же запрос проходит DNAT, то назад в инет
>он возвращается по default route, игнорируя маршруты, прописаные в Т1 и
>Т2. Т.е. iproute не отрабатывает.. Может, кто подскажет, куда дальше то
>копать??

выше решение для статического распределения mx1 в один канал а mx2 в другой

а если надо динамически - с какого пришел маршрута на тот и ушел - вот кто бы подсказал как, тоже себе всю голову сломал


"2 isp и 2 dnat - голова уже пухнет"
Отправлено georglk , 25-Авг-10 08:02 
>[оверквотинг удален]
>>он возвращается по default route, игнорируя маршруты, прописаные в Т1 и
>>Т2. Т.е. iproute не отрабатывает.. Может, кто подскажет, куда дальше то
>>копать??
>
>выше решение для статического распределения mx1 в один канал а mx2 в
>другой
>
>а если надо динамически - с какого пришел маршрута на тот и
>ушел - вот кто бы подсказал как, тоже себе всю голову
>сломал

тоже надо пробросить с двух каналов на один внутренний хост, тоже не получается