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

nf_defrag_ipv4 как можно обойти

Вопрос наверное к линукс-гуру.

Каким образом можно обойти работу модуля nf_defrag_ipv4, если вообще возможно? Всякие телодвижения с NOTRACK не помогают, пакеты все равно дефрагментируются.

Share this post


Link to post
Share on other sites

А вы как себе представляете передачу пакетов между интерфейсами с разным mtu?

Если сильно мешает - собирайте кастомное ядро с ампутированным функционалом, на свой страх и риск.

Share this post


Link to post
Share on other sites

Если не подгружать модуль conntrack со всеми вытекающими, то все работает как надо. При подгрузке conntrack, автоматом подгружается и этот модуль и дальше начинается свистопляска в виде сборки воедино этим модулем уже фрагментированных как нужно пакетов. И это при том, что этому трафику в conntrack делать то и нечего, и он туда вроде как не попадает.

Share this post


Link to post
Share on other sites

уже фрагментированных как нужно пакетов.

Как так происходит?

Share this post


Link to post
Share on other sites

Элементарно.

На вход тазика прилетает, допустим, udp пакет размером 1764 байта. Прилетает на самом деле два пакета, один 1500, другой 264 байта, ибо mtu 1500 и отфрагментилось оно раньше, там где надо.

В результате работы nf_defrag_ipv4 мы получаем на выходе не два пакета, как пришло на вход, а уже собранный один пакет в 1764 байта, со всеми вытекающими проблемами.

Весь вопрос собственно в том, каким образом, и вообще возможно ли, заставить этот модуль жрать не весь трафик, а только тот, который должен попадать в conntrack.

Гребаный conntrack нужен всего лишь для одного DNAT, и если возможности обхода нет, то буду просто выпиливать это правило с данного тазика, ибо без conntrack все работает.

Share this post


Link to post
Share on other sites

Это очень похоже на логику работы GSO.

Мне кажется (но исходники детально не разбирал, там совсем немного кода и легко его пропатчить), nf_defrag собирает только пакеты с флагом фрагментации. Приведенный вами случай совсем не из той оперы.

Share this post


Link to post
Share on other sites

А почему трафик вообще туда попадает? Неужели nf_defrag работает на самом входе, до всяких raw, nat и т.п. и путей обхода нет? Или я как-то неверно оперирую правилом ... -j NOTRACK

От программирования я к сожалению далек, и лезть в исходники для меня темный лес, а мой знакомый программер последнее время сильно занят, не до меня ему...

Share this post


Link to post
Share on other sites

Неужели nf_defrag работает на самом входе, до всяких raw, nat и т.п. и путей обхода нет?

Да.

 

 

От программирования я к сожалению далек, и лезть в исходники для меня темный лес, а мой знакомый программер последнее время сильно занят, не до меня ему...

Самое простое - в файле ipv4/netfilter/nf_defrag_ipv4.c в начало ipv4_conntrack_defrag() вставить return NF_ACCEPT. Правда, не понятно как поведёт себя conntrack, когда до него начнут доходить фрагментированные пакеты, могут быть побочные эффекты. Возможно, в ipv4_conntrack_defrag() надо сразу делать функционал NOTRACK, а не просто return NF_ACCEPT, чтоб их не было.

Edited by aabc

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