07 Июл
Автор: ras Рубрики: Администрирование
Решил написать небольшое HOWTO по настройке шейпера HTB на маршрутизаторе (роутере) на базе Linux при помощи скрипта htb.init. Задача следующая: есть офисная сеть, есть подключение к сети Интернет на определённой скорости, в рассмотренном случае это 20 мегабит вход и 5 мегабит исход, скорость нужно поделить равнозначно между офисными компьютерами, но в случае когда канал не загружен — дать возможность работать на максимальной скорости. В данном HOWTO шейпиться будет не только входящий, но и исходящий трафик, причём подключение к Интернет производится по PPP, что накладывает некоторые нюансы на настройку.
Настройка приведена на примере дистрибутива CentOS (RHEL, Fedora), для Debian (Ubuntu) будут тоже приведены пояснения, так как некоторые системные утилиты отличаются.
Для начала нужно загрузить и настроить сам скрипт построения правил шейпера, даю пример не на оригинальный скрипт, а на модифицированный мной (исправлено несколько ошибок, добавлено удаление кэша при перезапуске шейпера, т. к. бывает в кэше остаются записи, которых уже нет в конфигурационных файлах, версия 0.8.4):
Скрипт загружен, сделан запускаемым, симлинк помещён куда нужно, теперь нужно включить его в автозагрузку, для CentOS (RHEL, Fedora):
То же для Debian (Ubuntu):
Далее нужно создать каталоги для файлов конфигурации шейпера:
Теперь можно приступить непосредственно к настройке. Правила шейпера строятся на основе файлов, которые нужно создавать в каталоге /etc/sysconfig/htb, отсюда их будет читать htb.init и строить правила для утилиты tc. Напомню, что канал у нас 20/5 мегабит, примерно 10 компьютеров в сети, исходя из этого ниже будут приведены файлы конфигурации с пояснением что они описывают.
Файл описания интерфейса, eth0 — интерфейс смотрящий в локальную сеть офиса. Адресация 192.168.0.1/24, маршрутизатор имеет IP 192.168.0.1, следующие за ним — компьютеры офиса. Указывается класс, которым будет шейпиться трафик, не попавший ни под одно правило шейпера.
/etc/sysconfig/htb/eth0
Далее файл описания корневого класса интерфейса, указывается физическая скорость интерфейса, в данном случае это 100 мегабит.
/etc/sysconfig/htb/eth0-2.root
Вначале необходимо нарезать скорость для трафика, исходящего с самого роутера, например если на нём установлен файл-сервер, можно дать скорость большую чем в Интернет, причём эта скорость не повлияет на скорость работы в сети Интернет. 100 — 20 мегабит, ну и 10 можно оставить на служебные пакеты и т. п., чтобы не образовалась планка (полная загрузка интерфейса), и работа оставалась комфортной, получается 70 мегабит. Скорость с файл-сервера можно тоже равномерно поделить между участниками сети, но в данном примере это опускается.
/etc/sysconfig/htb/eth0-2:4.from_router_to_network
Теперь очередь описания класса трафика из сети Интернет. Один мегабит останется для трафика не попавшего в правила, 19 мегабит остаётся описывается. Тут приоритет указан больше чем в локальном трафике с роутера, чем он больше, тем обрабатывается позже.
/etc/sysconfig/htb/eth0-2:5.to_network
Теперь непосредственно сами правила для компьютеров сети. Максимальная скорость на один компьютер 19 мегабит, гарантированная — один мегабит. Таких файлов нужно создать по кличеству компьютеров в сети, последнее число — это 1000 + последний октет IP-адреса. И в самом файле в RULE указан IP-адрес компьютера. Входящий трафик на сам роутер не шейпится, это можно сделать, но метод в данном примере не рассматривается.
/etc/sysconfig/htb/eth0-2:5:1002
Тот трафик, который не попал в предыдущие правила — шейпится на скорости 1 мегабит.
/etc/sysconfig/htb/eth0-2:9.default
Теперь исходящий трафик. В принципе то же самое, интерфейс ppp0, скорость 5 мегабит, трафику не попавшему под правила даётся 128 килобит (последний файл), остальным от 512 килобит до 5 мегабит. Трафик с роутера также будет шейпиться.
/etc/sysconfig/htb/ppp0
/etc/sysconfig/htb/ppp0-2.root
/etc/sysconfig/htb/ppp0-2:5.from_network
Так как исходящий трафик у нас натится (SNAT, MASQUERADE) в один внешний IP-адрес, не получится строить правила на основе IP-адресов. Поэтому будут использованы метки, которые будут ставиться фаерволом (iptables), об этом ниже. Таких правил нужно создать по количеству компьютеров в сети, опять же последняя цифра это 1000 + последний октет IP-адреса, метка (MARK) имеет такое же значение.
/etc/sysconfig/htb/ppp0-2:5:1001
/etc/sysconfig/htb/ppp0-2:9.default
Теперь о метках. В iptables нужно пометить исходящий трафик, делается это следующим правилом в таблице mangle:
Для каждого компьютера — своё правило. В CentOS (RHEL, Fedora) правила фаерволла обычно находятся в файле /etc/sysconfig/iptables, после правки нужно применить изменения командой:
В Debian (Ubuntu) можно сделать так. Снять текущую конфигурацию в файл:
Поправить и применить:
Данные команды работают и в CentOS (RHEL, Fedora), если нужны. Далее. Настройка окончена, теперь нужно проверить правильность нашей конфигурации:
Если ошибок нет — будет видно что же построил скрипт htb.init для системы на основе файлов конфигурации. Теперь можно запустить шейпер:
Остался один нюанс. Соединение с Интернет в данном примере производится по PPP, в случае если используется непосредственное подключение — дальше можно не читать. Но интерфейс PPP (ppp0) может падать (переподключение, пропадание связи), при падении интерфейса, все правила шейпера на нём будут сброшены. Следующий скрипт будет проверять наличие PPP-интерфейса и наличие на нём правил, если правил не будет, он перезапустит htb.init.
/usr/local/sbin/htb_check
Файл нужно сделать запускаемым:
Запускаться он будет по cron, каждую минуту, для этого в файле /etc/crontab добавляются следующие строки:
На этом всё, надеюсь кому-то данное HOWTO пригодится, предложения, пожелания и замечания готов обсудить в комментариях к статье.
Максим
Здравствуйте! не могли бы вы подсказать настройки, конфигурация сети такая, eth0 интерфейс смотрящий в мир 1.5 мегабит, eth1=1Gbit шлюзом в локальную сеть 192.168.2.100, eth2=1Gbit шлюзом 192.168.2.99, есть 2 вида пользователей, на eth1 обращаются интернет пользователи без ограничений на ресурсы в 1Mbit, а на шлюз eth2 клиенты онлайн игр в 512Kbit с доступом только по портам игр и не каких страничек, локалка из 30 машин в одной подсети
И что подсказать? Или вы хотите чтобы я вам готовую конфигурацию выложил со всеми настройками?
Если всю конфигурацию, то не получится, статья довольно подробно всё описывает, правила назначаются с фильтрами кроме как по IP, так и по меткам и портам. Т. е. шейпер можно построить по любому вкусу, даже с QoS. Если вам нужна рабочая конфигурация под ключ, готов зайти по ssh и настроить всё за WebMoney.
Smoky555
Вопрос есть …
2-й день бьюсь, и все бестолку …
поставил FC14, iproute последний, freeradius, rp-pppoe, ppp …
настроил авторизацию через mysql.
клиенты логинятся нормально, инет наружу работает, но у всех клиентов входящяя скорость ограничена 128кбит/с.
По умолчанию были скрипты /etc/sysconfig/cbq. Пытался там настроить входящую скорость — не получилось.
Скачал по ссылке отсюда htb скрипт.
Вроде все настроил, всем клиентам в обе стороны 512. отключаю cbq, компилю и запускаю htb — исходящая = 512, входящая скорость также 128 и не меняется.
Что еще где ограничивает скорость для pppoe клиентов? Где отключить эту настройку?
Smoky555
немного неверно сказал в предыдущем комментарии …
У меня постоянное соединение с интрнетом, интерфейс еth1, в сеть смотрит eth0
У меня для всех пользователей должна быть одинаковая скорость, так что файлы-правила для ppp0 не создавал, для eth0 по умолчанию для все скорость 512кбс
Когда 1 клиент — 512, когда 2 — скорость у каждого пополам, когда 3 — в 3 раза меньше …
Подскажите плиз, куда смотреть, уже несколько вариантов перепробовал — скорость либо у всех максимальная, как на внешнем канале (если убрать файл eth1.default), либо пропорциональная количеству подключенных клиентов.
Какая у вас ширина внешнего канала? Сколько указано в корневом классе RATE? И вообще какие скорости у вас прописаны CEIL и RATE в корневом классе и в индивидуальных? Ибо если у вас негарантированная CEIL=512Kbit у всех, и корневой (общий) класс тоже на 512, то всё правильно, скорость должна будет поделиться пропорционально на двух/трёх и т. п., клиентов в зависимости от их количества.
Посмотрите внимательно мой пример, там в корневом классе прописана максимальная скорость канала, а в клиентских уже прописан этот максимум в негарантированной скорости CEIL, а гарантированная скорость уже пишется в RATE.
Smoky555
ситуация такова:
роутер, fc14, 2 интерфейса, eth0 — смотрит в сторону клиентов, IP=172.20.10.1, сеть 172.20.10.0/24
интерфейс eth1 — выделенный канал в интернет, белый IP
в каталоге /etc/sysconfig/htb след. файлы:
eth0:
DEFAULT=9
eth0-2.root:
RATE=100Mbit
eth0-2:9.default:
RATE=256Kbit
PRIO=5
LEAF=sfq
eth1:
DEFAULT=9
eth1-2.root
RATE=5Mbit
eth1-2:9.default:
RATE=256Kbit
PRIO=5
LEAF=sfq
при подключении клиента динамически создается файл для клиента с ip=172.20.10.72
eth0-2:5:(1000+последний октет ip-адреса клиента)1072 содержащий:
CEIL=5Mbit
RATE=512Kbit
PRIO=5
LEAF=sfq
RULE=172.20.10.72
и делается
/etc/sysconfig/htb restart
При отключении клиента этот файл удаляется.
Скорость у клиента при этом вместо 512 всего 256.
Что я еще забыл сделать ?
Складывается впечатление что добавляемое вами правило не применяется, либо RULE в нём не попадает на трафик пользователя, т. к. 256 — это у вас DEFAULT-класс, в который попадает трафик, не попавший в другие правила. Посмотрите реальную ситуацию на интерфейсе:
tc -s class show dev eth0
Должен быть во-первых класс для данного правила, во-вторых должны быть пакеты в счётчиках, ну и сброшенные пакеты при превышении лимита скорости.
Smoky555
класс есть, счетчики пусты:
> tc -s class show dev eth0
class htb 1:1010 root leaf 1010: prio 5 rate 512000bit ceil 5000Kbit burst 1600b cburst 1600b
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 390625 ctokens: 40000
class htb 1:9 parent 1:2 leaf 9: prio 5 rate 256000bit ceil 256000bit burst 1600b cburst 1600b
Sent 10920 bytes 174 pkt (dropped 0, overlimits 0 requeues 0)
rate 2128bit 4pps backlog 0b 0p requeues 0
lended: 174 borrowed: 0 giants: 0
tokens: 765641 ctokens: 765641
class htb 1:2 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
Sent 10920 bytes 174 pkt (dropped 0, overlimits 0 requeues 0)
rate 2128bit 4pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 1969 ctokens: 1969
> cat /etc/sysconfig/htb/eth0-2:5:1010
CEIL=5Mbit
RATE=512Kbit
LEAF=sfq
PRIO=5
RULE=172.20.10.10
И tcpdump -nni eth0 dst host 172.20.10.10 трафик показывает?
Явно не попадает трафик в правило, поэтому и не шейпит, может интерфейсы или вход/исход путаете?
RULE=172.20.10.10 — указывает dst host, а вот
RULE=172.20.10.10, — указывает src host
Smoky555
хех ![]()
вот по tcpdump ни на dst, ни на src по адресу 172.20.10.10 ничего не ловится вообще.
трафик по этому адресу проходит только на интерфейсе ppp0 — динамический интерфейс для клиента
Smoky555
нда…
все оказалось намного хуже …
те цифры скорости что я приводил оказались для исходящего трафика (мерил iperf-ом, он тока до сервера мог достучаться, в обратную — никак)
так что получается так — исходящая скорость регулируется значение в файле eth1-2:9.default.
Ну исходящая меня пока не волнует, а вот входящая всегда одинакова и равна 128кбит/с, что бы я не делал …
пошел вешаться
Схемку нарисуйте лучше на листике, с сетями, адресами, скоростями и прикиньте, что трафик шейпится на исходе!!! Т. е. входящи трафик например, если приходит на eth1, то чтобы шейпить вход — нужно резать его на исходе, т. е. на eth0, где он будет исходящим для сервера.
И кстати, чтобы не путаться — настройте сначала входящую, а исходящую не трогайте вообще, меньше будете путаться.
Виталий
Вижу вы человек разбирающийся. Настраивал даную схему через tc, весь трафик почему то направлялся в дефолтный класс, что бы я в фильтре не писал. Нашел эту инструкцию, зделал все как на рисунке. Все равно весь трафик идет в дефолтный класс. В чем может быть проблема? Дистрибутив Ubuntu 10.04
Дистрибутив роли не играет, tc — это лишь интерфейс к шейперу ядра, htb.init — это интерфейс к tc, при помощи команды compile можно посмотреть что вы построили им, т. е. /etc/init.d/htb compile. Нужно посмотреть что за фильтры получились, попробовать по ним посмотреть прохождение трафика при помощи tcpdump, не забыт про запятые в RULE. Если указана запятая, значит опущен второй параметр, т. е. адрес назначения, а указан исходящий адрес на интерфейсе, что в tcpdump задаётся как src host. Если нет запятой — то адрес назначения, dst host соответственно.
Виталий
Переделал наново, в надежде что где то все таки ошибся. Проблема осталась, если не трудно ткните пальцем куда копать)
compile выводит следующее:
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1 htb default 9
tc class add dev eth0 parent 1: classid 1:2 htb rate 100Mbit
tc class add dev eth0 parent 1:2 classid 1:4 htb rate 90Mbit prio 4
tc qdisc add dev eth0 parent 1:4 handle 4 sfq perturb 10
tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.0/24 classid 1:4
tc class add dev eth0 parent 1:2 classid 1:5 htb rate 100Kbit prio 5
tc class add dev eth0 parent 1:5 classid 1:1010 htb rate 50Kbit ceil 100Kbit prio 5
tc qdisc add dev eth0 parent 1:1010 handle 1010 sfq perturb 10
tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip dst 10.8.0.10 classid 1:1010
tc class add dev eth0 parent 1:5 classid 1:1011 htb rate 50Kbit ceil 100Kbit prio 5
tc qdisc add dev eth0 parent 1:1011 handle 1011 sfq perturb 10
tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip dst 10.8.0.11 classid 1:1011
tc class add dev eth0 parent 1:2 classid 1:9 htb rate 20Kbit prio 5
tc qdisc add dev eth0 parent 1:9 handle 9 sfq perturb 10
Виталий
Перенастройка всетаки помогла, заодно нашел ошибку в строке
tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.0/24 classid 1:4
А у меня же сеть 10.8.0.0/16
Большое спасибо за статью Александр.
не за что, значит просто досадная опечатка…
Виталий
Качает но жестко по RATE, в чем может быть косяк?
Вот как у меня выглядит пользователь:
RATE=1Mbit
CEIL=10Mbit
PRIO=5
LEAF=sfq
RULE=10.8.0.10
Вывод компиля в прошлом сообщении.
Виталий
Нет, сначала дает скорость ближе к CEIL, через несколько секунд опускается до RATE, и назад не поднимается(
У вас общая скорость указана в 100 килобит:
tc class add dev eth0 parent 1:2 classid 1:5 htb rate 100Kbit prio 5
А дальше вы раздаёте гарантированных 50, негарантированных 100 (КИЛОБИТ). Не знаю зачем вам такие «высокие скорости»
, но у вас описано 3 клиента, хотя 2 уже могут забить общую полосу до планки. А такую полосу забить очень легко. Думаю что так и происходит. И это ещё хорошо что скорость падает только до rate а не ещё ниже.
Виталий
Я для теста ставил такие скорости, а то небыло на чем потренироватся)
А когда решил что то серьезное зделать, не поменял общ. скорость, еще раз спасибо)