На своем сервере я пытаюсь настроить формирование трафика, и если я делаю это для IPv4 или IPv6, все в порядке: установлены все правила фильтрации для этого конкретного протокола. Однако при попытке сформировать и то, и другое я получаю ошибки, и некоторые правила фильтра отклоняются со следующим сообщением об ошибке:
Error: Filter with specified priority/protocol not found.
We have an error talking to the kernel, -1
Немного поработав с правилами tc, я обнаружил следующую особенность: когда у меня активировано только формирование IPv4 или IPv6, я могу включить фильтр с наивысшим приоритетом другого протокола, и он все еще работает, но как только Я пытаюсь добавить больше, но те, что имеют более низкий приоритет, отклоняются с указанным выше сообщением об ошибке.
Поэтому, полагая, что это может быть какое-то неясное ограничение на количество фильтров, которые можно прикрепить, я закомментировал два правила с наименьшими приоритетами для каждого протокола и оставил два с включенными наивысшими приоритетами, но это тоже не помогло. . Устанавливается только правило с наивысшим приоритетом в другом блоке (то есть IPv6, потому что правила для IPv4 устанавливаются первыми), а правило с более низким приоритетом отклоняется.
Затем я попытался сделать это наоборот, раскомментировал все правила для одного из протоколов и закомментировал все для другого протокола, кроме правила с самый низкий приоритет, но и это было отклонено.
TL; DR: Попытка сформировать сетевой трафик как на IPv4, так и на IPv6 терпит неудачу, потому что попытка установить несколько фильтров с разными дескрипторами и приоритетами, очевидно, вызывает некую коллизию, которая позволяет установить только фильтр с наивысшим приоритетом.
Соответствующая часть сценария такова:
/sbin/tc qdisc add dev eth0 root handle 1:0 htb default 16
/sbin/tc class add dev eth0 parent 1:0 classid 1:20 htb rate 102000kbit ceil 102000kbit
/sbin/tc class add dev eth0 parent 1:20 classid 1:1 htb rate 25kbit ceil 102000kbit prio 0 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:2 htb rate 25kbit ceil 102000kbit prio 1 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:3 htb rate 10200kbit ceil 102000kbit prio 2 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:4 htb rate 20400kbit ceil 102000kbit prio 3 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:16 htb rate 71350kbit ceil 102000kbit prio 4 quantum 3000
/sbin/tc qdisc add dev eth0 parent 1:4 hhf
/sbin/tc qdisc add dev eth0 parent 1:16 hhf
/sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ip handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ip handle 4/0xF fw flowid 1:4
/sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ipv6 handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ipv6 handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ipv6 handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ipv6 handle 4/0xF fw flowid 1:4
Я использую iptables, чтобы правильно пометить сетевые пакеты для фильтров.
Прямо сейчас я не понимаю, что здесь может быть не так. Если я здесь ошибся, я сейчас не вижу леса за деревьями.
Приоритет фильтра не зависит от семейства.
Итак, ваши команды для создания фильтров должны выглядеть так:
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ip handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ip handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 4 protocol ip handle 4/0xF fw flowid 1:4
/sbin/tc filter add dev eth0 parent 1:0 prio 5 protocol ipv6 handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 6 protocol ipv6 handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 7 protocol ipv6 handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 8 protocol ipv6 handle 4/0xF fw flowid 1:4