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

Исходное сообщение
"Раздел полезных советов: Распределение трафика между двумя к..."

Отправлено auto_tips , 18-Авг-09 14:05 
Во FreeBSD 7 появилась возможность задания множественных таблиц маршрутизаций. В ядре отвечает за это опция:

    options ROUTETABLES=[количество таблиц]

Распределения трафика будет осуществляться средствами пакетного фильтра ipfw.

Задаем маршруты по умолчанию:

    setfib 0 route add default 1.0.1.1 # таблица по умолчанию
    setfib 1 route add default 1.1.1.1 # новая таблица

Файл конфигурации для запуска ipfw:

    $cmd="/sbin/ipfw"
    $cmd add 10 check-state
    $cmd add 20 prob 0.5 setfib 0 tcp from 192.168.0.0/16 to not 192.168.0.0/16 keep-state
    $cmd add 30 prob 0.5 setfib 1 tcp from 192.168.0.0/16 to not 192.168.0.0/16 keep-state
    $cmd add 40 allow all from any to any

Таким образом мы задаем распределение трафика 50/50. Если каналы не равноценные то нужно выставить процентную весомость этих каналов.

Трансляция адресов (NAT).

Под эту задачу я выбрал ipnat, реализацию NAT от фаервола ipf.

пример /etc/ipnat.rules:

    map vlan0 192.168.0.0/16 -> 1.0.1.1/32
    map tun0 192.168.0.0/16 -> 1.1.1.1/32

Также можно выбрать демон natd или новый, работающий на уровне ядра, NAT, который появился во FreeBSD 7.


URL: http://bsd.ucd.uz/raspredelenie-trafika-mezhdu-2-mya-kanalam...
Обсуждается: http://www.opennet.me/tips/info/2142.shtml


Содержание

Сообщения в этом обсуждении
"Распределение трафика между двумя каналами во FreeBSD"
Отправлено john doe , 18-Авг-09 14:05 
А то-же самое, но для pf -- реализуемо?


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено mr_gfd , 18-Авг-09 14:19 
http://unix.derkeiler.com/Mailing-Lists/FreeBSD/net/2009-01/...

Рекомендуют все-же ipfw для этих целей.


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено nanodaemon , 19-Авг-09 04:07 
по каким же причинам рекомендуют ? pf в *BSD умел балансировать задолго до того как прикрутили мультипл роут тейблс во фрибсд. да и при помощи ipfw можно сделать по-человечески, я думаю, не прибегая ко мультипл роут тейблс. предназначение мультипл роут тейблс иное чем балансинг каналов.

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


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено iZEN , 19-Авг-09 00:14 
Насчёт балансировки трафика между двумя каналами есть статья в журнале "Системный администратор" №2(51)'2007, но там в основном про IPFW. Однако автор всё же обмолвился и про PF.
Алгоритм балансировки трафика round-robin между двумя каналами на PF:

pass in on ed0 route-to { (rl0 10.0.1.1), (rl1 10.1.1.1) } round-robin from 192.168.0.0/24 to any keep state

здесь: ed0 — внутренний интерфейс, смотрящий на клиентов; rl0 и rl1 — внешние интерфейсы, смотрящие на провайдеров; 10.0.1.1 — адрес шлюза провайдера А; 10.1.1.1 — адрес шлюза провайдера Б; 192.168.0.0/24 — локальная сеть.

    Этим правилом входящий трафик на внутреннем интерфейсе (т.е. исходящий для пользователей) будет распределяться между интерфейсами rl0 и rl1 с соответствующими шлюзами по алгоритму round-robin (то есть внешний интерфейс будет меняться циклически — первое соединение будет использовать rl0, второе — rl1, третье — снова rl0 и так далее). Опция keep state сохраняет состояние, благодаря чему все пакеты в рамках одного соединения будут использовать один и тот же шлюз. В итоге нагрузка будет распределяться между двумя каналами — нельзя сказать, что трафик поделится абсолютно поровну, но при рассмотрении за большой период времени можно считать, что балансировка будет приближаться к этому.

Для решения проблемы привязки соединений клиента к определённому IP-адресу, которое требуется для некоторых серверов (а в данном случае каждое новое соединение от одного и того же клиента к определённому серверу будет проходить с большой вероятностью через разные маршруты/интерфейсы), нужно использовать опцию sticky-address в правиле nat или route-to.

Чтобы распределять трафик между интерфейсами в определённой пропорции в правиле PF нужно использовать опцию probability.

