LINUX.ORG.RU
ФорумAdmin

[tc][iptables] очередной приступ на QoS


0

0

много лет я пытаюсь разобраться с 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. как быть? как это вообще проверять? чем смотреть отметки на пакетах?

заранее большое спасибо.

★★★★★

Посмотрите счётчики правил iptables, потому что там какая то мешанина из маркировки/пермаркировки. Можете просто добавить в -t mangle FORWARD правило/счётчик "-o ppp0 -m mark --mark 30".

И посмотрите в выводе команды «tc filter show dev ppp0», что у вас там нет лишних фильтров.

mky ★★★★★ ()

после фразы «много лет я пытаюсь разобраться с tc, но все как-то безуспешно» как-то даже и не знаю что вам ответить =)

Jaizer ()
Ответ на: комментарий от mky

Посмотрите счётчики правил iptables, потому что там какая то мешанина из маркировки/пермаркировки.

но все что есть, маркируется для обработки 2:30. о 2:20 ни слова.

Можете просто добавить в -t mangle FORWARD правило/счётчик "-o ppp0 -m mark --mark 30"

разумнее, вероятно, счетчики эти пихать в POSTROUTING. ну и там видно что большая часть пакетов идет без отметки:

root@gw4:~ # iptables -v -t mangle -L POSTROUTING
Chain POSTROUTING (policy ACCEPT 17661 packets, 4199K bytes)
 pkts bytes target     prot opt in     out     source               destination 
  322 71027 ACCEPT     all  --  any    ppp0    anywhere             anywhere            mark match 0x1e
 1384  212K ACCEPT     all  --  any    ppp0    anywhere             anywhere            mark match 0x0

а вот как бы это тут перехватить и отправить в tcpdump — не знаю.

И посмотрите в выводе команды «tc filter show dev ppp0», что у вас там нет лишних фильтров.

нет, ничего лишнего. собственно, «tc qdisc del dev ppp0 root» должен гарантировать это.

dmiceman ★★★★★ ()
Ответ на: комментарий от Jaizer

> после фразы

увы! впервые пытался вникнуть в эту тему чуть ли не в прошлом веке, когда единственной документацией была пара постов Алексея Кузнецова в fido7.ru.linux. и вот сколько раз с тех пор ни пытался — все какая-то ерунда получается…

dmiceman ★★★★★ ()
Ответ на: комментарий от dmiceman

>ну и там видно что большая часть пакетов идет без отметки:

то есть, большая часть пакетов валится на дефолтный 2:20

Вроде логично.

А перехватить с помощью "-j LOG", у вас вроде не так много пакетов, поэтому можно все "--mark 0 -j LOG --log-prefix POSTR-MRK0", а если много, то можно добавить "--limit 10/s".

mky ★★★★★ ()
Ответ на: комментарий от mky

разобрался. это ktorrent делает tcp соединения с рандомных портов на рандомные порты. dscp он не выставляет и ipp2p эти соединения не перехватывает. печально.

А перехватить с помощью "-j LOG"


вот эта методика как-то прошла мимо меня. большое спасибо!

dmiceman ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.