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

tc не видит пакеты, маркированные -j MARK --set-mark

 


2

1

Есть сервер, на eth1 адрес 13.0.0.254/24, на eth0 адрес 172.20.203.4/24. Он роутит траффик между этими сетями. Задача: органичить скорость между сетями до 1 Мбайт/сек, не ограничивая траффик между самим сервером и хостами этих сетей(то есть резать всё, что проходит через FORWARD)

iptables -t mangle -A POSTROUTING -s 13.0.0.0/24 -d 172.20.203.0/24 -j MARK --set-mark 0x0001
iptables -t mangle -A POSTROUTING -s 172.20.203.0/24 -d 13.0.0.0/24 -j MARK --set-mark 0x0002

# eth1
tc qdisc add dev eth1 root handle 1:0 htb default 2

tc class add dev eth1 parent 1:0 classid 1:1 htb rate 1000mbps ceil 1000mbps
tc class add dev eth1 parent 1:1 classid 1:2 htb rate 999mbps ceil 1000mbps
tc class add dev eth1 parent 1:1 classid 1:3 htb rate 1mbps

tc qdisc add dev eth1 parent 1:2 handle 2:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:3 handle 3:0 sfq perturb 10

tc filter add dev eth1 parent 1:0 handle 1 fw flowid 1:3
tc filter add dev eth1 parent 1:0 handle 2 fw flowid 1:3

# eth0
tc qdisc add dev eth0 root handle 1:0 htb default 2

tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1000mbps ceil 1000mbps
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 999mbps ceil 1000mbps
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 1mbps

tc qdisc add dev eth0 parent 1:2 handle 2:0 sfq perturb 10
tc qdisc add dev eth0 parent 1:3 handle 3:0 sfq perturb 10

tc filter add dev eth0 parent 1:0 handle 2 fw flowid 1:3
tc filter add dev eth0 parent 1:0 handle 1 fw flowid 1:3

Не режет. Если в начале поставить

tc qdisc add dev eth1 root handle 1:0 htb default 3
tc qdisc add dev eth0 root handle 1:0 htb default 3
, то режет, то есть проблема именно в настройках фильтров.
iptables -L -v -n -t mangle
показывает, что пакеты через правила MARK проходят. Попытки маркировать пакеты не в POSTROUTING, а в PREROUTING и в FORWARD не помогли.

Фильтры:

tc -s -d -r filter show dev eth0
filter parent 1: protocol [768] pref 49151 fw
filter parent 1: protocol [768] pref 49151 fw handle 0x1 classid 1:3
filter parent 1: protocol [768] pref 49152 fw
filter parent 1: protocol [768] pref 49152 fw handle 0x2 classid 1:3

tc -s -d -r filter show dev eth1
filter parent 1: protocol [768] pref 49151 fw
filter parent 1: protocol [768] pref 49151 fw handle 0x2 classid 1:3
filter parent 1: protocol [768] pref 49152 fw
filter parent 1: protocol [768] pref 49152 fw handle 0x1 classid 1:3

Куда копать?

★★★

Последнее исправление: selivan (всего исправлений: 1)

Пальцем в небо: а tc принимает решения на основании метки пакета ( MARK ) или метки соединения ( CONNMARK ) ?

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

MARK. По крайней мере во всех примерах всегда пишут его

selivan ★★★
() автор топика

] Не знаю поможет или нет, но у меня в скрипте тс отказывался ограничивать скорость до тех пор пока я правила для тс и для iptables не поменял местами, в общем сначала создал классы, потом фильтры и только потом пустил маркировку потока. После этого начал шейпить

OxOyD
()

ТС не видит пакеты, маркированные -j MARK --set-mark

починилсначала прочитал так

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

Попробовал менять местами - не помогло

selivan ★★★
() автор топика

Похоже у вас старый tc, в котором баг при записи правила для всех протколов на little-endian машинах. Попробуйте добавить в фильтр «protocol ip».

mky ★★★★★
()

Не работает с нетфильтром и не надо. Воспользуйтесь классификатором u32 в фильтре (tc filter). Там и разбирайте пакеты по источникам и назначениям. К тому же это предохранит Вас от случайного сброса Ваших классифицирующих iptables правил (iptables -t mangle -A POSTROUTING, etc.) командой iptables -X в каком-нибудь стороннем скрипте.

funky
()

Решение:

modprobe xt_mark

Если модуль не загружен, ипаный iptables молча жрёт правила -j MARK, но они не работают. Всем спасибо, проблема решена

З. Ы. funky: за «iptables -X в стороннем скрипте» надо авторам скрипта руки по самую жопу отрывать

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

Интересный вариант, буду знать. Тоже, кстати, сначала требует явного modprobe xt_CLASSIFY

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