Обсуждение: http://forum.lissyara.su/viewtopic.php?f=8&t=17906&p=166055


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено pehlle , 18-Авг-09 14:48 
там ошибка в скрипте, не $cmd="/sbin/ipfw",
а cmd="/sbin/ipfw"

"Распределение трафика между двумя каналами во FreeBSD"
Отправлено shutdown now , 18-Авг-09 14:52 
а почему два раза "prob 0.5", по идее, должно быть один раз, а то 1/4 трафика будет 40-ым правилом обрабатываться.

"Распределение трафика между двумя каналами во FreeBSD"
Отправлено pehlle , 18-Авг-09 15:23 
вы правильно говорите.
правильнее будет так:
$cmd add 20 prob 0.5 setfib 0 tcp from 192.168.0.0/16 to not 192.168.0.0/16 setup keep-state
$cmd add 30 setfib 1 tcp from 192.168.0.0/16 to not 192.168.0.0/16 setup keep-state

"Распределение трафика между двумя каналами во FreeBSD"
Отправлено terminus , 18-Авг-09 15:05 
Проверяли, это нормально работает? Просто мне кажется что при таком конфиге TCP пакеты с вероятностью 1/2 будут прыгать между каналами, даже в случае когда обмен происходит в рамках одной сесии (IP:TCP <-> IP:TCP). Если потом пропускать еще и через нат, то в итоге IP_назначения будет получать TCP пакеты с двух IP.
ЕМНИП то дополнительные параметры такие как prob будут срабатывать даже при проходе через check-stale. У nuclight подробно было написано про это:
http://nuclight.livejournal.com/124348.html

"Распределение трафика между двумя каналами во FreeBSD"
Отправлено pehlle , 18-Авг-09 16:26 
сорри :(, оказывается такое не работает. заметку можно удалить или наоборот дополнить, может быть у кого нить что нибудь с данным направлением че нить получиться. Меня сбило с понтолыки, что пакетики бегали на обоих каналах, оказывается, при проверке когда в правило ставиш флаг setup, то при keep-state, оно должно как бы закэшироваться, но не кэшируется.

"Распределение трафика между двумя каналами во FreeBSD"
Отправлено XoRe , 19-Авг-09 16:20 
>сорри :(, оказывается такое не работает. заметку можно удалить или наоборот дополнить,
>может быть у кого нить что нибудь с данным направлением че
>нить получиться. Меня сбило с понтолыки, что пакетики бегали на обоих
>каналах, оказывается, при проверке когда в правило ставиш флаг setup, то
>при keep-state, оно должно как бы закэшироваться, но не кэшируется.

Да ладно, рациональное зерно все равно есть)
Могу порекомендовать тот вариант, который я описал ниже.


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено shutdown now , 18-Авг-09 16:54 
в 8-ой фре есть ECMP (Equal Cost Multipath Routing), он должен делить поровну.
А если ещё и NAT, то тогда вот - http://wiki.opennet.ru/FreeBSD_Balance

"Распределение трафика между двумя каналами во FreeBSD"
Отправлено XoRe , 19-Авг-09 16:19 
Для раскидывания пакетов по двум каналам не обязательны множественные таблицы маршрутизации.
Достаточно двух fwd в ipfw и двух натов.

После некоторго исследования этой темы могу сказать свое имхо.

Если пакеты одного клиента будут лететь через двух разных провайдеров (пусть даже с сохранением сессии, т.е. до одного ip адреса - через один канал), все равно возникнут проблемы с порталами типа mail.ru, vkontakte и т.д.
Там может слетать авторизация, если запросы клиента будут приходить то с одного ip адреса, то с другого.
Помню, mail.ru ругалась, когда я примерно через такую систему на неё заходил.
То могут быть проблемы с любым более менее серьёзным интернет проектом, который имеет более одного ip адреса.

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

Ну и плюс там пингование шлюзов и т.д.

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


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено iZEN , 19-Авг-09 19:40 
PF&ALTQ

"Распределение трафика между двумя каналами во FreeBSD"
Отправлено XoRe , 21-Авг-09 13:05 
>PF&ALTQ

А можно поподробнее?
Если честно, не понятно, о чем это вы)
Вы поддерживаете мою мысль и говорите, чем это можно сделать?
Или хотите сказать, что с помощью PF&ALTQ можно сделать балансировку без проблем с mail.ru?


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено iZEN , 21-Авг-09 16:16 
>>PF&ALTQ
>
>А можно поподробнее?
>Если честно, не понятно, о чем это вы)
>Вы поддерживаете мою мысль и говорите, чем это можно сделать?
>Или хотите сказать, что с помощью PF&ALTQ можно сделать балансировку без проблем
>с mail.ru?

