Информация
На главную Главная

Мой t-cards.ru
Войти Войти
Зарегистрироваться Регистрация

Разное
Форум Форум
Вернуться Форумы на t-cards.ru> Hard"n"Soft
Логин
Пароль
Регистрация Участники Поиск >> FAQ


Сообщения в теме: "Пример шейпера на базе маркировки пакетов iptables..."
25.08.2006 18:06
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюПример шейпера на базе маркировки пакетов iptables

Сосед начал качать порно гигами через меня. Начала тупить телефония, пришлось прибегнуть к радикальным способам - резать ему канал (до 56К решил).
Привожу пример шейпера с помощью маркировки пакетов на iptables, очень удобно, можно привычным уже способом определять набор пакетов, которые будут подвергаться резанию.
Все это решается средствами linux kernel и утилитой tc из пакеты iproute2. А посему для начала надо следующее
emerge iproute2

Далее в ядре включить опции QoS и классификаторов

[*] QoS and/or fair queueing --->
<*> CBQ packet scheduler
<*> HTB packet scheduler
<*> SFQ queue
<*> TBF queue
[*] QoS support
[*] Packet classifier API
<*> TC index classifier
[*] Packet classifier API

<*> Firewall based classifier
<*> U32 classifier


Ну и дальше маркируем пакеты на iptables с помощью -j MARK --set-mark , затем значения маркировки привязываем к фильтру, который в свою очередь привязан к классу, которые описаны для конкретного сетевого интерйфейса.
Чтоб не писать руками команды, сделал шаблончик init-скрипта для gentoo, который можно редактировать по усмотрению.
25.08.2006 18:06
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюПример шейпера на базе маркировки пакетов iptables

Для этого init-скрипта есть файл конфига /etc/conf.d/shaper, в который я указал 3 параметра, которые потом видны в главном скрипте:

#/etc/conf.d/shaper

RATE="102400"
DEV="br0"
IPTABLES="/sbin/iptables"

Далее сам стартовый скрипт:

#/etc/init.d/shaper

#!/sbin/runscript

opts="start stop restart info"

depend() {
need net
}

info() {
einfo "[qdisc]"
for d in $DEV
do
echo "$d:"
tc -s qdisc show dev $d
done
einfo "[class]"
for d in $DEV
do
echo "$d:"
tc -s class show dev $d
done
einfo "[filter]"
for d in $DEV
do
echo "$d:"
tc -s filter show dev $d
done
einfo "[iptables]"
$IPTABLES -t mangle -nvxL shaper_out 2> /dev/null
$IPTABLES -t mangle -nvxL stream_www 2> /dev/null
exit
}
stop() {
ebegin "Stopping shaper"
for d in $DEV
do
tc qdisc del dev $d root 2> /dev/null > /dev/null
$IPTABLES -t mangle -D POSTROUTING -o $d -j shaper_out 2> /dev/null > /dev/null
done
$IPTABLES -t mangle -F shaper_out 2> /dev/null > /dev/null
$IPTABLES -t mangle -X shaper_out 2> /dev/null > /dev/null

$IPTABLES -t mangle -F stream_www 2> /dev/null > /dev/null
$IPTABLES -t mangle -X stream_www 2> /dev/null > /dev/null
eend
}
start() {
ebegin "Starting shaper"

$IPTABLES -t mangle -N shaper_out
$IPTABLES -t mangle -N stream_www
          
          #23 by default
          $IPTABLES -t mangle -A shaper_out -j MARK --set-mark 23
#Adding rules to www chain
$IPTABLES -t mangle -A stream_www -d 192.168.160.6 -j MARK --set-mark 24

#Http ftp
$IPTABLES -t mangle -A shaper_out -p TCP --sport 80 -j stream_www
$IPTABLES -t mangle -A shaper_out -p TCP --sport 20 -j stream_www
$IPTABLES -t mangle -A shaper_out -p TCP --dport 20 -j stream_www
$IPTABLES -t mangle -A shaper_out -p TCP --sport 8080 -j stream_www
$IPTABLES -t mangle -A shaper_out -p TCP --sport 3128 -j stream_www

for d in $DEV
do
tc qdisc add dev $d root handle 1: htb default 23
tc class add dev $d parent 1: classid 1:1 htb rate ${RATE}kbit

tc class add dev $d parent 1:1 classid 1:23 htb rate $[$RATE]kbit prio 7
tc class add dev $d parent 1:1 classid 1:24 htb rate 56kbit prio 4

tc qdisc add dev $d parent 1:23 handle 23: sfq perturb 10
tc qdisc add dev $d parent 1:24 handle 24: sfq perturb 10

                     tc filter add dev $d parent 1:0 prio 0 protocol ip handle 23 fw flowid 1:23
tc filter add dev $d parent 1:0 prio 0 protocol ip handle 24 fw flowid 1:24

                     $IPTABLES -t mangle -I POSTROUTING -o $d -j shaper_out
done
eend
}
25.08.2006 18:08
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюПример шейпера на базе маркировки пакетов iptables

