LINUX.ORG.RU
ФорумAdmin

Advanced routing и 2 канала


0

0

Ситуация следующая: есть 2 канала к разным провайдерам, есть маршрутизатор с eth0 (192.168.20.1) и eth1 (192.168.7.5). Задача: пустить исходящий почтовый трафик по eth1, а остальной - по обоим каналам.
Делаю так:
ip route add default scope global nexthop via 192.168.7.1 dev eth1 weight 1 nexthop via 192.168.20.6 dev eth0 weight 2
192.168.7.1 и 192.168.20.6 - gateways по пути к провайдерам.
+ создаю дополнительные таблицы маршрутизации для каждого провайдера. Трафик бегает то по одному каналу, то по другому, т.е. все работает, как предполагалось, остается только разобраться с почтой.
Для этого делаю
iptables -t mangle -A OUTPUT -d ! 192.168.0.0/16 -p tcp --dport 25 -j MARK --set-mark 25
ip rule add fwmark 25 pref 100 table prov1
ip route list table prov1
192.168.7.1 dev eth1 scope link src 192.168.7.5
default via 192.168.7.1 dev eth1 src 192.168.7.5
Для теста выбираю какой-нибудь внешний почтовик с адресом, про который "ip route get x.x.x.x" говорит, что пакеты будут уходить с eth0 (via 192.168.20.6). Делаю "telnet x.x.x.x 25" и tcpdump-ом вижу, что пакеты идут все таки по eth1, но исходящий адрес у них от eth0 (192.168.20.1). Почему так ? Ведь в маршруте явно указано src !
Попробовал также сделать SNAT этим пакетам:
iptables -t nat -A POSTROUTING -o eth1 -m mark --mark 25 -j SNAT --to-source 192.168.7.5
tcpdump уже показывает правильный адрес, но соединение все равно не устанавливается. В /proc/net/ip_conntrack вижу такое:
tcp 6 13 SYN_RECV src=192.168.20.1 dst=67.28.113.11 sport=37167 dport=25 src=67.28.113.11 dst=192.168.7.5 sport=25 dport=37167 use=1 mark=0

В tcpdump постоянно повторяющиеся строки:
13:09:12.233756 IP 192.168.7.5.37167 > 67.28.113.11.smtp: S 755710919:755710919(0) win 5840 <mss 1460,sackOK,timestamp 776528421 0,nop,wscale 0>
13:09:12.518436 IP 67.28.113.11.smtp > 192.168.7.5.37167: S 282450457:282450457(0) ack 755710920 win 65535 <mss 1460,nop,wscale 1,nop,nop,timestamp 185470331 776528421>

Чего ему не хватает ? :-) Может кто-нибудь объяснить ?
Не знает кто-нибудь какую-то доку, где подробно описано как ядро осуществляет маршрутизацию (когда какие таблицы просматривает, когда просматривает правила ip rules) ?
Потому как нашел пару схем движения пакетов, но по-моему они обе не подтверждаются практикой:
http://mailman.ds9a.nl/pipermail/lartc/2002q2/004245.html
(или http://www.docum.org/docum.org/kptd/)
и
http://www.policyrouting.org/PolicyRoutingBook/ONLINE/CH03.web.html (про ядра 2.4)

P.S. Ядро 2.4.27.

★★★★★

>pref 100

А почему так много? Ты уверен, что этот трафик не попадает в другие правила, с меньшим prio?

Или может, у тебя просто ответы назад не доходят, ввиду мутности маршрута? :)

>но по-моему они обе не подтверждаются практикой

имхо, kptd вполне адекватна :-\

fagot ★★★★★
()
Ответ на: комментарий от fagot

> А почему так много?
Ну захотелось мне так :-) Это ж всего лишь номер в списке правил:
0: from all lookup local
100: from all fwmark 0x19 lookup prov1
110: from 192.168.20.1 to 192.168.0.0/16 lookup main
120: from 192.168.20.1 lookup prov2
130: from 192.168.7.5 to 192.168.0.0/16 lookup main
140: from 192.168.7.5 lookup prov1
32766: from all lookup main
32767: from all lookup 253

> имхо, kptd вполне адекватна :-\
Там написано, что output routing происходит до прохождения OUTPUT цепочек netfilter, а на практике я в mangle OUTPUT задаю fwmark и маршрутизирую эти пакеты по-другому. Т.е. получается, что на самом деле: local_process --> output_routing_1 --> iptables_OUTPUT --> output_routing_2 --> iptables_POSTROUTING --> ...

spirit ★★★★★
() автор топика
Ответ на: комментарий от spirit

>Это ж всего лишь номер в списке правил

Ну, я так понимаю, это еще и порядок проверки правил, что есть логично. Но у тебя 100-тое и так первое :)

fagot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.