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 написал(а):Гуру и так все

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

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".