Кратенькое описание всего этого дела:
1. Создаем корни для qdisc и class

tc qdisc add dev $d root handle 1: htb default 23
tc class add dev $d parent 1: classid 1:1 htb rate ${RATE}kbit

Сие означает, что мы описали корневое устройство, которое будет пропускать 100Мбит

2. Создаем подчиненные классы для того, чтоб разбивать трафик по классам

tc class add dev $d parent 1:1 classid 1:23 htb rate $[$RATE]kbit prio 7
tc class add dev $d parent 1:1 classid 1:24 htb rate 56kbit prio 4

тут класс 1:23 имеет так же 100Мбит и высший приоритет, а 1:24 только 56kbit и средний приоритет.

3. Привязываем фильтры к этим классам (т.е. описания условий, по которым пакеты будут попадать в эти классы)

tc filter add dev $d parent 1:0 prio 0 protocol ip handle 23 fw flowid 1:23
tc filter add dev $d parent 1:0 prio 0 protocol ip handle 24 fw flowid 1:24

Тут как раз вступает в дело Firewall based classifier, по меткам "handle 23 fw" и "handle 24 fw" пакеты делятся по классам а эти метки 23 и 24 указываются в правилах iptables для нужных пакетов!

В данном примере для адреса 192.168.160.6 разрешили качать по http с меньшей скоростью.

Запускаем шейпер - /etc/init.d/shaper start - порно льется на 56К
Можно посмотреть статистику - /etc/init.d/shaper info
25.08.2006 18:08
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюПример шейпера на базе маркировки пакетов iptables

Далее приведу описание проблемы (фичи?), с которой сегодня столкнулся.

tc filter не видит марки от iptables!
Все данные ниже

При всем при том, что в цепочку пакеты попадают, в классе "Sent 0 bytes 0 pkt".
Если вместо маркировки от iptables в tc filter заюзать u32 match ip - все работает.
В ядре
<*> Firewall based classifier
# uname -a
Linux 2.6.14-gentoo-r7 #8 PREEMPT Fri Aug 25 00:05:12 MSD 2006 i686 AMD Athlon(tm) XP 1500+ GNU/Linux

---------------------------------

# tc -s qdisc show dev br0
qdisc htb 1: r2q 10 default 22 direct_packets_stat 0
Sent 511264 bytes 2156 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0

qdisc sfq 24: parent 1:24 limit 128p quantum 1514b perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0

# tc -s class show dev br0
class htb 1:1 root rate 25000Kbit ceil 25000Kbit burst 14096b cburst 14096b
Sent 504097 bytes 2113 pkt (dropped 0, overlimits 0 requeues 0)
rate 440bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 4557 ctokens: 4557

class htb 1:24 parent 1:1 leaf 24: prio 7 rate 56000bit ceil 56000bit burst 1627b cburst 1627b
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 238152 ctokens: 238152

# tc -s filter show dev br0
filter parent 1: protocol ip pref 49151 fw
filter parent 1: protocol ip pref 49151 fw handle 0x18 classid 1:24

# iptables -t mangle -nvxL stream_www
Chain stream_www (5 references)
pkts bytes target prot opt in out source destination
5 809 MARK all -- * * 0.0.0.0/0 192.168.160.6 MARK set 0x18
25.08.2006 18:09
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюПример шейпера на базе маркировки пакетов iptables

Оказалось - не любит tc бриджевые интерфейсы, ей надо указывать конкретный физический eth, который являетс составляющей этого бриджа!
И нигде об этом ни слова, эхх, целый день потерял