URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 79731
[ Назад ]

Исходное сообщение
"Linux 2.6.23.1; tc filter (FW) не работает."

Отправлено alexpro , 09-Апр-08 14:41 
Всем доброго времени суток!
Имеем две системы. Ядро 2.6.23.1, конфиги - одинаковые. Версии iproute2 - одинаковые.
Единственное различие - архитектуры: i386 и x86_64.

Делаю следующее:
iptables -t mangle -A POSTROUTING -o eth0 -d 192.168.200.77 -j MARK --set-mark 0x2ff (нормально в обеих системах)

###Корневые дисциплины добавлены, все нормально с этим
tc class add dev eth0 parent 1:2 classid 1:55 htb rate 256Kbit (нормально в обеих системах)

tc filter add dev eth0 parent 1:0 protocol ip prio 100 handle 0x2ff fw flowid 1:55 (!! Грабли !!)
Вот после этой самой команды на x86_64 все нормально, а на i386 выдает сообщение:
RTNETLINK answers: Invalid argument.
We have an error talking to the kernel

Никто не может подсказать, что это за мистика?

Кстати, есть еще машина, x86_64, конфиги различаются только в аппаратной части, в QOS и netfilter - одинаковые, версия iproute2 - такая же. Но грабли тоже всплывают, как и на i386.


Содержание

Сообщения в этом обсуждении
" Linux 2.6.23.1; tc filter (FW) не работает."
Отправлено alexpro , 10-Апр-08 15:33 
>tc filter add dev eth0 parent 1:0 protocol ip prio 100 handle 0x2ff fw flowid 1:55 (!! Грабли !!)

Разобрался. Все оказалось просто, как дверь военкомата. Правда, пришлось заниматься трассировкой кода ядра, чтобы выловить, где именно вылезают грабли.
Грабли были в части процитированной команды: "prio 100"
На указанном выше x86_64 вообще не было установлено ни одного фильтра (потому все и работало), а на i386 фильтры были. prio 100 u32 match ip dst <xxx>. Если prio изменить на любое другое значение, все работает. Выходит так, что если я уже применяю фильтры u32, то fw фильтр не может быть с тем же значением prio, что есть у u32. ИМХО, данные "грабли" заслуживают помещения в FAQ по iproute2.

Всем спасибо за внимание :)