Ceci & Tati

Маркиране на българския и международен трафик, за по лесно шейпване.

от на май.29, 2009, категории Мрежата

Нещо доста елементарно, но пък ценно!
Интернет трафика го получавам през два vlan-а , през единия българския трафик, а през другия международния трафик и го посрещам посредством два рутера. За по-лесно шейпване го маркирам на двата рутера и го подавам към терминалите, посредством ToS битовете.

Малко информация за ToS – Type of Service (Тип на услугата). Използва се, за да могат да се използват различни пътища за пакети с различни ToS полета.

На рутера за българския трафик, правя следното.

#mark bg traffic
$IPTABLES -t mangle -A FORWARD -o eth2 -j TOS –set-tos 0x08

На рутера за международен трафик, правя следното.

#mark int traffic
$IPTABLES -t mangle -A FORWARD -o eth2 -j TOS –set-tos 0x10

На терминалите правя следното.

############
if (($main::speed_in1) or ($main::speed_in2)){
# in = receive out = transmit
push @FW_ACTIONS, „$TC qdisc del dev $INTERFACE root“;
#push @FW_ACTIONS, „echo ‘$TC qdisc del dev $INTERFACE root’ >> $tc_log“;

push @FW_ACTIONS, „$TC qdisc add dev $INTERFACE root handle 1: htb default 20“;
#push @FW_ACTIONS, „echo ‘$TC qdisc add dev $INTERFACE root handle 1: htb default 20’ >> $tc_log“;

push @FW_ACTIONS, „$TC class add dev $INTERFACE parent 1: classid 1:1 htb rate „. $main::speed_in_sum .“kbit“;
#push @FW_ACTIONS, „echo ‘$TC class add dev $INTERFACE parent 1: classid 1:1 htb rate „. $main::speed_in_sum .“kbit’ >> $tc_log“;
}
############

############
if ($main::speed_in1) {
push @FW_ACTIONS, „$TC class add dev $INTERFACE parent 1:1 classid 1:10 htb rate „. $main::speed_in1 .“kbit“;
#push @FW_ACTIONS, „echo ‘$TC class add dev $INTERFACE parent 1:1 classid 1:10 htb rate „. $main::speed_in1 .“kbit’ >> $tc_log“;

push @FW_ACTIONS, „$TC filter add dev $INTERFACE protocol ip parent 1: prio 10 u32 match ip tos 0x10 0xff flowid 1:10“;
#push @FW_ACTIONS, „echo ‘$TC filter add dev $INTERFACE protocol ip parent 1: prio 10 u32 match ip tos 0x10 0xff flowid 1:10’ >> $tc_log“;

}
if ($main::speed_in2) {
push @FW_ACTIONS, „$TC class add dev $INTERFACE parent 1:1 classid 1:20 htb rate „. $main::speed_in2 .“kbit“;
#push @FW_ACTIONS, „echo ‘$TC class add dev $INTERFACE parent 1:1 classid 1:20 htb rate „. $main::speed_in2 .“kbit’ >> $tc_log“;

push @FW_ACTIONS, „$TC filter add dev $INTERFACE protocol ip parent 1: prio 20 u32 match ip tos 0x08 0xff flowid 1:20“;
#push @FW_ACTIONS, „echo ‘$TC filter add dev $INTERFACE protocol ip parent 1: prio 20 u32 match ip tos 0x08 0xff flowid 1:20’ >> $tc_log“;
}

Забележка: показал съм само част от скрипта за идеята, но не целия! Всеки който поне малко разбира ще разбере за какво иде реч 🙂 .


Ето и ефекта от цялата работа.

В едната конзола изпълнявате следната команда:

# ping gbg.bg
PING gbg.bg (212.73.129.164) 56(84) bytes of data.
64 bytes from gbg.bg (212.73.129.164): icmp_seq=1 ttl=5 time=28.2 ms
64 bytes from gbg.bg (212.73.129.164): icmp_seq=2 ttl=5 time=6.26 ms
64 bytes from gbg.bg (212.73.129.164): icmp_seq=3 ttl=5 time=30.2 ms
– gbg.bg ping statistics –
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 6.260/21.590/30.235/10.871 ms

а в другата следното и наблюдаваме.

# tcpdump -i ppp0 -p icmp -v
tcpdump: listening on ppp0, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
15:50:14.709786 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84) 212.10.21.251 > gbg.bg: ICMP echo request, id 21520, seq 1, length 64
15:50:14.738039 IP (tos 0x8, ttl 5, id 43343, offset 0, flags [none], proto ICMP (1), length 84) gbg.bg > 212.10.21.251: ICMP echo reply, id 21520, seq 1, length 64
15:50:15.711463 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84) 212.10.21.251 > gbg.bg: ICMP echo request, id 21520, seq 2, length 64
15:50:15.717703 IP (tos 0x8, ttl 5, id 43344, offset 0, flags [none], proto ICMP (1), length 84) gbg.bg > 212.10.21.251: ICMP echo reply, id 21520, seq 2, length 64
15:50:16.712681 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84) 212.10.21.251 > gbg.bg: ICMP echo request, id 21520, seq 3, length 64
15:50:16.742896 IP (tos 0x8, ttl 5, id 43345, offset 0, flags [none], proto ICMP (1), length 84) gbg.bg > 212.10.21.251: ICMP echo reply, id 21520, seq 3, length 64


1 Comment for this entry

  • Bobby

    Маркирането на трафика е доста полезно, обаче аз се сблъсквам със следния проблем. Маркирал съм межуднародни трафик и посредством snmp си чертая графики за вътрешните vlan-и за трафик, обаче така чертая за целия трафик. Някаква идея как да извличам само трафика по tos? Предпочиам да не си играя с iptables за тази цел.

Вашият коментар

*
За да докажете че не сте бот, въведете този код
Anti-Spam Image

Нещто не намирате ли?

Потърси в блога ми:

Моля Ви не прекалявайте с информацията!