много лет я пытаюсь разобраться с tc, но все как-то безуспешно. вот и сейчас пытаюсь.
задача: поделить исходящий траффик на ppp0 1Mbit так, что бы торренты не забивали канал. ядро .31. генераторов трафика два: ktorrent (должен выставлять dscp 30) и deluge (должен выставлять tos 0x02).
tc:
#!/bin/sh
IF=ppp0
AC="tc class add dev $IF parent"
AQ="tc qdisc add dev $IF parent"
AF="tc filter add dev $IF parent"
# set -v
tc qdisc del dev $IF root
tc qdisc add dev $IF root handle 2 htb default 20
$AC 2: classid 2:1 htb rate 1000Kbit
$AC 2:1 classid 2:10 htb rate 100Kbit ceil 1000Kbit prio 10
$AC 2:1 classid 2:20 htb rate 100Kbit ceil 900Kbit prio 20
$AC 2:1 classid 2:30 htb rate 100Kbit ceil 800Kbit prio 30
$AQ 2:10 sfq perturb 10
$AQ 2:20 sfq perturb 10
$AQ 2:30 sfq perturb 10
# high priority
# tos
$AF 2: protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 2:10
# icmp
$AF 2: protocol ip prio 10 u32 match ip protocol 1 0xff flowid 2:10
# ack
$AF 2: protocol ip prio 10 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
match u8 0x10 0xff at 33 \
flowid 2:10
# low priority
# iptables marks
$AF 2: protocol ip prio 30 handle 30 fw classid 2:30
# tos
$AF 2: protocol ip prio 10 u32 match ip tos 0x02 0xff flowid 2:30
$AF 2: protocol ip prio 10 u32 match ip tos 0x08 0xff flowid 2:30
тут вроде бы все замечательно. единственное что непонятно, это почему «$AF 2: protocol ip prio 10 handle 30 fw classid 2:30» не работает, а «$AF 2: protocol ip prio 30 handle 30 fw classid 2:30» — работает. вроде бы prio относится только к порядку обработки фильтров?
iptables:
IF=ppp0
iptables -t mangle -A FORWARD -p tcp -o $IF -m connmark --mark 30 \
-j CONNMARK --restore-mark \
-m comment --comment "Copy connection mark to packet (OUT)"
iptables -t mangle -A FORWARD -p tcp -i $IF -m connmark --mark 30 \
-j CONNMARK --restore-mark \
-m comment --comment "Copy connection mark to packet (IN)"
iptables -t mangle -A FORWARD -p tcp -o $IF -m dscp --dscp 30 \
-j CONNMARK --set-mark 30 \
-m comment --comment "Mark outgoing torrent conns"
iptables -t mangle -A FORWARD -p tcp -o $IF -m tos --tos 0x02 \
-j CONNMARK --set-mark 30 \
-m comment --comment "Mark outgoing low cost conns"
iptables -t mangle -A PREROUTING -m mark --mark 0 -p tcp -i $IF \
--dport 6881:6891 -j CONNMARK --set-mark 30
iptables -t mangle -A PREROUTING -m mark --mark 0 -p udp -i $IF \
--dport 6881:6891 -j CONNMARK --set-mark 30
iptables -t mangle -A FORWARD -m mark --mark 0 -p tcp -o $IF \
--sport 6881:6891 -j CONNMARK --set-mark 30
iptables -t mangle -A FORWARD -m mark --mark 0 -p udp -o $IF \
--sport 6881:6891 -j CONNMARK --set-mark 30
iptables -A FORWARD -m ipp2p --ipp2p -j CONNMARK --set-mark 30
# ktorrent on vvdm
iptables -t mangle -A PREROUTING -m mark --mark 0 -p tcp -i $IF \
--dport 6754 -j CONNMARK --set-mark 30
пометил все подряд по нескольку раз. должно работать как часы, или, по крайней мере, валить все на 2:30. а получается:
root@gw4:~ # tc -s qdisc show dev ppp0
qdisc htb 2: root r2q 10 default 20 direct_packets_stat 3
Sent 15681842 bytes 68083 pkt (dropped 0, overlimits 13843 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 8022: parent 2:10 limit 127p quantum 1496b perturb 10sec
Sent 1370574 bytes 26330 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 8023: parent 2:20 limit 127p quantum 1496b perturb 10sec
Sent 6922230 bytes 35567 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 8024: parent 2:30 limit 127p quantum 1496b perturb 10sec
Sent 7388718 bytes 6181 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
то есть, большая часть пакетов валится на дефолтный 2:20. как быть? как это вообще проверять? чем смотреть отметки на пакетах?
заранее большое спасибо.