SASA DESIGN

Open Your mind, Open Your Source Code!

Делене на трафика по ToS(DSCP)

31 декември, 2009 – 2:02 pm

Една полезна и хубава статия за делене на трафик от Добромир Галинов Добрев

Ubuntu
С няколко стъпки ще Ви покажа как да делите трафика на клиентите си на Български и Международен с един интерфейс.

Да предположим, че получавате вашия трафик от 2 vlan-a, 1 за българския и 1 за международния трафик.
Правите следното нещо за да маркирате пакетите:

/sbin/iptables -A PREROUTING -t mangle -i ${bg_interface} -j DSCP –set-dscp 0×0
/sbin/iptables -A PREROUTING -t mangle -i ${int_interface -j DSCP –set-dscp 0x2e

С тази команда току що сложихте ToS(0×0) за българския и ToS(0xb8) за международния.
Вие пускате на вашият клиент български и международен по 1 vlan, но не знаете как да разграничите скоростите? Ето един лесен вариант:

/sbin/tc qdisc add dev ${client_vlan) root handle 1: htb default 60
/sbin/tc class add dev ${client_vlan) parent 1: classid 1:1 htb rate 100Mbit(общ капацитет)

/sbin/tc class add dev ${client_vlan) parent 1:1 classid 1:30 htb rate \
70Mbit ceil 70Mbit prio 0
/sbin/tc qdisc add dev ${client_vlan) parent 1:30 sfq perturb 10

/sbin/tc filter add dev ${client_vlan) protocol ip parent 1:0 prio 1 u32 \
match ip tos 0×0(български трафик) 0xff flowid 1:30

/sbin/tc class add dev ${client_vlan) parent 1:1 classid 1:31 htb rate \
30Mbit ceil 30Mbit prio 0
/sbin/tc qdisc add dev ${client_vlan) parent 1:31 sfq perturb 10

/sbin/tc filter add dev ${client_vlan) protocol ip parent 1:0 prio 1 u32 \
match ip tos 0xb8(международен трафик) 0xff flowid 1:31

Това е само за даунлинк трафика, можете да шейпнете ъплинк трафика на клиента по същия начин, но използвайки ingress( аз не маркирам международен и ползвам общ ъплинк шейп)

/sbin/tc qdisc add dev ${client_vlan) handle ffff: ingress
/sbin/tc filter add dev ${client_vlan) parent ffff: protocol ip prio 7 u32 match ip dst 0.0.0.0/0 police rate 50Mbit burst 128k drop flowid :1

Така вашият клиент вече не може да се възползва от по-ниския ви межународен трафик :)

Ето вариант да следите колко български и международен прави рисувайки проста графика:
Добавяме следните таблици:

/sbin/iptables -t mangle -N CLIENT_IN
/sbin/iptables -t mangle -N CLIENT_OUT
/sbin/iptables -t mangle -A PREROUTING -j CLIENT_IN
/sbin/iptables -t mangle -A POSTROUTING -j CLIENT_OUT
/sbin/iptables -t mangle -A CLIENT_IN -m dscp –dscp 0×0 -j RETURN -o ${client_vlan)
/sbin/iptables -t mangle -A CLIENT_OUT -m dscp –dscp 0×0 -j RETURN -i ${client_vlan)
/sbin/iptables -t mangle -A CLIENT_IN -m dscp –dscp 0x2e -j RETURN -o ${client_vlan)
/sbin/iptables -t mangle -A CLIENT_OUT -m dscp –dscp 0x2e -j RETURN -i ${client_vlan)

По този начин виждате колко бг и международен трафик прави вашият клиент и със помощта на туулове като rrdtool/mrtg можете да го следите.

Надявам се да съм бил полезен.

Послепис: По този начин можете да маркирате не само български/международен, но и всякакъв трафик:

Пример:
/usr/sbin/iptables -A POSTROUTING -t mangle -s 192.168.0.0/16 -j DSCP –set-dscp 0x0d
/usr/sbin/iptables -A POSTROUTING -t mangle -s 10.0.0.0/8 -j DSCP –set-dscp 0x0d
/usr/sbin/iptables -A POSTROUTING -t mangle -s 169.254.0.0/16 -j DSCP –set-dscp 0x0d
/usr/sbin/iptables -A POSTROUTING -t mangle -s 172.16.0.0/12 -j DSCP –set-dscp 0x0d

—-
Маркиране на локалния трафик и просто добавяте следния ред в шейп скрипта:

/sbin/tc class add dev ${client_vlan} parent 1:1 classid 1:32 htb rate \
100Mbit ceil 100Mbit(като разбутвате главния клас да е 200Mbps) prio 0
/sbin/tc qdisc add dev ${client_vlan} parent 1:32 sfq perturb 10

/sbin/tc filter add dev ${client_vlan} protocol ip parent 1:0 prio 1 u32 \
match ip tos 0×34(dscp 0x0d) 0xff flowid 1:32

Линкове:

Sorry, comments for this entry are closed at this time.