Вы здесь

Shaping HTB управляем входящей и исходящей скоростью пользователей.

Приветствую Всех!

Цель: доступно для понимания описать как управлять исходящим и входящим трафиком с помощью iptables(mangle) и htb,
В силу моей не опытности, прошу быть снисходительными к моим выводам и утверждениям:).

Есть:
роутер система Gentoo Linux 2.6.28-gentoo-r2.
LAN - юзеры
WAN - провайдер, статика
Шейпер инструменты - iptables(mangle), htb.

Теория как я ее вижу:
Имеем:
user - IP 10.0.0.254, роутер eth0 10.0.0.1, WAN eth1 182.31.12.4

user LAN ----> eth0(router)----->eth1(WAN)---->Inet

Что происходит когда пакет попадает на роутер в iptables (таблицу filter упускаю):

1. Пакеты идут от юзера из LAN.
user (10.0.0.254)
---> eth0 (10.0.0.1) 10.0.0.254(src) => 77.88.21.8 (ya.ru, dst)
(tc)---> mangle (PREROUTING) 10.0.0.254(src) => 77.88.21.8 (ya.ru, dst)
---> nat (PREROUTING) 10.0.0.254(src) => 77.88.21.8 (ya.ru, dst)
---> mangle (FORWARD) 10.0.0.254(src) => 77.88.21.8 (ya.ru, dst)
---> nat (POSTROUTING) SNAT 192.168.0.2 на 182.31.12.4(src) => 77.88.21.8 (ya.ru, dst)
(tc)---> eth1(182.31.12.4) 182.31.12.4(src) => 77.88.21.8 (ya.ru, dst)

2. Пакеты идут к юзеру из WAN.

Inet ---> WAN eth1(182.31.12.4) 77.88.21.8 (ya.ru, src) => 182.31.12.4(dst)
(tc)---> mangle (PREROUTING) 77.88.21.8 (ya.ru, src) => 182.31.12.4(dst)
---> nat (PREROUTING) 77.88.21.8 (ya.ru, src) => 182.31.12.4(dst) на 10.0.0.254(dst)
---> mangle (FORWARD) 77.88.21.8 (ya.ru, src) => 10.0.0.254(dst)
---> mangle (POSTROUTING) 77.88.21.8 (ya.ru, src) => 10.0.0.254(dst)
---> nat (POSTROUTING) 77.88.21.8 (ya.ru, src) => 10.0.0.254(dst)
(tc)---> eth0(10.0.0.1) ---> user (10.0.0.254)

Теперь хочу уделить внимание tc, как оказывается tc обрабатывает пакеты перед входом пакета в iptabels и после выхода из iptables, вот схемка http://l7-filter.sourceforge.net/PacketFlow.png <----Это ВАЖНО понимать. (Есть возможноть и в iptables, но это если использовать IMQ).

Из выше изложенного получается, что для управления трафиком мы можем использовать цепочки FORWARD и/или POSTROUTING таблицы mangle.

Теперь практика.
------------------------------------------------------------------------------------------------
shaper.sh
#!/bin/bash
#################### LAN
local=eth0
tc qdisc add dev $local root handle 1: htb
tc class add dev $local parent 1: classid 1:1 htb rate 100mbit

tc class add dev $local parent 1:1 classid 1:10 htb rate 4000kbit ceil 4000kbit prio 1

tc qdisc add dev $local parent 1:10 handle 10: sfq

#Наш юзер 10.0.0.254 - входящая для пользователя скорость
tc class add dev $local parent 1:10 classid 1:400 htb rate 128kbit ceil 256kbit
tc filter add dev $local parent 1:0 protocol ip prio 1 handle 400 fw classid 1:400

################ WAN
inet=eth1

tc qdisc add dev $inet root handle 1: htb
tc class add dev $inet parent 1: classid 1:1 htb rate 4000kbit

tc class add dev $inet parent 1:1 classid 1:10 htb rate 512kbit ceil 4000kbit prio 1
tc qdisc add dev $inet parent 1:10 handle 10: sfq perturb 5

#Наш юзер 10.0.0.254 - исходящая для пользователя скорость
tc class add dev $inet parent 1:10 classid 1:400 htb rate 64kbit ceil 128kbit
tc filter add dev $inet parent 1:0 protocol ip prio 1 handle 400 fw classid 1:400
---------------------------------------------------------------------------------------------end shaper.sh

Теперь iptables.
#Наш юзер 10.0.0.254 - входящая для пользователя скорость.
iptables -t mangle -A FORWARD -d 10.0.0.254 -j MARK --set-mark 400

#Наш юзер 10.0.0.254 - исходящая для пользователя скорость.
iptables -t mangle -A FORWARD -s 10.0.0.254 -j MARK --set-mark 400

Вот и все. В силу своей рассеености могу, что то упустить, буду рад Вашей критике!

Гуру и так все знают, на то они и гуру. Тем, кто не в теме, сей труд мало что прояснит.
Имхо, весьма поверхностное изложение достаточно сложного вопроса.
Классика жанра - http://www.opennet.ru/base/net/adsl_bandwidth.txt.html

wi написал:
Гуру и так все знают, на то они и гуру. Тем, кто не в теме, сей труд мало что прояснит.
Имхо, весьма поверхностное изложение достаточно сложного вопроса.
Классика жанра - http://www.opennet.ru/base/net/adsl_bandwidth.txt.html

Согласен, гуру и так все знают и так же ссылаются они на классику жанра), но вот новичку не понятно, что можно эту классику упростить и не использовать например IMQ, для чего нужно еще ядро патчить и уже на этом этапе у многих трудности возникают.

А мне стало много чего ясно из рисунка устройтва сети и маркировка пакетов... :) СПАСИБО !!!

Прекрасный пример, очень мне помог!
А как бы сделать так, что бы локальные ресурсы сервера были доступны на полной скорости или, например, если на сервере осуществляется маршрутизация в другие подсети и обращение к ресурсам этих подсетей тоже осуществлялись на полной скорости (100Mbit)?

Если вы скорость не ограничите, она будет максимальная. Если считаете, что может больше, то надо искать где узкое место.

Ну вот в общих чертах как то так, могу конечно в чем то ошибиться, не проверил работоспособность.

Это если у нас есть подсети:
192.168.1.x
192.168.2.x
192.168.3.x
192.168.4.x
192.168.5.x

tc class add dev eth1 parent 1:1 classid 1:2 htb rate 99Mbit ceil 99Mbit prio 5
tc qdisc add dev eth1 parent 1:2 handle 20 sfq perturb 10
tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.0/16 match ip dst 192.168.0.0/16 classid 1:20
tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.0/16 match ip dst 192.168.0.0/16 classid 1:20