Linux для всех

индекс
247,20

О раздаче интернетов…

Здравствуй, Хабр.

В данной статье речь пойдет о некоторых, но далеко не о всех, об эффективных и не очень, методах распределения трафика по каналам.

Если позволите, немного предыстории. Итак, предположим, Вы провайдер в небольшом далеком городе. Занимаетесь этим уже очень давно. Когда-то, каналы у вас были не большие, а интернет помегабайтный и всё было хорошо. С течением времени, вы заказываете канал(ы) пошире и начинаете считать уже не мегабайты, а скорость. Клиентская база растёт —> канал растет. И вот, вы достигаете того момента, когда больше ещё нельзя, а уже надо. Хотя подождите, больше конечно можно, но условия весьма и весьма не реальные. Такая ситуация далеко не везде, но мы имеем то, что имеем.


Что же делать?

Конечно, можно крутить гайки на тарифах, либо отрезать (ограничить, др.) какой-либо объемный трафик. На самом деле вариантов много, но вы заинтересованы в качестве предоставляемых пользователям услуг.

Как пытался решить проблему я?
Не могу похвастаться, что подошел к решению проблемы профессионально ввиду многих факторов, но что-то вышло и из моих попыток, о которых пойдет речь далее.

В наличии имелись несколько каналов: парочка медленных (latency), но широких (обслуживаемый поток данных), и быстрых, но узких (прошу простить за такие аналогии, мне так проще). Крутилось всё это дело на линуксе. Вот что было предпринято для того, чтобы пользователи были относительно довольны. А именно это, от части, является конечной целью.

1. NAS-сервера


Изначально, для пользователей были предоставлены несколько NAS-серверов (Network access server) с разными каналами и они сами выбирали, где им комфортнее. Но, как показала практика, в вышеописанных ограниченных условиях эта схема оказалась малоэффективной и весьма неудобной для пользователей.

2. Приоритеты


Далее, выбор пал на установку приоритетов необходимым портам: web-серфинг, игрушки, dns, ssh, etc. Некоторые порты были найдены тут и тут, некоторые — экспериментально.
Был испытан wondershaper (в ubuntu доступен из репозиториев, если не ошибаюсь), собственно сам htb, а начиналось всё со следующего скрипта (не хочу загромождать статью). Документации в интернете по этим вещам более чем достаточно, но если будут вопросы, то в помощи не откажу.

Каналы были разделены между двумя NAS-серверами и сбалансированы аппаратно, но вы можете попробовать сделать это и программно.

Ну что ж, эта схема порадовала больше. Каналы стали использоваться несколько эффективнее. Плюс к тому, приоритеты тоже дали о себе знать. Web-серфинг, однозначно, стал приятнее, да и в игрушках разница была ощутима, ровно как и во всём остальном, на что были ориентированы приоритеты. Хочется отметить, что ssh стал работать просто идеально, что не могло не порадовать. В общем, всё было хорошо, но казалось очевидным, что могло быть и лучше. Идём дальше.

3. Мухи — отдельно, котлеты — отдельно. (с) В.В.П.


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

В таком случае, рассмотрим шлюз.
Подразумевается, что медленные и быстрые каналы соединяются и балансируются в два отдельных аппаратно. Было решено направить приоритетный трафик по быстрому каналу, а весь остальной — через медленный. Что и было сделано с помощью iptables и iproute2.
Необходимые пакеты помечались (mark) с помощью iptables и, согласно маркировке, направлялись в нужный канал с помощью iproute2. Документации в интернете опять же много, но, хотелось бы отменить, что вам, быть может, будет проще отключить rp_filter для определенного интерфейса (и главное для default, рас уж взялись), чем составить окончательно правильные правила (масло масляное?) для iproute2. Могу описать весь этот процесс подробнее, если потребуется.

Взглянем, что получилось. С приоритетами всё идеально (со всеми без исключения). Каналы не загружены по максимуму даже в пиковое время. Все довольны, все счастливы, до поры до времени.

Так получилось именно в моём случае, что не обязательно должно получиться в вашем. Всё зависит от соотношения ширины каналов. В данном случае, совершенно случайно случилось так, что широкий канал относится к узкому как 2/1, соответственно. Хотя, вы можете сами распределить трафик так, как вам будет угодно.

