марта 30 2008 05:39 пп

Настройка ограничения и распределения канала (HTB Shaper)

Если у Вас есть Ваша собственная домашняя сеть с двумя или более компьютерами и она подключена к интернету, вы точно знаете о тех проблемах с одновременным доступом к сети, которые практически неизбежны при таком подключении. Самой большой и раздражающей проблемой является разделение ширины канала между всеми участниками сети: когда вы пытаетесь работать через ssh с удалённым сервером, а в этот момент ваша wife/брат/друг решает поглядеть новый и очень классный видео клип с Google Video или YouTube, Ваше соединение замирает и вы можете забыть о комфортабельной работе . В этой маленькой статье я дам вам простое решение этой проблемы, которое позволит вам делать все, что угодно не думая о проблемах разделения трафика!

Для начала замечу, что Ваша сеть должна быть подключена к Internet при помощи Linux сервера. Если Вы подключены через какой-то тупой аппаратный маршрутизатор, то Вам сильно не повезло и вы не сможете воспользоваться приведенным примером.

CBQ и HTB — представляют собой систему ограничения трафика по скорости. Это наиболее распространённые варианты шейперов.
HTB — более точнее ограничивает скорость и удобней настраивается.

Шейпер работает так: все ИСХОДЯЩИЕ пакеты, т.е. предназначенные для выдачи на любой интерфейс вместо того, чтобы быть отправляться напрямую на интерфейс ставятся в разные очереди. Длина каждой очереди настраивается. Настраиваются также: скорость выдачи данных из очереди (это и есть собственно лимит), длина очереди (размер в байтах), размер пакета, выходящего из очереди (может не совпадать с длиной поступающих пакетов) и многое другое. Пакеты, не помещающиеся в очередь, сбрасываются. Данные из очереди выдаются на интерфейс и далее — к клиенту. Вот как раз каждый файл конфигурации и представляет собой описание одной очереди.

Далее приведен пример настройки шейпера с использованием скрипта htb.init, на сервере с дистрибутивом Ubuntu, с каналом в интернет 6Mbit/sec in/out и локальной сетью 100Mbit/sec in/out,
с 2мя интерфейсами eth0 (интернет) и eth1 (локальная сеть), а так же на сервере используется NAT реализованный с помощью iptables. Имеется 3 компьютера в локальной сети которые получают доступ в интернет и другую локальную сеть через этот сервер.

Для начала скачайте сам скрипт htb.init который будет генерировать вам правила шейпера согласно созданным вами файлам конфигурации.
Сайт проекта http://sourceforge.net/projects/htbinit/
Затем назовем скачанный скрипт htb и поместим в директорию /usr/sbin, присвоим аттрибуты для запуска командой chmod +x /usr/sbin/htb.
По желанию можно добавить скрипт в автозагрузку системы, сделать это можно следующими командами:
Код:


ln -sf /usr/sbin/htb /etc/init.d/htb
update-rc.d htb start 20 0 1 2 3 4 5 .

Теперь надо создать директории и файлы необходимые для правильной работы скрипта.
Код:


mkdir /etc/sysconfig
mkdir /etc/sysconfig/htb
touch /var/cache/htb.init

Теперь можно приступать к написанию конфигурационных файлов нашего шейпера.
Создадим основные файлы для интерфейса eth0
Код:


cd /etc/sysconfig/htb
touch eth0
vim eth0

Впишите в файл следующие строки:
Код:


DEFAULT=0
R2Q=100

Этот файл указывает номер класса в который попадет весь не классифицированный трафик и точность шейпера, чем меньше значение R2Q тем меньше погрешности в плюс или минус по скорости, в Kbit/sec.

Создадим следующий файл
Код:


touch eth0-2.root
vim eth0-2.root

Впишите в файл следующее:
Код:


RATE=100Mbit
CEIL=100Mbit

Этот файл корневого класса для интерфейса, в нем содержится макисмально возможная скорость, из которого будут брать ресурсы дочерние классы.

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

Далее создадим файлы для пользователей которые выходят в интернет через наш сервер, и имеют разную скорость доступа. Назовем пользователей vasya, petya, dima и дадим пользователю vasya скорость доступа 1600Kbit/sec in/out, пользователю petya 800Kbit/sec in/out и пользователю dima 256Kbit/sec in/out. Так же на сервере стоит фтп, и надо разрешить пользователям качать с него со скоростью выше чем скорость доступа к интернету. Так же при использовании NAT необходимо использовать iptables для маркировки пакетов, иначе шейпер будет ограничивать только скорость закачки пользователей.
Адресация нашей локальной сети у нас будет 192.168.0.0/22
Адресация локальной сети за интерфейсом eth0 у нас 10.0.0.0/8
Адрес сервера 192.168.0.1 и далее по порядку адреса клиентов.

