top
logo


Настройка ограничения и распределения канала (HTB Shaper) PDF Печать E-mail
Автор: Administrator   
22.02.10 09:40

 

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

(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

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


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

  1. sanych on 30 Мар 2008 at 18:10 #

    может надо было просто настроить shorewall

  2. Stepanoff on 30 Мар 2008 at 22:49 #

    Насколько я помню, shorewall это фаервол, ну умеет он траффик фильтровать, но он же не для этого сделан. Никогда им не пользовался, меня полностью устраивают iptables. Настроек по фильтрации и тд в нем мало. Имхо надо использовать то что для этого сделано, а не гвозди микроскопом забивать  Да и тут пример на три пользователя, а вот на 3000 вы тоже shorewall предложите?

  3. abo on 01 Апр 2008 at 15:42 #

    Я поздравляю вас с 1 апреля! Почему именно вас - можно узнать в моём блоге.

  4. sanych on 02 Апр 2008 at 09:23 #

    1) шоревол основан на iptables
    2) шейпить он умеет
    3) статья то не про 3000 пользователей правда  линки в тему:
    http://www.shorewall.net/3.0/traffic_shaping_ru.html
    http://www.shorewall.net/standalone_ru.html
    http://www.uptimebox.ru/2007/10/traffic-shapingcontrol-shorewall.html

  5. AlCher on 07 Апр 2008 at 16:21 #

    1) Для 3000 пользователей не используются “роутеры”, на основе РСков. для этого есть более серъезное оборудование.
    2) Есть категория аппаратных роутеров. в ценовом диапазоне от 4-5т.р., которая имеет не меньшие возможности для настройки, при меньших затратах.
    3) Ваше предложение действительно подходит для маааленькой сети, но при количестве пользователей от 10-ка и более требует слишком много трудозатрат.
    4) Iptables тоже файрволл. ничем не лучше и не хуже shorewall.
    Идеология разная.

  6. dimka on 09 Апр 2008 at 09:49 #

    используюьт писюки и для более крупных сетей, не то что 3к узеров

  7. kolya on 15 Июл 2008 at 14:26 #

    “Так же на сервере стоит фтп, и надо разрешить пользователям качать с него со скоростью выше чем скорость доступа к интернету”
    - вот это не срабатывает. Что-то я делаю не так, но не знаю что… У меня не используется НАТ, адреса и конфиги приведены ниже.
    eth0 - 194.*.*.83
    eth1 - 10.10.0.1
    ftp - 194.*.*.87
    user - 10.10.0.2
    gateway - 194.*.*.81

    —————–
    ###eth0
    DEFAULT=FFFF
    R2Q=4

    ——————
    ###eth0-2.root
    RATE=100Mbit

    ——————
    ###eth0-2:10.mynet
    PRIO=1
    RATE=10Mbit
    RULE=194.*.*.80/28,194.*.*.83,

    ——————
    ###eth0-2:11.user1
    RATE=512Kbit
    LEAF=sfq
    PRIO=5
    RULE=10.10.0.2,

    ——————
    ###eth1
    DEFAULT=FFFF
    R2Q=4

    ——————
    ###eth1-2.root
    RATE=100Mbit

    ——————
    ###eth1-2:10.mynet
    PRIO=1
    RATE=10Mbit
    RULE=194.*.*.80/28,194.*.*.83

    ——————
    ###eth1-2:11.user1
    RATE=512Kbit
    LEAF=sfq
    PRIO=5
    RULE=10.10.0.2

    При таких конфигах юзер1 качает с фтп(194.*.*.87) со скоростью 512K, хотя должен со скоростью 10M. =( Помогите пожалуйста..

  8. Stepanoff on 15 Июл 2008 at 19:38 #

    создайте файлик еще специально для фтп и все заработает…

  9. kolya on 17 Июл 2008 at 05:09 #

    ### eth0-2:11.ftp
    PRIO=1
    RATE=5Mbit
    RULE=194.*.*.83,
    —————————
    ### eth1-2:11.ftp
    PRIO=1
    RATE=5Mbit
    RULE=194.*.*.83

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

  10. kolya on 17 Июл 2008 at 05:10 #

    ### eth0-2:11.ftp
    PRIO=1
    RATE=5Mbit
    RULE=194.*.*.87,
    —————————
    ### eth1-2:11.ftp
    PRIO=1
    RATE=5Mbit
    RULE=194.*.*.87

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

  11. Stepanoff on 17 Июл 2008 at 12:21 #

    в самом скрипте htb.init приведены примеры как урезать например весь WWW трафик, и в гугле куча примеров

  12. mirage on 14 Ноя 2008 at 12:55 #

    Здравствуйте, установил все и прописал как написанно в доке. Но когда пытаюсь запустить его выдает сообщение: “**HTB: iproute2 utilities not installed or executable!”
    Хелп ми.

  13. Stepanoff on 14 Ноя 2008 at 12:56 #

    У Вас видимо не установлен пакет iproute

  14. mirage on 14 Ноя 2008 at 12:57 #

    Забыл добавить. Стоит SUSE 11.0, пакет “iproute2-2.6.23-75.1″ - установлен

  15. Stepanoff on 14 Ноя 2008 at 13:02 #

    Проверьте, соответствуют ли пути к файлам в скрипте реальности. Скрипт используетс tc и еще что то, не помню

  16. mirage on 14 Ноя 2008 at 16:53 #

    Я все поправил, теперь запускаеться, спасибо. Вот только ошибки следующие выдает:

    “suse:/etc/sysconfig/htb # htb start
    find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.

    find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.”

  17. Stepanoff on 14 Ноя 2008 at 17:02 #

    На это можно не обращать внимания, это баг в программе find, ничего страшного в нем нет.

  18. mirage on 14 Ноя 2008 at 18:16 #

    Всё вроде заработало, спасибо ещё раз. А при помощи него можно резать по объёму файла? (типа больше 30 МБ файл, скачать нельзя)

  19. Stepanoff on 14 Ноя 2008 at 22:01 #

    Нет, это умеет squid

  20. mirage on 15 Ноя 2008 at 06:16 #

    но тогда надо настраивать прокси на клиентах, а мне бы желательно на клиентах ничего не настраивать, а это только NAT.

  21. Stepanoff on 15 Ноя 2008 at 14:49 #

    Никто вам не мешает настроить прозрачный прокси, но это не относится к данной теме.

  22. pechkin on 15 Мар 2009 at 08:42 #

    А что делать если вместо eth0 интернтом являеться ppp0??
    Нужно ограничеть трафик идущий от ppp0, а ресурсы городской сети eth0 оставить без ограничений.
    Я пробывал не выходит… вернее выходит - но режиться всё.. и локалка и инет…
    вот мои конфиги:

    “ppp0″
    DEFAULT=0
    R2Q=10

    # cat ppp0-2:05.default
    RATE=100Mbit
    CEIL=100Mbit
    LEAF=sfq

    # cat ppp0-2:09.vitya
    RATE=5Мbit
    CEIL=5Мbit
    LEAF=sfq
    PRIO=1
    MARK=105

    # cat eth1-2:09.vitya
    RATE=5Mbit
    CEIL=5Mbit
    LEAF=sfq
    PRIO=1
    RULE=169.254.0.5

    Я здесь привёл наиболее значимые по моему мнению конфиги, если нужно выложить всё - пришите воложу…

    и Iptables
    *mangle
    :PREROUTING ACCEPT [364003:218603990]
    :INPUT ACCEPT [92330:24844565]
    :FORWARD ACCEPT [270980:193686155]
    :OUTPUT ACCEPT [191150:179553216]
    :POSTROUTING ACCEPT [462130:373239371]
    -A PREROUTING -s 169.254.0.5 -j MARK –set-mark 0×69
    -A PREROUTING -s 169.254.0.5 -j RETURN
    COMMIT

    Затем NAT
    *nat
    :PREROUTING ACCEPT [5005:381591]
    :POSTROUTING ACCEPT [555:41386]
    :OUTPUT ACCEPT [25:1501]
    -A POSTROUTING -s 169.254.0.5 -j MASQUERADE

  23. Stepanoff on 15 Мар 2009 at 13:01 #

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

  24. pechkin on 17 Мар 2009 at 02:06 #

    [quote]Попробуйте инициализировать шейпер в момент включения интерфейса ppp0, и так же отключать его при отключении этого интерфейса.[/quote]
    тоесть вы мне предлагаете сидеть на стремё всё время??

  25. Stepanoff on 17 Мар 2009 at 21:11 #

    С таким подходом вам не юниксы, а венду надо. Напишите скрипт который сделает это сам.

  26. ssa on 08 Апр 2009 at 23:31 #

    Вопрос к автору: дом сетка из 3 компов через “тупой аппаратный маршрутизатор”), а шейпер хоцца, проблема с забивием канала как и у всех, что можете посоветовать? Я наивно полагал, что если прозрачным squid сделать, скажем на однм из компов, то весь траффик через него буде перенаправляться на остальные и обратно и мож быть тогда удасться по вашему примеру настроить шейпер.

  27. Stepanoff on 08 Апр 2009 at 23:44 #

    Вместо тупого маршрутизатора поставить комп, можно самый слабый, на нем поднять все необходимое (DHCP, SHAPER, SAMBA)
    Ну или если на машинках стоит линукс то можно на приложения индивидуально резать скорость при помощи софтинки Trickle, ссылка на сабж http://linux.xlibs.net/2008/03/21/trickle-traffic-limiter/

     

оригинал: http://sudouser.com/nastrojka-ogranicheniya-i-raspredeleniya-kanala-htb-shaper.html

доп. материалы:

http://www.lug.nnov.ru/node/29

http://gazette.linux.ru.net/rus/articles/Traffic-Control-tcng-HTB-HOWTO.html

{jcomments on}

Последнее обновление 22.02.10 10:05
 
Интересная статья? Поделись ей с другими:

bottom

 

Unreal Commander PfSense по русски Яндекс.Метрика