Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [kernel] не отрабатывает netfilter c моста, может быть кто - то разбирался 
V
    Опции темы
null56
Дата 3.2.2012, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



Всем привет
Задача была такая: организовать форвардинг мультикаста в обход стандартному ядерному. Это я сделал и всё работает как надо за одним исключением, когда надо форвардить пакеты, снимая их с бриджа. Пакеты сами форвардятся нормально, но вот нетфильтр построутинг SNAT для них не отрабатывает... Для остальных входящих интерфейсов всё отрабатывает как надо, а для бриджа нет.
Сэмулировал похожую ситуацию средтсвами ядра, когда пакет роутился с бриджа на нужный интерфейс, вроде норм.

Нетфильтр огромный, кавыряю, но не очень - то приближаюсь к решению, которое может заключается в вызове какой - нибудь функции для skb, а может быть какой - то флаг забыл выставить...

Если кто - нибудь в курсе моей проблемы, подскажите пожалуйста куда копать

Заранее благодарен за помощь
PM MAIL   Вверх
null56
Дата 9.2.2012, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



немного продвинулся в своем исследовании...
судя по всему что - то гадится после отработки BRIDGE_FILTER. в случае с мультикастом рассылка идет по всем портам моста + на верх - сетевому уровню... закомментил момент, где мост посылая на другие свои порты, вызывает хуки BRIDGE_FILTER и нетфильтр заработал...

сейчас дошел до того места, где косяк в поиске правила
http://lxr.linux.no/#linux+v3.2.1/net/ipv4...p_tables.c#L310
Код

outdev = out ? out->name : nulldevname;

у меня выходной интерфейс почему - то имя бриджа, если захардкорить настоящее имя интерфейса, то всё отлично отрабатывает
Код

outdev = "eth2";


сюда мы попадаем отсюда, значит буду исследовать функции вышестоящие, как выходной интерфейс становится бриджом
Цитата

[   99.476031]  [<ffffffff814929f0>] ? ipt_do_table+0x346/0x365
[   99.476033]  [<ffffffff814944e6>] nf_nat_rule_find+0x6d/0x74
[   99.476035]  [<ffffffff814946f2>] nf_nat_fn+0x134/0x162
[   99.476037]  [<ffffffff81494812>] nf_nat_out+0x3d/0xa9
[   99.476039]  [<ffffffff8144cb11>] nf_iterate+0x43/0x78


PM MAIL   Вверх
null56
Дата 9.2.2012, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



такое ощущение, что на бридж фильтре правило для пакета заносится в кеш, а когда мы уже с ip уровня ретранлируем пакеты, то хук нетфильтра дергает из кеша, а не свежепереданные данные sk_buff
PM MAIL   Вверх
null56
Дата 9.2.2012, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



да, мост вызывает postrouting для протоколов ip уровня и таким образом создает правило, которое видимо кешироуется, осталось понять, как сбросить это правило
http://lxr.linux.no/#linux+v3.2.1/net/brid...etfilter.c#L847
PM MAIL   Вверх
null56
Дата 22.2.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



Проблема (или точнее - особенность) в работе netfilter. Каждому пакету, приходящему в систему на PREROUTE или в EBTABLES назначается, так называемое, "слежение за соединением", то есть сущность, которая сопровождает sk_buff на протяжении всей его жизни, а также остается актуальным по истечению определенного периода времени после уничтожения пакетов идущим по определенному маршруту. Эта связь осуществляется на базе 4 (а для некоторых протоколов более)параметров, по которым однозначно определяется принадлежность пакета к текущему соединению: saddr, daddr, sport, dport для udp протокола
То есть если даже уничтожать связь sk_buff с conntrack, она всё равно будет обнаружена по этим четырем параметрам.

Исходя из вышесказанного, вытекала более существенная проблема флужения на ip уровне, не удавалось бы создавать правила для разных выходных интерфейсов, ибо правило одно на все копии sk_buff.

Я решил (избежал) данную проблему, изменяя порт отправления для копий sk_buff, предназначенных для флужения. Изменеие происходит на основании индексов входного и выходного сетевых интерфейсов. На сколько удачно я подобрал изменение sport, я не знаю, но небольших количествах интерфейсов всё работает как надо.
В случае с бриждом, то это следствие, которое лечится точно таким же способом.

в моем случае изменение sport, надеюсь будет не критичным

хотя решение может быть и более элегантным
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.