MAZIN.UZ

Блог Дмитрия Мазина

Я рад вас видеть на моем блоге!

Полезные заметки в личном блоге Дмитрия Мазина.
                    Заходите, читайте, подписывайтесь.

Настройка приоритета трафика htb на Ubuntu

Автор: Дмитрий Мазин Опубликовано: 30 - ноября - 2012

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

Я не буду вдаваться в подробности неработоспособности  «простых» настроек. Опишу как я сделал это на ubuntu server 12.04

 

 

Еще не забываем в начале скрипта очищать настроенные таблицы:

$ipt -F
$ipt -F -t nat
$ipt -F -t mangle
$ipt -X

Итак, начнем.

Вводные данные: Мы имеем два интерфейса eth0 и eth1. eth0 у нас «смотрит» в локалку, а eth1 в мир. Мне нужно разделить несколько типов трафика, такие как web (порты: 80,81,82,83,88,8000,8001,3128,8080,8002,8081), FTP, SSH, TELNET (порты: 21,22,23) , POP3, SMTP (порты: 25,110) и остальной. Так же у меня ADSL канал 2048kbps/512kbps.

Прежде всего нужно пояснить, что HTB работает только на исходящий трафик интерфейса. Таким образом  мы будем настраивать его на интерфейсе, который смотрит в локалку, а именно на eth0.

В первую очередь нам нужно при помощи iptables отмаркировать нужные нам типы трафика. Для этого я в скрипт iptables.sh, который отвечает у меня за настройку firewall добавляю следующие строки:

#######################################
# QOS incoming
# Maring web traffic
# 80,81,82,83,88,8000,8001,3128,8080,8002,8081

$ipt -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport —sports 80,81,82,83,88,8000,8001,3128,8080,8002,8081 -j MARK —set-mark 5
$ipt -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport —sports 80,81,82,83,88,8000,8001,3128,8080,8002,8081 -j RETURN

# Marking FTP, SSH, TELNET
$ipt -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport —sports 21,22,23 -j MARK —set-mark 1
$ipt -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport —sports 21,22,23 -j RETURN

# Marking POP3, SMTP
$ipt -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport —sports 25,110 -j MARK —set-mark 2
$ipt -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport —sports 25,110 -j RETURN

# Marking Local Services
$ipt -t mangle -A POSTROUTING -o eth0 -p tcp -s $local_srv_ip -m multiport —sports 80,10000 -j MARK —set-mark 4
$ipt -t mangle -A POSTROUTING -o eth0 -p tcp -s $local_srv_ip -m multiport —sports 80,10000 -j RETURN

# Marking All Others
$ipt -t mangle -A POSTROUTING -o eth0 -j MARK —set-mark 3
$ipt -t mangle -A POSTROUTING -o eth0 -j RETURN

#######################################

 

Что у нас тут происходит. Мы маркируем:

  •  Web трафик меткой 5
  •  FTP, SSH, TELNET трафик меткой 1
  • POP3, SMTP трафик меткой 2
  • Локальный трафик меткой 4
  • Весь Остальной трафик меткой 3

 

По поводу использования переменных $ipt и $local_srv_ip. Они у меня описываются в скрипте iptables.sh и означают следующее:

ipt=»/sbin/iptables»

Означает, где у меня находится бинарник iptables

 

 local_srv_ip=»192.168.1.1,192.168.5.1″

 

Указывает какие адреса у локального сервера.

Трафик мы промаркировали, теперь можно проверить, как это работает:

iptables -t mangle -nvx -L POSTROUTING

Приведу кусок ответа моего сервера.

Chain POSTROUTING (policy ACCEPT 417061796 packets, 235531000621 bytes)
pkts bytes target prot opt in out source destination
33856185 30130747164 MARK tcp — * eth0 0.0.0.0/0 0.0.0.0/0 multiport sports 80,81,82,83,88,8000,8001,3128,8080,8002,8081 MARK set 0x5
33856185 30130747164 RETURN tcp — * eth0 0.0.0.0/0 0.0.0.0/0 multiport sports 80,81,82,83,88,8000,8001,3128,8080,8002,8081
15163 3562646 MARK tcp — * eth0 0.0.0.0/0 0.0.0.0/0 multiport sports 21,22,23 MARK set 0x1
15163 3562646 RETURN tcp — * eth0 0.0.0.0/0 0.0.0.0/0 multiport sports 21,22,23
3815413 4860516655 MARK tcp — * eth0 0.0.0.0/0 0.0.0.0/0 multiport sports 25,110 MARK set 0x2
3815413 4860516655 RETURN tcp — * eth0 0.0.0.0/0 0.0.0.0/0 multiport sports 25,110

Тут мы видим сколько пакетов и трафика у нас промаркированно по нашим правилам. На самом деле их у меня много и я не стал приводить здесь весь вывод. Надеюсь что вам понятен смысл. В последствии вы можете grep-ом выбирать отсюда нужную информацию и строить, как например я, графики в CACTI.

Теперь настало время создавать скрипт htb.sh

вот он:

# ETH0 Входящий трафик
# Удаляем все
tc qdisc del root dev eth0
# Добавляем в HTB root qdisc
tc qdisc add dev eth0 root handle 1: htb default 20

# Добавляем основной класс с полосой пропускания 1Гбит/с (Скорость интерфейса)
# add main rate limit classes
tc class add dev eth0 parent 1: classid 1:1 htb rate 100000kbit

# Создаем трубы с пропускной способностью и выставляем приоритет трафика по трубам.
# Расписываем локальный трафик
# Для локального трафика забираем все кроме 2мегабит для интернета (Родитель у нас основной класс)
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 97952kbit ceil 97952kbit prio 0 burst 32k

# Нарезаем трубу для интренетовского трафика (Родитель тоже основной класс)
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 2048kbit ceil 2048kbit prio 1 burst 32k

# telnet,ssh,ftp (Тут родитель уже интернет канал)
tc class add dev eth0 parent 1:30 classid 1:40 htb rate 64kbit ceil 2048kbit prio 2 burst 32k

# Mail (И тут родитель итнтернет)
tc class add dev eth0 parent 1:30 classid 1:50 htb rate 256kbit ceil 2048kbit prio 5 burst 32k

# All Other  (И тут родитель итнтернет)
tc class add dev eth0 parent 1:30 classid 1:60 htb rate 704kbit ceil 2048kbit prio 4 burst 32k

# Web  (И тут родитель итнтернет)
tc class add dev eth0 parent 1:30 classid 1:70 htb rate 1024kbit ceil 2048kbit prio 3 burst 32k

# attach qdisc to leaf classes — here we at SFQ to each priority class. SFQ insures that
# within each class connections will be treated (almost) fairly.
# Прицепляем очереди к трубам
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev eth0 parent 1:40 handle 40: sfq perturb 10
tc qdisc add dev eth0 parent 1:50 handle 50: sfq perturb 10
tc qdisc add dev eth0 parent 1:60 handle 60: sfq perturb 10
tc qdisc add dev eth0 parent 1:70 handle 70: sfq perturb 10

# filter traffic into classes by fwmark — here we direct traffic into priority class according to
# the fwmark set on the packet (we set fwmark with iptables
# later). Note that above we’ve set the default priority
# class to 1:26 so unmarked packets (or packets marked with
# unfamiliar IDs) will be defaulted to the lowest priority
# class.
# Прицепляем к очередям маркированный ранее трафик
#LocalTraffic
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 4 fw flowid 1:20
#FTP,SSH,TELNET
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 1 fw flowid 1:40
#MAIL
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 2 fw flowid 1:50
#All Other
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 3 fw flowid 1:60
#Web traffic
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 5 fw flowid 1:70

################################################

Вот что получилось:

Красным выделен приоритет.

rate — это гарантированная полоса пропускания

ceil — это на сколько может расширяться по приоритетам.

 

Хочу обратить внимание на то, что сумма гарантированных полос не должна превышать ширину интернет канала, в моем случае 2Мбит.

И по приоритетам, нулевой приоритет самый высокий, далее приоритет падает.  В данном примере 5 приоритет у остального трафика самый низкий.

Все.

Проверить как работает можно командой:

tc -s -d qdisc show dev eth0

Вот что у меня выдает:

qdisc htb 1: root refcnt 2 r2q 10 default 20 direct_packets_stat 0 ver 3.17
Sent 392183028351 bytes 447136054 pkt (dropped 139030, overlimits 486019192 requeues 1057)
backlog 0b 0p requeues 1057
qdisc sfq 20: parent 1:20 limit 127p quantum 1514b flows 127/1024 divisor 1024 perturb 10sec
Sent 298830661 bytes 4792933 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc sfq 40: parent 1:40 limit 127p quantum 1514b flows 127/1024 divisor 1024 perturb 10sec
Sent 15807085 bytes 76214 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc sfq 50: parent 1:50 limit 127p quantum 1514b flows 127/1024 divisor 1024 perturb 10sec
Sent 25101422202 bytes 23551736 pkt (dropped 62809, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc sfq 60: parent 1:60 limit 127p quantum 1514b flows 127/1024 divisor 1024 perturb 10sec
Sent 43060096891 bytes 119705302 pkt (dropped 29988, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc sfq 70: parent 1:70 limit 127p quantum 1514b flows 127/1024 divisor 1024 perturb 10sec
Sent 323706871512 bytes 299009869 pkt (dropped 691353, overlimits 0 requeues 0)
backlog 0b 0p requeues 0

Отсюда видим, что по например 50: трубе, а это у нас почта, дропаются пакеты, это означает что скорость режется.

Готово!

Вот список полезных комманд, которые я оставил себе в запоминайку.

tc -s -d class show dev eth0
tc -s qdisc ls dev eth0
tc -s -d qdisc
tc -s -d qdisc show dev eth0
iptables -t mangle -nvx -L POSTROUTING

Удачи!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Комментариев к записи: 1

  1. Андрей:

    Наконец-то что-то полезное и конкретное по настройке, большое вам спасибо)

Оставить комментарий