Примечание: Если вы ещё не используете графический мониторинг проходящего через сервера трафика, то рекомендую сделать это. Попробуйте, например, Cacti.

Хочется отметить, что одна проблема всё же осталась — идентификация трафика Skype и/или BitTorrent.
Как вам известно, они используют огромный диапазон портов, что автоматически затрудняет распознавание их пакетов из общего потока на маршрутизаторе.
В итоге, пришлось сделать медленный канал общим для всего трафика (куда и попали наши друзья), а приоритеты отправлять в быстрый. Это не создало серьезных проблем со связью в Skype, но разница между идеальной связью и имеющейся ощутима.

П.С.: Первый хабратопик, друзья. Отнеситесь, пожалуйста, с пониманием.

Надеюсь, статья будет полезна.

Успехов!

UPD: Спасибо за карму, перенес в соответствующий блог.
+58
17 марта 2010, 10:17
63

комментарии (50)

+3
igla #
с почином вас!
+1
BeepSleepBeep #
Спасибо.
Хотелось бы увидеть конструктивную критику.
+3
paradigm #
Я правильно понял, что под аббревиатурой NAS вы подразумеваете «Network access server»? Тогда лучше напишите это явно.
Я по началу не понимал, как NAS, как «network attached storage», соотносится с «быстрыми и узкими» и «медленными и широкими» каналами.

И да, «NAS-сервер» — это отчасти «компактный CD диск» ;)
0
BeepSleepBeep #
Спасибо, поправил.
0
odiszapc #
Неплохо для первого раза!
НЛО прилетело и опубликовало эту надпись здесь
+4
zivot_je_cudo #
В статье не хватает практики, никакой конкретики, ничего не описано.
Согласен, что документации в интернете хватает, но тогда и статью можно было не писать. Мне как читателю, в первую очередь интересны конкретные примеры реализации, подводные камни, с которыми пришлось столкнуться, а не теория в двух словах «Это надо так, а это так». Ленивая статья.
Хочется отметить, что одна проблема всё же осталась — идентификация трафика Skype и/или BitTorrent.