Создадим файл eth0-2:05.default
Код:


touch eth0-2:05.default
vim eth0-2:05.default

Впишите в файл следующее:
Код:


RATE=99Mbit
CEIL=99Mbit
LEAF=sfq

Этот файл является классом для всего трафика который не подходит под другие классы.

Далее следующий файл
Код:


touch eth0-2:06.lanload
vim eth0-2:06.lanload

Впишем в файл
Код:


RATE=50Mbit
CEIL=50Mbit
LEAF=sfq
PRIO=99
RULE=10.0.0.0/8,10.20.30.40/22

Этот файл ограничивает скорость закачки для клиентов локальной сети которая находится за интерфейсом eth0 и имеет адресацию 10.0.0.0/8, а сам интерфейс eth0 имеет адрес 10.20.30.40

Теперь файлы для наших трех компьютеров
Код:


touch eth0-2:07.vasya
vim eth0-2:07.vasya

Впишите в файл
Код:


BURST=50Kb
RATE=1600Kbit
CEIL=1600Kbit
LEAF=sfq
PRIO=1
MARK=102

Этот файл отвечает за ограничение исходящей скорости доступа в интернет для абонента vasya,
но для корректной работы надо добавить правила маркировки пакетов от этого пользователя в iptables IP адрес у пользователя vasya 192.168.0.2, создадим для него правила фаервола.
Код:


iptables -t mangle -A PREROUTING -s 192.168.0.2 -j MARK --set-mark 102
iptables -t mangle -A PREROUTING -s 192.168.0.2 -j RETURN

Если на вашем сервере на котором будет работать шейпер не используется NAT вы можете не использовать маркировку пакетов и просто заменить параметр MARK=102 на RULE=192.168.0.2/22.
На этом с пользователем vasya Закончим и перейдем к следующему.

Создадим файл eth0-2:08.petya
Код:


touch eth0-2:08.petya
vim eth0-2:08.petya

Впишите в файл
Код:


BURST=50Kb
RATE=800Kbit
CEIL=800Kbit
LEAF=sfq
PRIO=1
MARK=103

Этот файл является классом для пользователя petya, не забудьте так же создать правила фаервола для маркировки пакетов.
Код:


iptables -t mangle -A PREROUTING -s 192.168.0.3 -j MARK --set-mark 103
iptables -t mangle -A PREROUTING -s 192.168.0.3 -j RETURN

Следующий пользователь dima
Код:


touch eth0-2:09.dima
vim eth0-2:09.dima

Впишите в файл
Код:


BURST=50Kb
RATE=256Kbit
CEIL=256Kbit
LEAF=sfq
PRIO=1
MARK=104

Этот файл будет ограничивать скорость интернета пользователю dima, не забываем про фаервол
Код:


iptables -t mangle -A PREROUTING -s 192.168.0.4 -j MARK --set-mark 104
iptables -t mangle -A PREROUTING -s 192.168.0.4 -j RETURN

На этом настройки классов для интерфейса eth0 закончены, перейдем к интерфейсу eth1.

Создадим файлы конфигурации для интерфейса eth1
Так как NAT на интерфейсе eth1 у нас не используется то маркировать пакеты не надо, просто настроим шейпер на работу с адресами.
Создайте файл eth1 с содержимым
Код:


DEFAULT=0
R2Q=100

Создайте файл eth1-2.root с содержимым
Код:


RATE=100Mbit
CEIL=100Mbit

Создайте файл eth1-2:05.default с содержимым
Код:


RATE=99Mbit
CEIL=99Mbit
LEAF=sfq

Создайте файл eth1-2:06.lanload с содержимым
Код:


RATE=50Mbit
CEIL=50Mbit
LEAF=sfq
PRIO=99
RULE=192.168.0.0/22,192.168.0.1/22

Создайте файл eth1-2:07.vasya с содержимым
Код:


BURST=50Kb
RATE=1600Kbit
CEIL=1600Kbit
LEAF=sfq
PRIO=1
RULE=192.168.0.2/22

Создайте файл eth1-2:08.petya с содержимым
Код:


BURST=50Kb
RATE=800Kbit
CEIL=800Kbit
LEAF=sfq
PRIO=1
RULE=192.168.0.3/22

Создайте файл eth1-2:09.dima с содержимым
Код:


BURST=50Kb
RATE=256Kbit
CEIL=256Kbit
LEAF=sfq
PRIO=1
RULE=192.168.0.4/22

Вот собственно и все, прверьте что все созданные вами файлы находятся в каталоге /etc/sysconfig/htb и можно тестово прогнать скрипт командой
Код:


htb compile

В ответ на которую скрипт сгенерирует список правил шейпера согласно файлам конфигурации.

Далее можно применить настройки командой
Код:


htb start

