LINUX.ORG.RU
ФорумAdmin

Распределение нагрузки по разным интерфейсам


0

1

Суть в следующем: есть четыре интерфейса (пусть будет ppp0, ppp1, ppp2, и ppp4), нужно сделать так, чтобы каждое новое подключение к определенному сайту шло через свободный в данный момент интерфейс.

Пробовал делать так: ip route replace x.x.x.133 scope global nexthop via x.x.x.58 dev ppp0 weight 1 nexthop via x.x.x.70 dev ppp1 weight 1 nexthop via x.x.x.163 dev ppp2 weight 1 nexthop via x.x.x.130 dev ppp3 weight 1

Но в таком случае мешает кэширование роутинга, да и выбирает не всегда нужный интерфейс.


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

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

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

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

Ага, тогда позволю уточнить, а для чего нужна сия схемка?

ChAnton ★★ ()

Попробуй connmark - помечаешь новые соединения по почереди разными метками, а потом в соответствии с ними роутишь. Вроде есть пример в lartc. У меня вполне равномерно раскидывало, модемы скайлинковские правда подвисали часто)

Lonli-Lokli ★★ ()

Относительно простыми методами вашу задачу не решить. Максимум можно равномерно распределять коннекты (но не трафик) между всеми интерфейсами через ipt + fwmark (см. man ip и lartc).

mashina ★★★★★ ()

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

Делаю так (это просто пример, допустим нужно заставить все пакеты на 80 порт идти через определенный маршрут):

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
ip route add default dev ppp0 table g0
ip rule add fwmark 0x2/0x2 lookup g0

В итоге смотрю в сниффер и вижу что в поле source указано 192.168.1.2 (как я понимаю должен быть адрес ppp0), то есть мой адрес в локальной сети. Подскажите где косяк.

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

>В итоге смотрю в сниффер и вижу что в поле source указано 192.168.1.2 (как я понимаю должен быть адрес ppp0), то есть мой адрес в локальной сети. Подскажите где косяк.

MASQUERADE на все ppp+ добавь, куда ж без этого.

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

Сделал так:

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
ip route add default dev ppp0 table g0
ip rule add fwmark 0x2/0x2 lookup g0

Ничего не изменилось.

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

Извиняюсь если что, я не особо силен во всем этом, но разве он нужен если роуты будут нормально прописаны?

Вроде все работает и без него если делать так: ip route add default dev ppp0

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

Зачем у тебя везде одна и та же таблица g0 - и в default, и для fwmark 0x2? Нужно разные таблицы делать, дефолтную оставить как есть (т.е. отдельный rule для неё писать не обязательно) и добавить новую таблицу маршрутов для правила fwmark 0x2/0x2.

Извиняюсь если что, я не особо силен во всем этом, но разве он нужен если роуты будут нормально прописаны?

Если траффик идёт исключительно с локальной машины, то не нужен.

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

> Зачем у тебя везде одна и та же таблица g0 - и в default, и для fwmark 0x2? Нужно разные таблицы делать, дефолтную оставить как есть (т.е. отдельный rule для неё писать не обязательно) и добавить новую таблицу маршрутов для правила fwmark 0x2/0x2.

Что-то не понимаю о чем речь...

ip route add default dev ppp0 table g0 # создаю default маршрут в таблице g0, то есть все что в нее попало уйдет через этот маршрут

ip rule add fwmark 0x2/0x2 lookup g0 # добавляю правило чтобы все пакеты маркированые как 0x2/0x2 уходили в таблицу g0

Дефолтную таблицу я не трогал.

Ryan8 ()
Ответ на: комментарий от anton_jugatsu

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

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

Точно, туплю. Не соображу сейчас что не так, но на всякий случай, таблицу делать нужно примерно так:

ip route add 10.10.10.0/24 dev eth1 src 10.10.10.6 table g0
ip route add default via 10.10.10.1 table g0

ip rule add from 10.10.10.6  table g0
mashina ★★★★★ ()
Ответ на: комментарий от Ryan8

Почитал немного man по ipfilter, все-таки первоначальный вариант с OUTPUT вроде был правильный.

mangle: This table is used for specialized packet alteration. Until kernel 2.4.17 it had two built-in chains: PREROUTING (for altering incoming packets before routing) and OUTPUT (for altering locally-generated packets before routing).Since kernel 2.4.18, three other built-in chains are also supported: INPUT (for packets coming into the box itself), FORWARD (for altering packets being routed through the box), and POSTROUTING (for altering packets as they are about to go out).


Но почему не выбирается верный маршрут так и не понял...

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

Дя, для локальных соединений нужен OUTPUT, прошу порощения.

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

Добавил в iptable -j LOG в таблице mangle и цепочке OUTPUT и увидел что туда попадают пакеты с уже определенным исходящим адресов, то есть после маршрутизации. Из-за этого и не хочет нормально работать. Вот только почему они там уже после маршрутизации?

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

Короче разобрался, как оказалось пакет проходит через маршрутизацию два раза, один раз перед mangle (тут ему и давался адрес), а второй раз после (тут благодаря mark менялся исходящий интерфейс, но адрес оставался прежним). Решилось все одной строчкой: iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source=<адрес ppp0>

Спасибо все кто пытался помочь.

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

>iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2

MARK помечает отдельный пакет, вам же скорее нужна маркировка соединений, а это CONNMARK. Соответственно для маркировки отлавливаются только новые соединения, а для всего остального добавляется правило с --restore-mark.

Проверьте кстати rp_filter, он должен быть отключён для plicy routing'а.

http://www.linux.org.ru/forum/admin/4364511 - здесь похожий конфиг ковыряли.

Lonli-Lokli ★★ ()
Ответ на: комментарий от anton_jugatsu

Да нет вроде, легко же проверить:

ip route add default dev ppp0 table g0
ip rule add to x.x.x.x lookup g0

ip route add default dev eth0

iptables -t mangle -A OUTPUT -d x.x.x.x -j LOG

То есть в в main таблице default = eth0, а в g0 ppp0. В логи попадает адрес ppp0.

Просто в моем случае, когда первый раз проходит таблицу маршрутизации, то пакеты еще не промаркированы, вот и берет адрес из main.

Ryan8 ()
Ответ на: комментарий от Lonli-Lokli

rp_filter выключен. А насчет маркировки соединений тоже знаю, просто я тут пытался упростить пример, в данном случае вроде разницы нету, все равно все пакеты этого соединения будут идти на 80 порт.


Кстати, все вроде заработало, но пакеты начали дублироваться) Буду копать дальше.

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

>iptables -t mangle -A OUTPUT -d x.x.x.x -j LOG

Есть ведь «ip route get».

mky ★★★★★ ()

Может я и путаюсь, но далеко не все сайты позволят работать с ними с разных ip-адресов. Я сейчас не скажу про интернеты, но у меня на старой работе была система документооборота, и если ты залогинился с одного ip, а потом поменял адрес на eth0, то она предлагала логиниться заново.

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