Для качественной идентификации трафика, в том числе трафика skype, могу посоветовать l7-filter. Если патчить ядро лень, как и писать качественную статью, можете воспользоваться -m ipp2p для iptables в составе xtables-addons. Это поможет выделять p2p-трафик, но проблему skype не решит.
0
BeepSleepBeep #
Спасибо, приму к сведению. Про l7-filter не знал.
+1
g0dlike #
если использовать шифрование bittorrent, про l7filter/ipp2p можно забыть.
Я тестил уже.
0
g0dlike #
Хотя вот что интересно, каким. извините. хером, цисковские железяки могут их определять??
Там же полностью шифрованный пакет…
0
Sov1et #
Сокрость распознования не на высоте
0
huko #
А раскраска трафика идет только по портам?
Пробовали экспериментировать с L7-filter?
+1
krmolot #
"- я знаю что такое софтсвитч!
— никому не рассказывай!" — (с) nortel combat ;)
+2
devilev #
Свежие статьи по настройке iptables и iproute катастрофически необходимы. Оно понятно, что даже с существующей докой все можно без проблем настроить, но конкретные примеры всегда интересны и показательны, а такого примера как в топике я что-то не припомню. Так что ждем продолжения! :)
+3
BeepSleepBeep #
Размышляя от своего лица, я предположил что будет интересен именно опыт. Прошу простить, если я ошибся. Если будут ещё желающие, то непременно напишу статью с примерами.
+2
gusto #
Желающие есть.
+1
PocketSam #
Обязательно. И материала на большее число тем, глядишь, так хватит.
0
daiver #
Так чем в итоге приоритезируется трафик? Приведённым скриптом?
Если можно — как мониторится через cacti.
0
BeepSleepBeep #
В моём случае, при разделении трафика по каналам, отпала необходимость расставления приоритетов, но некоторые модификации приведенного скрипта успешно используются на некоторых других машинах с малым объемом проходящего трафика.
Мониторинг в cacti идёт стандартными, доступными из коробки, методами. Имеем график зависимости загруженности канала (bit per second) от времени, опрос через snmp каждые 5 минут. Вас это интересовало?
+1
daiver #
я подумал — что о более информативном мониторинге — каждые тип трафика\пользователь — выделен отдельным цветом (как здесь: habrahabr.ru/blogs/linux/60095/ )
0
BeepSleepBeep #
В моём случае, в этом нет необходимости, да и все там не уместятся, а даже если и так — понятного там будет мало.
0
Anton_Shevtsov #
iptables метит пакеты, а tc по меткам шейпит… думается так
+2
loginex #
сам с давних пор администрировал linux роутеры и NAS, но потом все свелось к л3 свитчам и шейперу на фрибзд(он же и нат… пока), а все потому, что трафик рос и даже весьма мощные процессоры не могли справиться с трафиком через iptables, на какое-то время помогла оптимизация при помощи iphash/ipmap (патч в иптаблес для реализации «таблиц», как table в фаерволе ipfw). Поэтому остерегайтесь софт свичей.
я близко не знаком с работой протокола skype, вроде как он использует очень похожее на http и sip, но заметил, что их софт поддерживает прокси, возможно вам стоит поднять один из таких прокси за NAS`ом(чтобы трафик считался и блокировался так же, как и прежде), а с этого прокси шел трафик по нужному каналу с нужным приоритетом. По поводу торрентов в иптаблесе есть нужный модуль, как правильно прокомментировали выше.
+3
charon #
было бы интересно почитать подробнее про шейпинг. Для меня настройки tc кажутся довольно непростыми, и какой-то ценной доки я еще не нашёл.
+4
ufik #
#!/bin/bash
#Настройка классов ведётся по отделам плюс гостевая подсетка, Ip раздаются по dhcp по #макам, все неизвестные компы засовываются в гостевую где зажимаются шейпером. #Приоритезации по протоколам нет, т.к. не требовалось, требовалось обеспечить канал #на отдел и поставить всех в равные условия.

#Настройка по отделам:
# рутовый класс в который будет засовываться всё что не попадает в фильтры.
tc qdisc add dev eth3 root handle 1: htb default 90
#основной класс с максимальной пропускной способностью (канал в инет)
tc class add dev eth3 parent 1: classid 1:1 htb rate 5Mbit ceil 5Mbit
#дальше классы идут с маркировкой в соответствии с подсеткой, тут уже как хотите так и #делайте. htb rate 2.3Mbit ceil 4.5Mbit тут 2.3 мегабита гарантированная скорость на #отдел который будет фильтроваться в этот класс, 4.5мегабита — это расширение канала #на отдел при условии что полоса будет свободна
tc class add dev eth3 parent 1:1 classid 1:80 htb rate 2.3Mbit ceil 4.5Mbit
tc class add dev eth3 parent 1:1 classid 1:81 htb rate 128kbit ceil 1Mbit
tc class add dev eth3 parent 1:1 classid 1:82 htb rate 1Mbit ceil 2Mbit
tc class add dev eth3 parent 1:1 classid 1:83 htb rate 128kbit ceil 1Mbit
tc class add dev eth3 parent 1:1 classid 1:84 htb rate 128kbit ceil 512kbit
tc class add dev eth3 parent 1:1 classid 1:85 htb rate 128kbit ceil 512kbit
tc class add dev eth3 parent 1:1 classid 1:87 htb rate 512kbit ceil 4.5Mbit
tc class add dev eth3 parent 1:1 classid 1:90 htb rate 128kbit ceil 1Mbit

#Дальше идут фильтры, фильтруется по подсеткам, те пакеты которые попадают в #фильтр направляются в соответствующий класс где шейпятся по правилам класса.
#Ну и имена классов, как мы видим, чтобы не путаться, взяты в соответствии с номером #подсетки.
tc filter add dev eth3 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.80.0/24 flowid 1:80
tc filter add dev eth3 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.81.0/24 flowid 1:81
tc filter add dev eth3 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.82.0/24 flowid 1:82
tc filter add dev eth3 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.83.0/24 flowid 1:83
tc filter add dev eth3 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.84.0/24 flowid 1:84
tc filter add dev eth3 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.85.0/24 flowid 1:85
tc filter add dev eth3 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.87.0/24 flowid 1:87
#тут включается метотд формирования очереди пакетов для каждого класса, т.е. если мы #будем формировать очередь пакетов для каждого отдела по принципу первый вошёл #первый вышел, то поставив закачку чегонибудь тяжолого, человек забьёт канал. Этот #метод формирования очереди мешает пакеты в очереди таким образом, чтобы в #нормальном приблежении дать одинаковый доступ к каналу всему отделу.
tc qdisc add dev eth3 parent 1:80 handle 80: sfq perturb 10
tc qdisc add dev eth3 parent 1:81 handle 81: sfq perturb 10
tc qdisc add dev eth3 parent 1:82 handle 82: sfq perturb 10
tc qdisc add dev eth3 parent 1:83 handle 83: sfq perturb 10
tc qdisc add dev eth3 parent 1:84 handle 84: sfq perturb 10
tc qdisc add dev eth3 parent 1:85 handle 85: sfq perturb 10
tc qdisc add dev eth3 parent 1:87 handle 87: sfq perturb 10

На последок немного поправлюсь и сниму и посыплю голову пеплом. Читал и курил lartc долго и упорно, всё это действо работало исправно, но возможно ко-то найдёт тут ошибки и если поправит то буду рад.
Второе что хотел заметить, мшинка раздающая инет была в сетке но не содержала в себе функции файл сервера и других ресурсоёмких вещей обслуживающие внутреннюю сеть. Поэтому шейпер написан на приходящий из корпоративной сетки интерфейс. Если вы натравите шейпер на интерфейс через который идёт уже отнатеный трафик, то эффекта у вас не будет никакого.
Сумбурно, поэтому не статья, так на коленке написанный скрипт чтобы было =).
0
ufik #
Вообще главное разобраться в структуре, класс производит работу над трафиком, который в свою очередь фильтруется из основного потока фильтрами.
Ну и формирование очередней пакетов, тут уже по надобности.
0
zwie #
Присоединяюсь, хотелось бы в доступном формате почитать про tc, с различными примерами.
0
anclrej #
У меня есть практически тот же опыт и те же задачи. Так же есть два канала. Сервера доступа изначально на FreeBSD, и приоритеты реализованы на основе ipfw (долго парился с этим — готовых примеров не нашел нигде) Если интересно, могу написать как делал. Сейчас заказали и ждем автономную систему, а так-же планируется третий канал — это для балансировки между каналами и резервирования.

Для меня больная тема на сегодня это Скайп. Не получается отделить его трафик от п2п (он по сути и есть п2п) без больших затрат ресурсов. Может кто-нибудь поделится решением. Пока смотрю в сторону прокси, но до конца не представляю всю схему — может кто-то делал?
0
ufik #
по сигнатурам пакетов разве что, вроде циска так делает. как на фряхи это делать я незнаю, на иптаблесе есть отдалённое представление, т.к. помнится проблему с мюторрентом недавнюю и его протоколом решали нахождением пакетов с определённым смещением.
НЛО прилетело и опубликовало эту надпись здесь
0
GAmoVeR #
p2p latency неважен чуть более, чем полностью
Медленный, но широкий! Вы читали статью?
0
BeepSleepBeep #
p2p трафик чувствует себя более чем комфортно на медленном канале, заказанная скорость обеспечивается всем клиентам. Под медленным каналом подразумевается только то, что ответные пакеты там приходят, например, не за 40-60 мс, а за 80-120 мс, а это практически не заметно при скачивании, другое дело — голосовая связь.
Мы уважаем и заботимся о своих клиентах и пытаемся выжать из сложившейся ситуации максимум.
НЛО прилетело и опубликовало эту надпись здесь
0
BeepSleepBeep #
Со временем, ситуация с расширением канала обещает изменится.
Нам не поступает жалоб на общение в Skype, правда. Просто это личные наблюдения.
Разумеется, деление на сети есть и внутри сети клиенты общаются без проблем.
+2
Lamo #
Блядь, с таким русским ты долго не продержишься. Прочитал твои два коммента — как говна наелся :(
НЛО прилетело и опубликовало эту надпись здесь
0
Pingwin32 #
1. А можно по подробнее ТЗ расписать? Я вот ничего не понял толком.

Было: «интернет помегабайтный», стало: «считать уже не мегабайты, а скорость».
В моём понимании второй случай, это когда у клиента безлимитный интернет с относительно фиксированной скоростью. В этом случае делить каким-то образом трафик должен сам клиент в приделах выделенного ему канала. А если заявлять, что мол страницы у нас грузятся на 1Мбит, а торренты вы можете качать на 0,1Мбит это (извините за русский) наебалово.

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

3. Спасибо за статью. Теперь я понял какой у меня замечательный провайдер. У нас пошли дальше. И интернет считается не скоростью, а деньгами. Полностью безлимитные тарифы 0,5-1кр, с шагом 0,1кр. Максимальная скорость ограничивается в зависимости от времени суток(заранее рассчитана с учетом загруженности каналов). На самом дешевом безлимитном тарифе варьирует о 2 до 48 Мбит на дорогом от 14 до 100 МБит. И торренты качаются на предельной скорости, исходящий трафик ограничен сильнее но при общей загрузке канала до 100 Мбит не влияет на скорость скачивания. При времени с ограничением скорости до 24Мбит, одновременно может идти скачка на 3Мб/с и раздача на 800 Мб/с.

P.S.: Это я не хвастаюсь, просто привел пример.
0
BeepSleepBeep #
1. Клиенты получают заказанную скорость во всём (см. комментарий выше). Каждая жалоба рассматривается и принимаются меры.
2. Скайп, порой, заикается. Не из-за загруженности канала, а из-за того, что пакеты по нему ходят относительно медленно.
3. Вам повезло — нам нет, но мы не отчаиваемся и продолжаем искать выход. :-)
0
stoune #
Если я правильно понял автора, каналы отличаюся латентностью, то что в простонародье называют ping. Торентам плевать на большие задержки ответа, а голосовой трафик и игрушки чуствительны к этому, но в тоже время не являются такими трафиконагружающими.
0
Bolik #
у вас на сервере убунта сервер? тоже хочу себе убунту на сервер… Ну поколение у нас такое, что теперь делать; )
Красноглазеки делают фу и плюются, а мне главное чтобы работало и было удобно.

Как Вам, если оно так? ) очень интересно.
0
BeepSleepBeep #
Знаете, я не возьмусь советовать, но рас вас интересует моё мнение, то могу сказать что да, большинство серверов работает на ubuntu и я доволен показателями, полет нормальный уже лет 6 как + нет проблем с документацией.
НЛО прилетело и опубликовало эту надпись здесь
0
Kastrulya #
Если вы ещё не используете графический мониторинг проходящего через сервера трафика, то лучше начинать не с какти. уж больно громоздкая зверюка. есть попроще пакеты.
0
BeepSleepBeep #
Обоснуйте, пожалуйста. Не спора ради, просто у меня, например, на знакомство с Cacti и настройку ушло минут 15-20. Но, откровенно говоря, в этой области у меня недостаточно опыта для того, чтобы с чем-то сравнивать.
0
citius #
Юзайте циски.
Если денех нет — недорого можно нормальное б/у-шное железо брать.

Преимущества (не в порядке приоритета):
1) гораздо проще настройки
2) не надо все это барахло серверное поддерживать и бекапить
3) существенно лучше документация
4) гораздо проще масштабируется
0
BeepSleepBeep #
Согласен с вами. Мы уже потихоньку готовимся к этому переходу.
0
Imenem #
Почему бы не поднять прокси, специально для Скайпа, и после этого вывесить в новостях на сайте провайдера «Уважаемые пользователи, с целью улучшения качества связи в „Скайп“ просим пользоваться данным прокси». После этого уже метить пакеты с этого прокси (после проверки на принадлежность к определенному виду) и роутить на быстрый канал?
0
BeepSleepBeep #
Мне кажется, что будут злоупотреблять. Как вы считаете? Тот же торрент можно направить через прокси и этим не ограничиться, рас уж там лучше.
0
Imenem #
Мне кажется, что Скайп можно будет определить «методом исключения», то есть, «все, что не отсеялось проверкой на тип трафика- Скайп», а торренты определять с помощью L7-filter, как советовали в комментах, и дропать при обнаружении, а не роутить. Чтобы вели себя правильно и не прописывали прокси для Скайпа в торрент-клиенты.
0
BeepSleepBeep #
Всё лишнее отсеять не получится, но избавление на прокси от p2p трафика, от части проблему решит, на первый взгляд. Но, к сожалению, судя по этому комментарию, опять получается уязвимость.
В любом случае, спасибо за идею, протестируем в ближайшее время.

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