LINUX.ORG.RU
ФорумAdmin

Помогите с балансировкой трафика


0

0

В данный момент у меня есть 2 разных провайдера, предоставляющих безлимитный инет на скорости 512к: один ADSL, второй 3g. Для простоты оба видны в моей локалке в виде роутеров: 10.255.255.220 и 10.255.255.216, соответственно можно любой из них использовать в качестве шлюза. Хочется качать торренты через обоих сразу, чтоб скорость суммировалась.
Нашел такую статью, вроде бы соответствующую моей ситуации: линк.

Вкратце что делал:

iptables -t mangle -N NEW_OUT_CONN
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 1
iptables -t mangle -A NEW_OUT_CONN -m statistic --mode random --probability 0.50 -j RETURN
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 2

iptables -t mangle -A OUTPUT -d 10.255.255.0/24 -j RETURN
iptables -t mangle -A OUTPUT -s 10.255.255.0/24 -m state --state new,related -j NEW_OUT_CONN
iptables -t mangle -A OUTPUT -s 10.255.255.0/24 -j CONNMARK --restore-mark

ip route add 10.255.255.0/24 dev eth1 proto kernel scope link src 10.255.255.221 table 101
ip route add 127.0.0.0/8 dev lo scope link table 101
ip route add default via 10.255.255.220 table 101
ip rule add prio 51 fwmark 1 table 101

ip route add 10.255.255.0/24 dev eth1 proto kernel scope link src 10.255.255.221 table 102
ip route add 127.0.0.0/8 dev lo scope link table 102
ip route add default via 10.255.255.216 table 102
ip rule add prio 52 fwmark 2 table 102

ip route flush cache
Результат: при попытке что-либо открыть или пропинговать говорит, что нет маршрута (no route to host).
Поставил ulog-acctd и отследил, что iptables исправно рандомно отмечает исходящие пакеты метками 1 и 2, но вот к сожалению в iproute я не очень силен.
Подскажите, в чем может быть проблема.
Система: ubuntu-server последняя.
Кстати, нашел еще в инете такой совет:
cho 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
- не помогло.
Еще кстати: если говорю ip route ls, то показывает вот что:
10.255.255.0/24 dev eth1  proto kernel  scope link  src 10.255.255.221 
192.168.10.0/24 dev eth0  proto kernel  scope link  src 192.168.10.10
Может я чего не понимаю, но где маршруты, которые я добавил?

Ответ на: комментарий от router

А вот так не проще: http://www.opennet.ru/docs/RUS/LARTC/x348.html



Строчка оттуда: Обратите внимание, что балансировка не будет идеальной, так как она основывается на маршрутах, а маршруты кэшируются. Это означает, что маршруты к часто посещаемым сайтам не будут проходить через разных провайдеров.

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

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

>А вот так не проще: http://www.opennet.ru/docs/RUS/LARTC/x348.html

1. Писал полный ламер, не умеющий пользоваться iproute и не разбирающийся в policy-based routing'е (я уже задолбался это повторять).
2. Там нет балансировки исходящих соединений для разных провайдеров.
nexthop будет балансировать _пакеты_, а не соединения, что в случае с разными внешними адресами работать не будет.

nnz ★★★★
()

Добавь хоть какой-нибудь дефолтный маршрут. Кривой линуховый сетевой стек выбирает исходящий адрес только по таблице main (поле src), если подходящего маршрута нет — посылает.

Маскарад на внешние интерфейсы обязательно (именно из-за кривого выбора исходного адреса).

Еще кстати: если говорю ip route ls, то показывает вот что:


Это таблица main. То, что ты добавил, находится в таблицах 101 и 102 (ip ro sh ta 101, ip ro sh ta 102).

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

>Суть же метода выше в том, что он должен рандомно выбирать маршрут вне зависимости от назначения, таким образом обеспечивая более-менее ровное распределение нагрузки между провайдерами.

Вообще, при двух провах, для этого можно использовать даже не рандом, а rateest (критерий, позволяющий при выборе провайдера для каждого соединения сравнивать текущую свободную полосу у разных провов). Надо будет как-нибудь статейку написать.

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

> Добавь хоть какой-нибудь дефолтный маршрут
Если говорю ему ip route add default via 10.255.255.220 то дальше трафик только через него и идет, на второй роутер не переключается.

Маскарад на внешние интерфейсы обязательно (именно из-за кривого выбора исходного адреса).

А вот эту строчку я что-то совсем не распарсил :) Не понимаю, причем здесь маскарадинг - я торренты качать собираюсь на той же машине, на которой происходят все эти эксперименты. Если Вы об этом. Поясните, пожалуйста.

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

Попробовал добавить в качестве дефолтного шлюза несуществующий адрес 10.255.255.100 - и заработало! Причем действительно запросы уходят с разных провайдеров.
Правда, что торренты, что aria2c пока почему-то не показывают удвоенную скорость. Разбираюсь.

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

Нет, все же работает :) Правда, с торрентами почему-то не так активно, как хотелось бы - показывает порядка 100 кб из 128 возможных. Хотя это, возможно, скоростемерялка врет.
Спасибо nzz!

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

>А вот эту строчку я что-то совсем не распарсил :)

Это я протупил — не заметил, что у тебя оба канал доступны через один сетевой интерфейс. Если бы их было >1, маскарад понадобился бы даже для локальной машины.

Если говорю ему ip route add default via 10.255.255.220 то дальше трафик только через него и идет, на второй роутер не переключается.


Наверное, ты все-таки что-то путаешь.

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

Кривой линуховый сетевой стек выбирает исходящий адрес только по таблице main (поле src), если подходящего маршрута нет — посылает.


На сколько я помню (из опыта) не только по таблице main, правила (ip rule) и другие таблицы участвуют тоже.
Но прикол в том, что, выбирая src IP, у нас его пока нет, и сработают только те правила, которые ориентируются на что угодно кроме src IP и firewall-ной маркировки (её у нас тоже нет, «недопакет» без src IP через firewall пропускать нет смысла, поэтому перед firewall-ом происходит output routing).
Если не прав, поправьте.

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

>На сколько я помню (из опыта) не только по таблице main, правила (ip rule) и другие таблицы участвуют тоже.

Возможно. Но так как при policy-based routing'е маркировка фаервола и исходный адрес являются ключевыми критериями, де-факто можно рассматривать только main и local.

Хотя насчет безусловных правил идея интересная, надо будет добавлять src в такие таблицы.

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