Нарезаем исходящий трафик(Shaping)

Контроль за исходящим и маршрутизируемым трафиком очень важен. Один из простейших способов это использовать tc -Traffic Control.

Для того, что бы просмотреть существующие правила выполните :

tc -s qdisc ls dev eth0

Результат будет приблизительно такой :

qdisc pfifo_fast 0: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 7344577001 bytes 16278666 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0

Для того, что бы убедиться в работе нашего шейпера используем команду ping. Эталонным я использую хост google.com:

ping google.com

на выходе:

PING google.com (74.125.87.99) 56(84) bytes of data.
64 bytes from hb-in-f99.1e100.net (74.125.87.99): icmp_seq=1 ttl=57 time=24.6 ms
64 bytes from hb-in-f99.1e100.net (74.125.87.99): icmp_seq=2 ttl=57 time=24.9 ms
64 bytes from hb-in-f99.1e100.net (74.125.87.99): icmp_seq=3 ttl=57 time=24.6 ms
64 bytes from hb-in-f99.1e100.net (74.125.87.99): icmp_seq=4 ttl=57 time=25.1 ms
64 bytes from hb-in-f99.1e100.net (74.125.87.99): icmp_seq=5 ttl=57 time=24.7 ms
64 bytes from hb-in-f99.1e100.net (74.125.87.99): icmp_seq=6 ttl=57 time=25.1 ms

Теперь добавим шейпер:

tc qdisc add dev eth0 root netem delay 200ms

и снова запустим ping:

ping google.com

результат:

PING google.com (74.125.87.104) 56(84) bytes of data.
64 bytes from hb-in-f104.1e100.net (74.125.87.104): icmp_seq=1 ttl=57 time=225 ms
64 bytes from hb-in-f104.1e100.net (74.125.87.104): icmp_seq=2 ttl=57 time=226 ms
64 bytes from hb-in-f104.1e100.net (74.125.87.104): icmp_seq=3 ttl=56 time=225 ms
64 bytes from hb-in-f104.1e100.net (74.125.87.104): icmp_seq=4 ttl=56 time=226 ms
64 bytes from hb-in-f104.1e100.net (74.125.87.104): icmp_seq=5 ttl=57 time=225 ms
64 bytes from hb-in-f104.1e100.net (74.125.87.104): icmp_seq=6 ttl=57 time=226 ms
64 bytes from hb-in-f104.1e100.net (74.125.87.104): icmp_seq=7 ttl=56 time=226 ms

Просмотрев текущие правила:

tc -s qdisc ls dev eth0

мы увидим следующее:

qdisc netem 8001: limit 1000 delay 200.0ms
Sent 169701 bytes 1000 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 3p requeues 0

Для того, что бы удалить все правила выполните :

tc qdisc del dev eth0 root

Рассмотрим вариант с использованием алгоритма Token Bucket (Алгоритм текущего ведра). Для того, что бы создать TBF с максимальной скоростью 1mb/s, пиковой скоростью 2mb/s и 10 kb буфер:

tc qdisc add dev eth0 root tbf rate 1mbit burst 10kb latency 70ms peakrate 2mbit minburst 1540

Другой алгоритм, это HTB — Hierarchy Token Bucket(иерархический буфер токенов) реализует мощную иерархию классов с упором на согласование с существующей практикой. HTB обеспечивает гарантированную полосу пропускания для классов, также позволяет устанавливать верхние пределы межклассового разделения очереди. Содержит объекты ограничения, базирующиеся на TBF, и может устанавливать приоритеты для классов.

Как пример, давайте зашейпим исходящий HTTP трафик. Первое удалим все текущие правила:

tc qdisc del dev eth1 root

Включим очередь :

tc qdisc add dev eth1 root handle 1:0 htb default 10

Созадем клас с ограничениями в 512 kb/s и бурстом в 640 kb/s на 80 порту:

tc class add dev eth1 parent 1:0 classid 1:10 htb rate 512kbps ceil 640kbps prio 0

Дальше нам необходимо в iptables добавить правило, которое будет маркировать все макеты идущие с 80 порта:

iptables -A OUTPUT -t mangle -p tcp —sport 80 -j MARK —set-mark 10

Сохраняем текущие правила:

service iptables save

И последнее, мы назначаем qdisc:

tc filter add dev eth1 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10

Для того, что бы протестировать ваши правила воспользуйтесь одной из следующих утилит:

tc -s -d class show dev eth0
iptables -t mangle -n -v -L
iptraf
watch /sbin/tc -s -d class show dev eth0

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>