Я пытался прочитать содержимое пакета при реализации сетевых подключений.Netfilter: чтение содержимого уровня приложения?
Я могу корректно фильтровать по IP-полям или полям TCP, однако из любопытства я пытался продолжить работу, а также отобразить содержимое полезной нагрузки на уровне приложения, что не удается.
Я знаю как принцип, что «брандмауэры работают на уровне 3», так что это нормально.
Мой вопрос: в техническом аспекте, почему sock_buffer, кажется, останавливается в заголовке TCP/UDP?
Это получает IP-заголовок:
ip_header = (struct iphdr*)skb_network_header(sock_buff);
Это получает заголовок TCP:
tcp_header = (struct tcphdr*)((char*)ip_header + sizeof(struct iphdr));
Но если бы я тогда это сделать:
(char*) (tcp_header + 4*(tcp_header->doff)) //4*(tcp_header->doff) is size of tcp header
и дисплей, я вижу, с базовые тесты (например, netcats для отправки «AAAA»), что они вообще не отображают эти символы.
Мой второй вопрос: как я могу получить доступ к остальной части моего пакета на уровне модулей Linux?
EDIT:
Пробовал предложение Иоахима, но не работает, либо!
print_payload(tcp_header + 4*(tcp_header->doff));
с print_payload существа:
void print_payload(void *s){
char *payload;
int i;
payload = s;
for(i=0;i<8;i++){
printk(KERN_INFO "%.2x|", payload[i]);
}
printk(KERN_INFO "\n");
}
и отображает странные вещи, как:
77 | 70 | 21 | ffffffc1 | 00 | 00 | 00 | 00 |
когда я отправлять символы «Z» через Netcat ...