» Коммуникации>Балансировка сетевой нагрузки или как увеличить отдачу через ADSL2+ до 400 кб/сек =)
Lampus 02:00 03.02.2008
Смотрим сначала на скрин, где изображён KTorrent. Смотрим на скорость загрузки - 1,037 Мб/сек. Теперь смотрим второй скрин, где изображено окно программы telnet, подключенной к моему модему. Downstream speed всего 6786 кбит/сек. Это не глюк Korrent'a и не фотошоп (и не GIMP). Просто я распределил нагрузку между двумя домолинковскими модемами. Если ещё интересно, то читайте мой пост номер 2 о том как я это осуществил.
Изображения
Сразу говорю что ничего нового я здесь не поведую. Большинство из тех кому это надо всё и так знают, либо знают где найти, если понадобится. Просто я думаю чо мой пост может пригодится начинающим админам в небольших локальных сетях, которым нужна высокая пропускная способность внешнего канала на сервере, да и простым личерам, которым лень ждать пока скачается и уних есть добрый сосед, который позволит заюзать свой модем =)
В общем для всего этого чуда нам понадобится Linux и установленный пакет iproute2.
Я буду рассматривать пример для домолинка.
Опишу как у меня всё это устроено: имеется локальная сеть. Непосредственно в свитч воткнут мой домолинковский модем. Пакетниками закрыты все ресурсы кроме локальных, чтоб злоумышленники из локалки не заюзали внешний инет на халяву =) IP модема 10.1.9.113. Также имеется сервер с IP 10.1.9.105, который разводит домолинковский инет. На сервере стоит биллинг. Но это не суть важно, так как за локальные домолинковские ресурсы деньги не снимаются. Вот его мы и будем использовать как второй канал. Модем подключенный к этому серверу работает даже на меньшей скорости чем мой - что то около 3.6 мбит/сек, и к тому же AnnexA. Все эксперименты проводились на ноуте с IP 10.1.9.236.
Я написал вот такой вот скриптик:
Сообщение от :
#!/bin/bash
IF1=eth0
IF1_IP1=10.1.9.236
GW_IP1=10.1.9.113
IF2=eth0
IF2_IP=10.1.9.236
GW_IP2=10.1.9.105
ip route add 80.82.32.0/19 dev $IF1 src $IF1_IP1 table T1
ip route add 88.83.192.0/19 dev $IF1 src $IF1_IP1 table T1
ip route add 77.45.128.0/17 dev $IF1 src $IF1_IP1 table T1
ip route add default via $GW_IP1 table T1
ip route add 80.82.32.0/19 dev $IF2 src $IF1_IP2 table T2
ip route add 88.83.192.0/19 dev $IF2 src $IF1_IP2 table T2
ip route add 77.45.128.0/17 dev $IF2 src $IF1_IP2 table T2
ip route add default via $GW_IP2 table T2
ip rule add from $GW_IP1 table T1
ip rule add from $GW_IP2 table T2
ip route add default scope global nexthop via $GW_IP1 dev $IF1 weight 1 nexthop via $GW_IP2 dev $IF2 weight 1
Ну с логической точки зрения скрипт не совсем верен, так как не требуется создания двух одинаковых таблиц T1 и T2 для локальных ресурсов. Ну оно здесь не просто так =) Это для того чтобы можно было указать локальные диапазоны двух РАЗНЫХ провайдеров. Допустим в T1 указываем локальные диапазоны Domolink'а, а в T2 локальные диапазоны Intercon'a.
Теперь о переменных: IF1 и IF2 - это переменные содержащие имена интерфейсов к которым подключены модемы 1 и 2 соответственно, а IF1_IP и IF2_IP - IP адреса, назначенные на интерфейсы IF1 и IF2.
GW_IP1 и GW_IP2 - это IP адреса шлюзов. Они обычно соответсвуют IP адресу соответствующего модема, если те работают в режиме роутера.
Сохраняем скрипт с именем balance.sh.
Выполняем команду chmod 755 balance.sh
Это сделает файл balance.sh исполняемым для владельца.
Запускаем его, и смотрим не вывалилось ли ошибок.
Если нет - то можно юзать =)
Проверить что используется несколько модемов можно несколько раз выполнив команду traceroute для различных хостов. Шлюзы должны оказываться разными.
У меня получилось вот так:
Сообщение от :
root@lampusnb:~# traceroute mail.ru
traceroute: Warning: mail.ru has multiple addresses; using 194.67.57.226
traceroute to mail.ru (194.67.57.226), 30 hops max, 38 byte packets
1 10.1.9.105 (10.1.9.105) 0.498 ms 0.398 ms 0.337 ms
2 192.168.1.1 (192.168.1.1) 2.236 ms 1.278 ms 1.004 ms
3 lo100.c10008-a77.vsi.ru (80.82.53.125) 41.417 ms 39.459 ms 39.981 ms
...
traceroute to ya.ru (213.180.204.8), 30 hops max, 38 byte packets
1 10.1.9.113 (10.1.9.113) 0.808 ms 0.839 ms 0.699 ms
2 lo100.c10008-a77.vsi.ru (80.82.53.125) 40.086 ms 35.343 ms 45.577 ms
3 ge3-0.gsr.a77.hw.vsi.ru (88.83.197.153) 82.076 ms 60.174 ms 33.538 ms
...
Только запомните, что прирост в скорости вы увидите только при большом количестве параллельных потоков (например, как в торрентах и других p2p сетях, или при многопоточной закачке файлов, ну а также при большом кол-ве клиентов )
И ещё. Если у вас используются каналы с сильно различающейся пропускной способностью - попробуйте поиграться с параметром weight. Это позолит нагрузить в большей степени один, либо другой канал.
З.Ы. Что то я неудобоваримое понаписал. Просто уже поздно, бошка не варит, завтра и допишу. Если у кого то будут вопросы - отвечу.
[Ответ]
Arnold Laynе 23:52 03.02.2008
Lampus, а теперь научи, как грамотно развести соседа на использование его модема
[Ответ]
myau 21:42 04.02.2008
Ну я уж молчу сколько ошибок в скрипте наваял ...
IF2_IP - где-нибуть используется?
$IF1_IP2 - где-нибуть определяется?
ip rule add from $GW_IP1 table T1
from всегда использует адрес интерфеса - а не адрес гатевея ...
И вообще - зачем тебе таблицы - ты что - souce routing решил применить? нафига он тебе.
Я молчу и о том, что все что тут нарисовал (в случае если все ошибки выправить) - годится только для default routing'а. А если хоть один из модемов с закрытым интернетом ... познокомь с таким соседом - расшарившим модем в локалке - и не закрывшим его фильтром от платного трафика.
Короче, складывается впечатление, что прочитал статью на www.opennet.ru (поиск по ключевому слову - nexthop) и изложил ее в своей трактовке, добавив кучу ошибок
ну а теперь конструктив.
Если отбросить всю словесную шелуху, то нужно всего-лишь дать три команды:
ip route add 80.82.32.0/19 nexthop via $GW_IP1 dev eth0 nexthop via $GW_IP2 dev eth0
ip route add 88.83.192.0/19 nexthop via $GW_IP1 dev eth0 nexthop via $GW_IP2 dev eth0
ip route add 77.45.128.0/17 nexthop via $GW_IP1 dev eth0 nexthop via $GW_IP2 dev eth0
и ты получишь multipach routing на домолинковские сети
после чего ставь дефаулт роутинг (на интернет), туда - где он реально работает.
Да, в таблице маршрутизации не должно быть роутингов на домолинковские сетки, если есть - убейте их, перед тем как давать вышеприведеные команды.
И не забывайте такую замечательную команду:
ip route flush cache
очистит кеш таблицы роутинга - что заставит компьютер по-новой искать пути к источникам (вполне возможно что через другой модем).
Кроме того - такая схема должна еще обладать повышенной живучестью - в том смысле, что при отключении одного из модемов - все должно продолжать работать. (Сам не проверял)
[Ответ]
Lampus 01:52 05.02.2008
myau, на счёт ошибок в скрипте ты прав. Я этот скрипт не проверил, прежде чем выложить, а зря. У меня это имело несколько другой вид, а вводить переменные я начал лишь для того, чтобы придать скрипту большую читабельность. Просто голый набор комманд с моими ip вряд ли бы кому то что-то дал. А теперь ещё посмотри в какое время оставлен тот пост (да и этот за одно), всё сразу поймёшь =)
Видимо ты не внимательно читал мой пост, ибо после блока со скриптом я написал что таблицы T1 и T2 в данном случае абсолютно бесполезны и приведены лишь для того, чтобы скрипт можно было адаптировать для использования двух разных провайдеров с собственными локальными диапазонами. И ещё данный скрипт предполагает что ни о каких пакетных фильтрах речи не идёт, то бишь помимо локальных ресурсов доступна ещё и внешка. А если у нас два подключения к одному и тому же прову, с одними и теми же локальными ресурсами и всегда открытой внешкой, то вообще было бы достаточно одной строчки:
Сообщение от :
ip route add default scope global nexthop via $GW_IP1 dev $IF1 weight 1 nexthop via $GW_IP2 dev $IF2 weight 1
В общем хотел сделать пример поуниверсальней, а получилось как всегда =\
Хотя такая конструкция (пока я не начал менять реальные ip на имена переменных) замечательно работала, в чём можно убедиться взглянув на скрины.
Arnold Laynе, телепаты в отпуске. Ситуацию конкретней опиши.
[Ответ]
Herbert Wells 22:50 10.02.2008
Спасибо. Подскажите, нужно что-ли дополнительно дописывать в скрипте, что-бы использовать 3 или 4-ре модема ? Планируются только для использования torrents.vsi.ru .
[Ответ]
Lampus 00:14 11.02.2008
Herbert Wells, надо лишь добавить соответствующее кол-во nexthop via $GW_IPxxx dev $IFxxx weight 1
И если модемы заводятся на скоростях с большой разницей, то не забываем крутить параметр weight
[Ответ]
myau 22:24 15.02.2008
Ну и ... доволен ... если ты до сих пор в этом режиме работаешь ... то полный ... провакатор.
таблицу смотрел?
cat /proc/net/ip_conntrack | grep ESTABLISHED
И это только установленные соединения ....
Только список превышает 3 МеГаБайта
А сколько буферов памяти под каждое соединение выделяется?
но это ошибки с Нашей стороны ... а с Ихней сороны - сколько не полученных ACK на ихней SYN было? (Тэорию открой)
Ну а теперь - как всегда, позитив ...
Правду не расскажу - скажу лишь подсказку:
1.Статический роутинг спасает - на таком количестве объектов(приемников)
2. Статический роутинг - делается везде, в том числе и под виндой ...(штатными средствами)
Так что проверить меня очень просто.
И не нужно тут изобретать велосипед.
[Ответ]
myau 22:44 15.02.2008
так что не зря, команды:
route add ...
Работают как в винде, так и на линуксе.
[Ответ]