Jump to content
Калькуляторы

Проблема с хендлами в tc: решено

Всем привет!

 

В процессе реализации вот этой штуки https://github.com/FastVPSEestiOu/openvz-network-shaper/blob/master/fastvps_openvz_shaper.pl (шейпера для OpenVZ VPS) уже очень давно столкнулся с неприятной штукой, а именно с неработоспособностью хендлов для IPv6 правил.

 

Зачем мне хендлы? Очень просто - с ними очень удобно удалять правила, так как хендл явно связан в нашей системе с номером контейнера и я всегда могу в один подход найти и удалить/заменить правила по конкретному хендлу.

 

Для IPv4 все создается идеально:

/sbin/tc filter add dev eth0 handle 800::39 protocol ip parent 1: prio 1 u32 match ip dst "xx.yy.xx.31" flowid 1:290

А вот при попытке подсунуть тоже самое для IPv6:

/sbin/tc filter add dev venet0 handle 800::66 protocol ipv6 parent 1:  u32 match ip6 dst "1abb:aabb:150:9222::8" flowid 1:290

Вышибает вот такое:

error: RTNETLINK answers: Invalid argument
We have an error talking to the kernel

 

Как только убираю handle все работает на ура:

/sbin/tc filter add dev venet0 protocol ipv6 parent 1:  u32 match ip6 dst "1abb:aabb:150:9222::8" flowid 1:290

 

Платформа: CentOS 6 + 2.6.32 родное.

 

Спасайте =( Пытался разобраться с форматом хендлов в коде ядра, но не оилил :(

 

Уточняю - все фильтры создаю с уникальными handle, то есть src и dst правила получают собственные номера, как для v4, так и для v6.

Edited by pavel.odintsov

Share this post


Link to post
Share on other sites

Как вариант - матчить по u8/u16/u32 со смещением от начала пакета...

Share this post


Link to post
Share on other sites

Как-то это кривовато =( Да и неудобно будет потом разбираться без скрипта, у кого какие правила. Хотелось бы понять, почему оно себя вообще так ведет.

Share this post


Link to post
Share on other sites

сначала нужно проверить на актуальном ядре (3.15.4). да, там нет openvz, но проверить нужно, потом попытаться пропатчить ваше ядро, если в 3.15.4 такой проблемы нет

Share this post


Link to post
Share on other sites

Починено в общем.

 

Баг был в двух местах, что усложняло его исправление.

 

Хендлы для IPv6 должны иметь префикс 801::XX, а для IPv4 - 800::XX, кроме этого, если для одного и того же класса есть правила IPv4 и IPv6, то у них должны быть РАЗНЫЕ приоритеты. При этом допустимо, чтобы приоритет у src/dst правил на один и тот же айпи для одного протокола был идентичен.

 

Вот так. Блин, tc - вечная криптомагия=)

Edited by pavel.odintsov

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this