inhate (inhate) wrote,
inhate
inhate

Category:

Сага о бодании с шейпером.

Исходные данные









  • Выхлоп - ADSL 8/1 Mbit с PPPoE внутри.
  • Поверх PPPoE ходит интернет-трафик со скоростью 2/1Mbit
  • Поверх интернет поднят OpenVPN связывающий офисы.
  • Межсоединения 100Mbit.




Cхема сети довольно типична для офиса.
Соединение с локальной сетью на интерфейсе eth2, с DMZ - на eth1, с интернетом - на ppp0.

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

Для конфигурирования шейпера я использую скрипт htb.init - http://sf.net/projects/htbinit/. Скрипт позволяет разбить конфиуграцию на ряд небольших файлов простого синтаксиса, кроме того - на выходе можно получить набор команд linux iproute.

Cтруктуризация трафика выполняется с помощью алгоритма HTB, "справедливое" разделение траффика между хостами в рамках одного класса - с помощью алгоритма ESFQ.

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

ESFQ не входит в стандартный Linux, и ну будет включен туда - измнения из ESFQ сейчас портируются модуль SFQ, после чего разніца между ESFQ и "обычнм" SFQ исчезнет.

Патчсет ESFQ http://fatooh.org/esfq-2.6/. Патчи подходят для ядра и iproute версии 2.6.26 (ядро от Debian 5.0 Lenny патчится успешно).

Основное отличие SFQ и ESFQ - возможность выбора типа алгоритма "справедливой" раздачи пакетов. В SFQ полоса примерно равномерно распределяется между TCP/UDP-соединениями, что дает необоснованые преимущества для любителей многопоточной закачки. В ESFQ есть возможность управлять алгоритмом, в частности разделять траффик на основе вдреса источника или назначния - вариант с лиентом использующим более одного IP-адреса я тут рассматривать не буду ;)

htb.init не поддерживает ESFQ - придется накладывать небольшой патч. Я добавил дополнительный параметр конфигурационных файло - HASH - который отвечает за способ "справедливого деления".

Пример конфигурации для интерйейса eth2 (у меня это интерфейс подключенный к локальной сети), и ppp0 (это пиринг и интернет)
Внимаение - имен файлов имеют значние!

==> eth2 <==
DEFAULT=50 #Задаем "класс по умолчаню" - весь траффик не попаший с другие классы попадет в 2:50
R2Q=10

==> eth2-2.root <==
# Базовае ограничения скорости - быстрее 100Mbit мы отдавать ничего и никогда в локальную сеть не будем.
RATE=100Mbit

==> eth2-2:20.ssh <==
# Класс в которыя помещаются ssh-соединения
RATE=200Kbit # Гарантировано не менее 200Kbit
CEIL=100Mbit # При наличии "излишков" можно расширять для 100Mbit
LEAF=esfq # Делить траффик с помощью ESFQ
RULE=*:22, # В этот класс попадут только пакеты _исходящие_ с порта 22, не забываем про ЗАПЯТУЮ, см. далее аналогичный пример для ppp0
PRIO=10 # Ну и задаем некий относительный приоритет
HASH=dst # Алгоритм хэширования - различать по адресу назначния, что бы кто-то самый хитрый не занял всю полосу своим scp :)

==> eth2-2:30.inet <==
# Интернет
RATE=1800Kbit # На интернет-траффик выделено не менее 1.8Mbit
CEIL=2Mbit # ..И не более 2Mbit
LEAF=esfq # Делить траффик с помощью ESFQ
PRIO=30 # относительный приоритет - пониже чем у ssh
MARK=30 # В этот класс попадут пакеты маркированые тэгом 30 в iptables
HASH=dst # Алгоритм хэширования - различать по адресу назначния во имя броьбы с торрентами и т.п.

==> eth2-2:40.peering <==
# Пиринг
RATE=6Mbit #Весь канал от меня до провайдера - 8Mbit, из которых 2Mbit это ssh и интернет
CEIL=8Mbit #Ну больше 8Mbit точно никак быть не может
LEAF=esfq # Делить траффик с помощью ESFQ
PRIO=40 # относительный приоритет - пониже чем у интернет-трафика
MARK=15 # В этот класс попадут пакеты маркированые тэгом 30 в iptables
HASH=dst # Алгоритм хэширования

==> eth2-2:50.default <==
# Все остальное - траффие собственно маршрутизатора, траффи из DMZ и т.п
RATE=85Mbit # Не имеет вобщем-то значения, главное чтобы в сумме получалось во всех классах меньше 100Mbit, дабе не затруднять HTB расчеты.
CEIL=100Mbit # до максимума
LEAF=esfq # Делить траффик с помощью ESFQ
PRIO=50 # Самый низкий относительный приоритет
HASH=dst # Алгоритм хэширования



==> ppp0 <==
DEFAULT=50
R2Q=1

==> ppp0-2.root <==
# На выхлоп не более мегабита
RATE=1Mbit


==> ppp0-2:20.ssh <==
# Иходящий из корпоративной сети ssh
RATE=200Kbit
CEIL=1Mbit
LEAF=esfq
RULE=*:22 #Внимание - тут запятой нет, указан порт _назначения_
PRIO=12
HASH=src # Алгоритм деления - по адресу отправителя

==> ppp0-2:30.welcome <==
# через него идет VPN
RATE=500Kbit # Гарантируем половину канала для исходящего VPN
CEIL=1Mbit
LEAF=esfq
RULE=1.2.3.34 # Хост назначения - 1.2.3.34, все прочее пролетает мимо этого класса
PRIO=12
HASH=src # Алгоритм деления - по адресу отправителя

==> ppp0-2:50.default <==
# Интернет
RATE=100Kbit #Оставляем чуть-чуть гарантированой полосы для интернет-соединений, дабы межофисный VPN не затоптал всю интернет-активность
CEIL=1Mbit
LEAF=esfq
PRIO=50
HASH=src # Алгоритм деления - по адресу отправителя


В примерах выше я применил два сопособа помещения траффика классы: RULE и MARK. RULE - это простейший классификатор - адрес, порт и т.п., MARK -классификаци по единственному параметру - по полю MARK (своего рода метка внутри ядра) которое можно задать с помощью iptables -j MARK

Вот пример маркировки траффика для раздления на пиринговы и общеинтернетный - кусок скрипта настройки firewall.

for subnet in ` Все вышесказаное слишком всерьез прошу не принимать, запросто мог чего-то пропустить. Подозреваю, что надо как-то аккуратно исхоядщий трафик обрабатывать перез NAT специально для шейпера. </h2>
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments