Netfilter:阅读应用程序级别的内容?
问题描述:
实施netfiler挂钩时,我一直在试图读取数据包内容。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模块级别访问我的数据包的其余部分?
编辑:
试图约阿希姆的建议,但也不工作!
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 |
一旦我开始通过netcat的发送“Z”字......
答
这是因为你应该做(char*) tcp_header + 4*(tcp_header->doff)
(即丢弃除了周围的括号)。
上述表达式类型 - 将tcp_header
转换为char*
,并添加4*(tcp_header->doff)
字节的偏移量。
您的代码将4*(tcp_header->doff) * sizeof(*tcp_header)
字节的偏移量添加到指针,然后键入结果指针char*
。