Просто запустив команду htb вы увидите список команд скрипта, так же немного полезной информации содержится в самом скрипте, вы можете открыть его в текстовом редакторе и прочитать.
Так же советую вам ознакомится с устройством шейпера HTB по адресу http://remizov.pp.ru

Надеюсь эта статья была полезна для вас =) Удачи в настройке.





55 комментариев »


55 комментариев to “Настройка ограничения и распределения канала (HTB Shaper)”

  1. Stepanoff on 18 Мар 2010 at 16:09 #

    При наборе команд использовать клавишу TAB. Команда update-rc.d.

  2. Petrovi4 on 02 Июн 2010 at 02:39 #

    Огромное спасибо.
    Вроде все получилось.
    Подскажите, пожалуйста, какие значения параметров(R2Q, BURST и т.д.) мне лучше использовать.
    Мои параметры:
    количество юзверей: 30
    прием: 20-21 Мбит
    отдача: 512-600 Кбит
    И подскажите от чего вы отталкиваетесь, подбирая значения.
    Заранее благодарю.

  3. Максим Степанов on 02 Июн 2010 at 10:13 #

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

  4. asta on 24 Янв 2011 at 12:47 #

    Файл eth0-2:07.vasya и eth1-2:07.vasya , к примеру, что обозначает 2:07 — перечитал несколько раз ничего не понял. Если у меня 5 клиентов с ограничением 1024kbit/c для каждого — то возникает три вопроса:
    1 — то что я указывал 2:07 в имени файла оставлять у всех одинаково? т.к. скорость не меняется но для каждого отдельно
    2 — параметр MARK — указывать для всех одинаковый? или если укажу одинаковый то не для каждого отдельно скорость будет, а одна указанная для всех?
    3 — если в имени файла увеличивать 2:07 2:08 ….. 2:12 , к примеру, то это может идти до бесконечности?

  5. VitalyVoskobovich on 30 Янв 2012 at 09:41 #

    Здравствуйте. Имею:
    ppp0 = 100Mbit (внешний мир)
    eth1 = 100Mbit (локальная сеть)
    Задача — Ограничить только скорость когда качают торрент.
    На сервере еще крутится сервер чата, для которого тоже должен быть запас.
    инет —> ppp0 —> сервер чат —> eth1 —> клиент. Нужно, что бы не оказалось, что для чата не хватает места в канале, что бы не было обрывов ибо там видео связь, передача файлов и прочее.
    На скачку торентов я выделяю 60Мбти\сек
    На серфинг сайтов 5 Мбит\сек
    Если что-то другое 10 Мбит\сек
    И на чат 25Мбит\сек (которые остаются свободными). Верно ли я мыслю?
    Чат доступен внешне и большее количество подключения будет из вне, у него есть конкреный рабочий порт, может можно как-то привязать к этим правилам что бы не оставлять запас такой?

    «ppp0»
    DEFAULT=30
    R2Q=10

    «ppp0-2.root»
    RATE=100Mbit
    CEIL=100Mbit

    «ppp0-2:20.www»
    RATE=5Mbit
    CEIL=100Mbit
    PRIO=1
    LEAF=sfq
    RULE=*:80,
    BURST=100Kb

    «ppp0-2:30.default»
    RATE=10Mbit
    CEIL=100Mbit
    PRIO=2
    LEAF=sfq

    «ppp0-2:10.torrents»
    RATE=60Mbit
    CEIL=100Mbit
    PRIO=3
    LEAF=sfq
    RULE=*:6881,
    RULE=*:6882,
    RULE=*:6883,
    RULE=*:6884,
    RULE=*:6885,
    RULE=*:6886,
    RULE=*:6887,
    RULE=*:6888,
    RULE=*:6889,

    «eth1»
    DEFAULT=30
    R2Q=10

    «eth1-2.root»
    RATE=100Mbit
    CEIL=100Mbit

    «eth1-2:20.www»
    RATE=5Mbit
    CEIL=100Mbit
    PRIO=1
    LEAF=sfq
    RULE=*:80,
    BURST=100Kb

    «eth1-2:30.default»
    RATE=10Mbit
    CEIL=100Mbit
    PRIO=2
    LEAF=sfq

    «eth1-2:10.torrents»
    RATE=60Mbit
    CEIL=100Mbit
    PRIO=3
    LEAF=sfq
    RULE=*:6881,
    RULE=*:6882,
    RULE=*:6883,
    RULE=*:6884,
    RULE=*:6885,
    RULE=*:6886,
    RULE=*:6887,
    RULE=*:6888,
    RULE=*:6889,

Trackback URI | Comments RSS

Leave a Reply

You must be logged in to post a comment.


« | »



Server load average: 0.00, 0.00, 0.00
Server uptime: 415 days, 12:03
Your IP is: 54.80.113.185.