В первую очередь я пытаюсь получить адрес источника и порт назначения из полезной нагрузки очереди Netfilter (полезная нагрузка извлекается с использованием функции nfq_get_payload). Следующий вопрос задает то же самое и получает правильный ответ:
Как извлечь номер порта источника и назначения из пакета в очереди iptables
К сожалению, нет никаких объяснений того, почему добавление 20 и 22 к адресу дает вам правильное место для чтения информации. Я предполагаю, что это из-за структуры данных (очевидно), но если есть определенная структура, что это?
Документация явно не объясняет, как данные форматируются, только то, что «тип данных, извлекаемых этой функцией, будет зависеть от режима, установленного с помощью функции nfq_set_mode ()», но тогда документы для set_mode ничего не упоминают о данных типа и источник не сразу ничего не раскрывает.
Я чувствую, что это должно быть что-то очень важное для общих структур сетевого программирования, которые я упускаю или не понимаю.
Примечания: функция nfq_get_payload: http://www.netfilter.org/projects/libnetfilter_queue/doxygen/group__Parsing.html#gaf79628558c94630e25dbfcbde09f2933
Мне удалось выяснить это, и я оставлю это здесь для других, чтобы найти.
Полезная нагрузка начинается со структуры iphdr. Структура iphdr имеет поле протокола, например, tcp, если это tcp, то данные после структуры iphdr являются структурой tcphdr, если это udp, то для этого есть другая структура hdr и т. Д. Для icmp и т. Д.
Для доступа к порту предположим, что q_data является указателем на структуру nfq_data:
unsigned char *data;
nfq_get_payload(q_data, (unsigned char**)&data);
struct iphdr * ip_info = (struct iphdr *)data;
if(ip_info->protocol == IPPROTO_TCP) {
struct tcphdr * tcp_info = (struct tcphdr*)(data + sizeof(*ip_info));
unsigned short dest_port = ntohs(tcp_info->dest);
} else if(ip_info->protocol == IPPROTO_UDP) {
//etc etc
}
Других решений пока нет …