Перейти к содержимому
Калькуляторы

Проблема с хендлами в 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.

Изменено пользователем pavel.odintsov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

 

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

Изменено пользователем pavel.odintsov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.