Появилась необходимость разделить разный вид трафика по приоритетам. Нашел пару статей где это описывалось, что все легко и просто настраивается. Оказалось что не все так просто.
Я не буду вдаваться в подробности неработоспособности «простых» настроек. Опишу как я сделал это на 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
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
Удачи!
Наконец-то что-то полезное и конкретное по настройке, большое вам спасибо)