обнаружить фрагментацию пакетов в перехватчике netfilter модуля ядра - PullRequest
0 голосов
/ 16 ноября 2011

Я не могу определить, фрагментирован пакет или нет, и смещение пакета.

Я сбрасываю данные заголовка

 printk("frt_offset=%d ", ((ip_header->frag_off)));//print all, not 13 bytes of it
 printk("fr_cf=%d ", (ntohs(ip_header->frag_off) & IP_CE) > 0);
 printk("frt_df=%d ", (ntohs(ip_header->frag_off) & IP_DF) > 0);
 printk("fr_mf=%d ", (ntohs(ip_header->frag_off) & IP_MF) > 0);

, но когда я скачал файл с включенным модулем, я получил такой вывод:

[40432.831134] packet size=1514 timestamp=-790555865  frt_id=60370 frt_offset=64 fr_xf=0    frt_df=1 fr_mf=0
[40432.831318] packet size=1514 timestamp=-790371858  frt_id=60626 frt_offset=64 fr_xf=0 frt_df=1 fr_mf=0 
[40432.831496] packet size=1514 timestamp=-790193971 frt_id=60882 frt_offset=64 fr_xf=0   frt_df=1 fr_mf=0 
[40432.831905] packet size=1514 timestamp=-789785167 frt_id=61138 frt_offset=64 fr_xf=0 frt_df=1 fr_mf=0 
[40432.832098] packet size=1514 timestamp=-789592131 frt_id=61394 frt_offset=64 fr_xf=0 frt_df=1 fr_mf=0 
[40432.832504] packet size=1514 timestamp=-789186978 frt_id=61650 frt_offset=64 fr_xf=0 frt_df=1 fr_mf=0 
[40436.131049] packet size=45 timestamp=-1785619342 frt_id=4464 frt_offset=0 fr_xf=0 frt_df=0 fr_mf=0 

Но, как я понял, для фрагментированных пакетов я должен получить один и тот же идентификатор, различное смещение, флаг mf = 1.У нас здесь что-то другое.Последний пакет здесь может быть пакетом из другого сеанса.

Я заблудился ...

Ответы [ 2 ]

0 голосов
/ 26 ноября 2011

Это хороший вариант, похожий на головоломку. Вы просто даете случайный вывод группы пакетов. Ну, «мы» можем только догадываться, если вы не добавите больше информации или PCAP. Будет много сценариев, Вам необходимо проверить следующее

1. Если смещение 0

это может быть фрагментировано и является первым пакетом, если MF = 1 или же не может быть легко фрагментирована MF = 0

2.Если смещение - это что-то другое, то вы можете быть окончательно фрагментированы

В зависимости от вывода, который вы выставили (последние пакеты некоторых фрагментированных пакетов умножьте смещение на 8) Сначала с вашим выходом хорошо до этого 1. Вы пытаетесь применить хук к LOCAL_IN или LOCAL_OUT или PRE_ROUTING 2. Что установлен MTU я предполагаю 1500 В любом случае, размер пакета в вашем выводе равен 1514 (и я предполагаю, что размер пакета в сети)

И

Как вы можете видеть, DF (Не фрагментировать бит) установлен, а MF (Больше фрагмента) равен нулю (может быть LAST-пакет) Попробуйте сделать это

ping -s 2000 www.google.com и проверьте вывод, закройте все остальные открытые соединения (загрузка браузеров и т. Д.)

ХОРОШО ЗАКЛЮЧЕНИЕ, ЧТО ФРАГМЕНТИРОВАННЫЕ ПАКЕТЫ, кроме последнего, я полагаю: D: D ура

0 голосов
/ 20 ноября 2011

Насколько я знаю, при использовании перехватчиков netfilter функция ip_local_deliver в ядре будет дефрагментировать ip-пакеты перед вызовом перехватчиков, зарегистрированных для LOCAL_IN.Локально сгенерированные пакеты фрагментированы в функции ip_finished_output, вызываемой после запуска хуков для POST_ROUTING.

В итоге, просмотр кода ядра говорит мне, что вы можете захватывать только фрагменты в PRE_ROUTING, FORWARD (Если не сгенерировано локально) и POST_ROUTING (Если не сгенерировано локально) ловушки.

Надеюсь, это поможет.

...