2014-12-19 5 views
0

Я пытался прочитать содержимое пакета при реализации сетевых подключений.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 ...

ответ

1

Это потому, что вы должны сделать (char*) tcp_header + 4*(tcp_header->doff) (т.е. падение круглых скобок вокруг добавления).

Вышеуказанное выражение type-casts tcp_header - char* и добавляет смещение 4*(tcp_header->doff) байтов.

Ваш код добавляет смещение 4*(tcp_header->doff) * sizeof(*tcp_header) байт к указателю, а затем вводит листинг результирующего указателя на char*.

Смежные вопросы