pavel.odintsov Posted July 6, 2014 (edited) · Report post Всем привет! В процессе реализации вот этой штуки 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 July 7, 2014 by pavel.odintsov Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
NiTr0 Posted July 6, 2014 · Report post Как вариант - матчить по u8/u16/u32 со смещением от начала пакета... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pavel.odintsov Posted July 7, 2014 · Report post Как-то это кривовато =( Да и неудобно будет потом разбираться без скрипта, у кого какие правила. Хотелось бы понять, почему оно себя вообще так ведет. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
s.lobanov Posted July 7, 2014 · Report post сначала нужно проверить на актуальном ядре (3.15.4). да, там нет openvz, но проверить нужно, потом попытаться пропатчить ваше ядро, если в 3.15.4 такой проблемы нет Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pavel.odintsov Posted July 7, 2014 (edited) · Report post Починено в общем. Баг был в двух местах, что усложняло его исправление. Хендлы для IPv6 должны иметь префикс 801::XX, а для IPv4 - 800::XX, кроме этого, если для одного и того же класса есть правила IPv4 и IPv6, то у них должны быть РАЗНЫЕ приоритеты. При этом допустимо, чтобы приоритет у src/dst правил на один и тот же айпи для одного протокола был идентичен. Вот так. Блин, tc - вечная криптомагия=) Edited July 7, 2014 by pavel.odintsov Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...