Написание Wireshark Lua/Tap для подсчета количества потоков TCP
Ранее я публиковал вопрос, озаглавленный "Написание диссектора Wireshark для подсчета количества потоков TCP". Я получил некоторые отзывы, чтобы использовать Lua/Tap вместо этого, поэтому я решил написать один, но мне нужна помощь с кодом. В настоящее время у меня есть следующие функции, которые должен иметь тап: Listener.new, listener.packet, listener.draw, listener.reset.
Чтобы лучше понять, что я хочу сделать, просмотрите мой предыдущий вопрос здесь:
Написание диссектора Wireshark для подсчета количества потоков TCP
Мой новый вопрос заключается в том, нужно ли мне писать код, эквивалентный команде tshark:
tshark -r 1min.pcap -q -n -z conv,tcp
в Lua/Tap, чтобы сначала извлечь статистическую информацию, прежде чем я начну писать код для подсчета потоков TCP? Или все, что мне нужно сделать, это написать код на Lua/Tap, чтобы извлечь счетчик потоков TCP. В любом случае, кто-то может мне помочь с кодом? Я ищу в Интернете, но не могу найти пример, близкий к тому, что я ищу, поэтому я могу настроить его в соответствии с тем, чего я пытаюсь достичь. Благодарю.
1 ответ
У меня нет времени, чтобы написать код для вас, но вот некоторая информация, скопированная из редактирования, которое я сделал, чтобы ответить на ваш другой вопрос:
Структура C, передаваемая TCP-ответвлениям для каждого пакета:
/* the tcp header structure, passed to tap listeners */
typedef struct tcpheader {
guint32 th_seq;
guint32 th_ack;
gboolean th_have_seglen; /* TRUE if th_seglen is valid */
guint32 th_seglen;
guint32 th_win; /* make it 32 bits so we can handle some scaling */
guint16 th_sport;
guint16 th_dport;
guint8 th_hlen;
guint16 th_flags;
guint32 th_stream; /* this stream index field is included to help differentiate when address/port pairs are reused */
address ip_src;
address ip_dst;
/* This is the absolute maximum we could find in TCP options (RFC2018, section 3) */
#define MAX_TCP_SACK_RANGES 4
guint8 num_sack_ranges;
guint32 sack_left_edge[MAX_TCP_SACK_RANGES];
guint32 sack_right_edge[MAX_TCP_SACK_RANGES];
} tcp_info_t;
Таким образом, для отводов на языке C аргумент "data" в подпрограмме "пакета" прослушивателя отводов указывает на такую структуру.
Для отводов Lua таблица "tapinfo", передаваемая в качестве третьего аргумента подпрограмме "пакета" прослушивателя отводов, описывается как "таблица информации, основанная на типе прослушивателя, или nil". Для касания TCP записи в таблице включают все поля в этой структуре, кроме sack_left_edge
а также sack_right_edge
; ключи в таблице являются именами членов структуры.
th_stream
поле идентифицирует соединение; каждый раз, когда анализатор TCP находит новое соединение, он присваивает новое значение. Как отмечается в комментарии, "это поле индекса потока включено, чтобы помочь различать, когда пары адрес / порт используются повторно", так что если данное соединение закрыто, а более позднее соединение использует одни и те же конечные точки, два соединения имеют разные th_stream
значения, даже если они имеют одинаковые конечные точки.
Таким образом, у вас есть таблица, использующая th_stream
значение в качестве ключа. В таблице будут храниться конечные точки (адреса и порты) и количество пакетов и байтов в каждом направлении. Для каждого пакета, переданного в подпрограмму "пакета" слушателя, вы должны искать th_stream
значение в таблице и, если вы его не найдете, вы создадите новую запись, начнете отсчет с нуля и будете использовать эту новую запись; в противном случае вы бы использовали найденную вами запись. Затем вы выясните, идет ли пакет от А к В или от В к А, и увеличите соответствующее число пакетов и число байтов.
Вы также следите за отметкой времени. Для первого пакета вы должны сохранить метку времени для этого пакета. Для каждого пакета вы посмотрите на отметку времени и, если она на одну минуту или более позже сохраненной отметки времени, вы:
- выгрузить статистику из таблицы соединений;
- очистить таблицу соединений;
- сохранить метку времени нового пакета, заменив предыдущую сохраненную метку времени.