> Перечитал всю инфу по данной теме. Сделал: http://www.opennet.me/tips/2009_policy_route_linux.shtml - это - явно не читал.
> ip route add $NET_INET1 dev $IF_INET1 src $IP_INET1 table T1 #закидываем
> в первую таблицу инфу о сети первого провайдера
[Замечание1.] Это не нужно, если до таблиц т1/т2 делать lookup в main. Ведь именно для этого у вас в скрипте и удаляется дефолтный маршрут из main и добавляется в default - чтобы сделать лукап в майн до т1/т2, и если нет в майн и не подпадает под т1/т2 - тогда ищем в default.
т.е. в таблице майн остаются только маршруты к напрямую присоединенным сетям, дефолтного маршрута там нет, и поиск маршрута пойдет по дальнейшим ip ru правилам.
Кроме того, допустим - подымете вы на этом хосте впн.... :-)
Установленные соединения, маршрут к ним также добавится только в main, а ваш скрипт ожидает что маршруты к впн-ам будут также и в Т1/Т2, что криво :-)
Т.е. последовательность поиска маршрута для пакета в таблицах:
# ip ru sh
0: from all lookup local
1000: from all lookup main
1005: from all fwmark 0x1 lookup prov1
1006: from all fwmark 0x2 lookup prov1
1010: from 1.2.144.38 lookup prov2
1030: from 3.4.185.33 lookup prov1
2000: from 192.168.0.0/24 lookup peeringnets
2010: from 192.168.0.0/24 lookup prov1
3000: from all lookup peeringnets
32766: from all lookup main
32767: from all lookup default
немножко поднавороченный пример, но суть проста - используйте явное задание pref в скрипте, и думайте, как оно работает - _последовательно_ пока не найдет маршрут к пункту назначения.
> ip route add $NET_LOCAL dev $IF_LOCAL table T1
> #закидываем в первую таблицу инфу о том, что у нас существует
> локальная сеть
[Замечание1.]
> ip route add $NET_INET2 dev $IF_INET2 table T1
> #закидываем в первую таблицу инфу о том, что у нас существует
> еще одна сеть
[Замечание1.]
> ip route add 127.0.0.0/8 dev lo table T1
> #закидываем в первую таблицу инфу
> о существовании лупбека
[Замечание1.]
> ip route add default via $GW_INET1 table T1
> #закидываем в первую таблицу дефолтный гейт на первого
> провайдера
Это единственный маршрут, который нужен в Т1.
Описание маршрутов Т2- идентичное замечание.
> ip rule delete table T1 #удаляем
> наши таблицы, если они присутсвуют в текущей конфигурации (вдруг мы просто
> перезапускаем скрипт?)
> ip rule delete table T2 #аналогично
> для второй.
> ip rule delete table T1 #и
> делаем это два раза, так как у нас два правила на
> каждую таблицу.
> ip rule delete table T2 #аналогично
> для второй.
Как с этим быть - я не знаю. как правило я стараюсь не перезапускать скрипт :-)
> #а вот это важно для понимая! если понять что происходит в следующих
> строчках - то можно настраивать любые правила маршрутизации.
> ip rule add from $IP_INET1 table T1 #все пакеты
> от ip адреса первого провайдера маршрутизировать по таблице T1
> ip rule add from $IP_INET2 table T2 #все пакеты
> от ip адреса второго провайдера маршрутизировать по таблице T2
> ip rule add fwmark 10 table T1 #все пакеты, которые имеют
> метку 10 маршрутизировать по таблице T1
> ip rule add fwmark 11 table T2 #все пакеты, которые имеют
> метку 11 маршрутизировать по таблицу T2
Добавить явное указание pref, добавить перед поиском в таблицах т1/т2 - поиск в main.
В майн не должно быть маршрута по умолчанию, что естественно :-)
В общем и целом всё верно.
> # Политика по умолчанию DROP: всем всё запрещено
> iptables -t filter -P INPUT ACCEPT
> iptables -t filter -P FORWARD ACCEPT
> iptables -t filter -P OUTPUT ACCEPT
теперь политика по умолчанию - всем всё разрешено :-)
> iptables -t mangle -A PREROUTING -d 77.88.21.6 -j MARK --set-mark 10
> # яндекс :)
> iptables -t mangle -A PREROUTING -d 77.88.21.3 -j MARK --set-mark 11
> # яндекс :)
ну типа верно.
> #все пакеты, которые попали в цепочку POSTROUTING таблицы nat обрабатываем по двум
> правилам:
> iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
> iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
мне как-то больше по душе явное указание -j SNAT --to-source, но...
> это тестовые настройки, поэтому прошу не ругать за дырявость файрвола
> делаю tracert 77.88.21.6 - все нормально - идет через 1 провайдера
> делаю tracert 77.88.21.3 - идет через 2 провайдеда, но после гейта (хх.хх.хх.233)
> никуда не идет
> в чем проблема, подскажите плиз
Это можно посмотреть в tcpdump - правильно ли идет, по ожидаемому ли интерфейсу и с какими адресами летит пакет.
кроме того, нужно посмотреть, чего скрипт натворил:
ip ru sh + ip ro sh по всем таблицам.
Подумать над выводом :-)
//в некоторых особо клинических случаях - может быть тупняк дистрибутива. Замечено было на убунте, установленной вместо предпочитаемого и порекомендованного мной дебиана, вылечилось переустановкой на что-то другое.