Подробнее:
1. http://house.hcn-strela.ru/BSDCert/BSDA-course/apcs02.html#p...
2. http://house.hcn-strela.ru/BSDCert/BSDA-course/apcs02.html#p...



"Распределение трафика между двумя каналами во FreeBSD"
Отправлено XoRe , 22-Авг-09 13:05 
>[оверквотинг удален]
>>
>>А можно поподробнее?
>>Если честно, не понятно, о чем это вы)
>>Вы поддерживаете мою мысль и говорите, чем это можно сделать?
>>Или хотите сказать, что с помощью PF&ALTQ можно сделать балансировку без проблем
>>с mail.ru?
>
>Подробнее:
>1. http://house.hcn-strela.ru/BSDCert/BSDA-course/apcs02.html#p...
>2. http://house.hcn-strela.ru/BSDCert/BSDA-course/apcs02.html#p...

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

А ещё по ссылкам ничего не говорится о том, как такая конструкция будет себя вести на сайтах, где слетает авторизация, если запросы идут с разных ip адресов.
Ведь у сайта может быть несколько ip адресов.

Например:
$ host vkontakte.ru
vkontakte.ru has address 93.186.227.123
vkontakte.ru has address 93.186.227.124
vkontakte.ru has address 93.186.227.125
vkontakte.ru has address 93.186.227.126
vkontakte.ru has address 93.186.227.129
vkontakte.ru has address 93.186.227.130
vkontakte.ru has address 93.186.228.129
vkontakte.ru has address 93.186.228.130
vkontakte.ru has address 93.186.224.233
vkontakte.ru has address 93.186.224.234
vkontakte.ru has address 93.186.224.235
vkontakte.ru has address 93.186.224.236
vkontakte.ru has address 93.186.224.238
vkontakte.ru has address 93.186.224.239
vkontakte.ru has address 93.186.225.6
vkontakte.ru has address 93.186.225.211
vkontakte.ru has address 93.186.225.212
vkontakte.ru has address 93.186.226.4
vkontakte.ru has address 93.186.226.5
vkontakte.ru has address 93.186.226.129
vkontakte.ru has address 93.186.226.130
vkontakte.ru mail is handled by 10 mail.vkontakte.ru.

Плюс ещё всякие:
cs4214.vkontakte.ru
cs4171.vkontakte.ru
*.vkadre.ru

И т.д.
Можно сделать, чтобы фаерволл запоминал, какой ип адрес какому клиенту через какой канал давать.
Вы же не думаете, что балансировка типа round-robin (по очереди на канал) будет стопроцентно угадывать, через какой канал послать запрос клиента на новый ip адрес?

Хотя может я чего-то не знаю.
Буду рад услышать что-то ещё.
Буду рад, если это будут не только ссылки.

P.S.
Я и сам могу ошибаться.
Поэтому подниму freebsd на работе в виртуалке, дам ей два внешних ip адреса.
И попробую воспроизвести то, что описано по ссылкам.
Если сайты не будут ругаться и авторизация не будет спадать, то это реально.
А если нет, значит нет.


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено Alive , 20-Авг-09 13:58 
Согласен с товаришем XoRe. Без полноценного multipath routing правильную балансировку не сделаешь.

"Распределение трафика между двумя каналами во FreeBSD"
Отправлено XoRe , 21-Авг-09 13:05 
>Согласен с товаришем XoRe. Без полноценного multipath routing правильную балансировку не сделаешь.
>

Я бы сказал, без своих IP адресов)


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено ro , 25-Авг-09 20:50 
а можно сделать ,как в линуксе,чтобы в зависимости от нагрузки каналов распределял?

"Распределение трафика между двумя каналами во FreeBSD"
Отправлено XoRe , 31-Авг-09 21:48 
>а можно сделать ,как в линуксе,чтобы в зависимости от нагрузки каналов распределял?
>

А можно поподробнее про "как в линуксе"? )


"Распределение трафика между двумя каналами во FreeBSD"
Отправлено Merridius , 19-Дек-10 23:54 
>>а можно сделать ,как в линуксе,чтобы в зависимости от нагрузки каналов распределял?

А можно купить циску в которой есть и multipath routing и ip sla и не парить себе мозг.