LINUX.ORG.RU
решено ФорумAdmin

TC не видит метки CONNMARK


0

3

Пытаюсь наваять скрипт для шейпинга торрент трафика. Использую IMQ и l7-layer.

modprobe imq
modprobe ipt_IMQ
modprobe xt_connmark
modprobe ipt_connmark
modprobe imq numdevs=2
ip link set imq0 up
ip link set imq1 up
##############################################################ingress##############################################################
tc qdisc add dev imq0 root handle 1: htb default 1
tc class add dev imq0 parent 1: classid 1:1 htb rate 1100Kbit # общая пропускная способность - 10%
tc class add dev imq0 parent 1:1 classid 1:10 htb rate 512kbit ceil 1100kbit # HTTP
tc class add dev imq0 parent 1:1 classid 1:11 htb rate 100kbit ceil 300kbit # Torrent
tc qdisc add dev imq0 parent 1:10 handle 10: sfq perturb 10 # дисциплины
tc qdisc add dev imq0 parent 1:11 handle 11: sfq perturb 10 # дисциплины
tc filter add dev imq0 parent 1:0 protocol ip prio 1 handle 2 fw flowid 1:10 # Распихиваем, метка 2 - HTTP
tc filter add dev imq0 parent 1:0 protocol ip prio 2 handle 1 fw flowid 1:11 # Распихиваем, метка 1 - Torrent
iptables -t mangle -A PREROUTING -i ppp0 -j IMQ --todev 0 # Перенаправляем трафик на IMQ

####### метим #######
iptables -t mangle  -A PREROUTING -m layer7 --l7proto http -j CONNMARK --set-mark 0x2
iptables -t mangle  -A PREROUTING -m layer7 --l7proto bittorrent -j CONNMARK --set-mark 0x1

Проблема в том, что tc почему-то не понимает помеченные CONNMARK пакеты, в результате ничего не шейпится, классы 10-11 по нулям (tc -s qdisc ls dev imq0 показывает, что все запихивается в дефолтный класс.) Если метить пакеты через MARK, то в классы 10 и 11 что-то попадает, но 80% торрент-трафика все равно идет через дефолтный, хотя должна идти в 11.
Как можно маркировать все пакеты в соединении, чтобы это было понятно tc?


CONNMARK помечает соединения, а не пакеты, для TC же нужна маркировка пакета. См. опцию --restore-mark и man iptables. Нужно ещё добавить что-то типа

iptables -t mangle -A ... -j CONNMARK --restore-mark

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

nfmark == MARK (маркировка отдельного пакета)
ctmark == CONNMARK (маркировка соединения)

tc filter (как и ip rule, кстати) работает только с nfmark (вообще говоря, iproute2 вообще не знает, что такое «соединение»).

Скопировать ctmark -> nfmark можно командой «CONNMARK --resore-mark».
Наоборот — nfmark -> ctmark — выполняется через «CONNMARK --save-mark».

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

Спасибо, маркировка работает. А сам скрипт не очень. Но это уже совсем другая история...

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