renminbi 发表于 2011-11-11 09:57

请教tcp_hdrlen 问题

在Ubuntu 10.10 2.6.35-22-generic版本下,通过netfilter hook截获本机发出去的包
tcp_hdrlen 返回的tcp头长度是32。而在本机做为代理服务器,截获到接收的包 tcp_hdrlen 返回的是48。怎么回事的?

yanhaofeng 发表于 2011-11-11 09:58

抓包看下,是否是option的问题?

renminbi 发表于 2011-11-11 10:09

抓包看下,是否是option的问题?
yanhaofeng 发表于 2011-11-11 09:58 http://bbs.chinaunix.net/images/common/back.gif

抓包过了应该不是option的问题了,把tcp头的数据打印出来,多出来的16字节是应用层的数据了。

Godbach 发表于 2011-11-11 10:47

回复 1# renminbi
看一下该接口的实现吧。
此外,数据包在 IP 层时, skb->data 指针仍然指向 IP 头部。

Godbach 发表于 2011-11-11 10:48

回复 1# renminbi
要确定在网络层调用 tcp_hdrlen 这个接口是否有效

renminbi 发表于 2011-11-11 17:30

回复renminbi
看一下该接口的实现吧。
此外,数据包在 IP 层时, skb->data 指针仍然指向 IP 头部。
Godbach 发表于 2011-11-11 10:47 http://bbs.chinaunix.net/images/common/back.gif

正像版主说的那样。netfilter hook分别在NF_INET_LOCAL_IN 和 NF_INET_LOCAL_OUT,在这些hook点怎么才能正确获取mac,ip,tcp信息呢

Godbach 发表于 2011-11-12 08:30

回复 6# renminbi
这两个 hook 点都在 IP 层。
skb 有指向 MAC 头和 IP 头的成员,都是有效的,可以直接使用,应该也有接口可以获取。

至于 TCP header,需要自己实现:
tcph = (struct tcphdr *)((unsigned char *)iph + iph->ihl * 4)

renminbi 发表于 2011-11-14 22:44

回复renminbi
这两个 hook 点都在 IP 层。
skb 有指向 MAC 头和 IP 头的成员,都是有效的,可以直接使 ...
Godbach 发表于 2011-11-12 08:30 http://bbs.chinaunix.net/images/common/back.gif

谢谢版主指点。

总结如下,若有误,请大家指出。

NF_INET_LOCAL_OUT 从本地发出的包
用tcp_hdr可以返回正确的tcp头,MAC头还没有填。

NF_INET_LOCAL_IN 接收的包
tcph = (struct tcphdr *)((unsigned char *)iph + iph->ihl * 4)。
可以这样获得tcp头。

eth_hdr(skb)返回MAC头。

Godbach 发表于 2011-11-15 10:10

回复 8# renminbi
感谢分享。
根本上就是需要了解数据包在各个协议层的一些关键变化

coconut-zj 发表于 2012-03-20 16:11

NF_INET_LOCAL_IN这里怎么获得sk_buff的data应该指向来哪里呢?
页: [1] 2
查看完整版本: 请教tcp_hdrlen 问题