netfilter修改http报文后抓包正常,浏览器无法显示
本帖最后由 泽畔无材 于 2014-05-06 09:13 编辑rt, 在网关处加载一个内核模块,利用netfilter在网页中加一小段代码。
参考了网上很多朋友的资料,昨天曾经几乎做出来了,后来不知道改了哪里,结果就出现了标题说的问题。。
主要处理方式就是:
if (ct && __nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
iph->ihl*4 , (int)(head - payload), 0,
_ins, LEN_INS, true )) {
skb->local_df = 1; //强制分片
skb_shinfo(skb)->gso_size = 0; //hack:防止warning。。
}
貌似__nf_nat_mangle_tcp_packet里都处理好了一切,另外还用了ct->status的高几位标示连接状态,方便插入。
在PC端的wireshark里的抓包结果是:
可见整个http通信过程非常顺利啊。。
然而chrome浏览器显示无法显示此网页,错误代码:ERR_INVALID_CHUNKED_ENCODING
chrome端的处理过程是:
也就是说接收完头部之后,处理body时出现了错误。。但是查看body部分报文也是非常正常的。。
后来用较早前备份的成功的代码测试也是相同的错误,很诡异。。
求问大婶们,可能是什么地方出了问题呢?我可能调太久调头晕了。。
PS:对于有些网页,比如2345网址导航, 不管其长度是否要分片,上述模块可以正确添加一小段代码,比如<!-- test -->, 但是对于多数网页来说,都是返回ERR_INVALID_CHUNKED_ENCODING。。
PPS:刚发现是网页内容被截断了,但content-length已经被我改过了的啊,见下面截图,不清楚为什么实际上还是按原始长度解析:
更新:已查明是Transfer-Encoding: chunked 搞的鬼,这都是http部分的事情了,害我在底层找半天。。
更新:修正 上面这个属性后,初步搞定了~
content-length是不是正确的? 回复 2# lonelyair
content length 也改过了的,有些动态生成的网页是没有content length的,经过测试,即使不改centent length, chrome也可以显示整个网页。
另外,诡异的是,对于有些网页,不管其长度是否要分片,上述模块可以正确添加一小段代码,比如<!-- test -->, 但是对于多数网页来说,都是返回ERR_INVALID_CHUNKED_ENCODING。。
那这个是本身chrome有几率出现这个错误,还是你修改导致的?
另外content cache与encode怎么设置的?不知道有没有影响
另,修改BODY部分也没成功过,还请赐教 回复 4# lonelyair
移除模块后不会出现这个错误。
content cache没有设置,不过每次测试前都清除浏览器缓存数据,并且将请求改为不允许gzip压缩编码等
应该只要找出目前这个问题所在,就差不多能完成http的报文修改了(虽然昨天已经实现过了的啊,后来不知道改了哪里就成这样了。。)
回复 1# 泽畔无材
恭喜恭喜啊,能不能把过程详细些,chunk会导致content-length的长度?对于HTTP处理不太理解 楼主,你好,请问你能不能把你写的代码给我一份吗,我现在特别想学netfiter,可是没有例子,想借你的程序看看,demo也行,谢谢 回复 7# 我不重要
楼主,你好,请问你能不能把你写的代码给我一份吗,我现在特别想学netfiter,可是没有例子,想借你的程序看看,demo也行,谢谢
直接看net/netfilter的源码不就行了
恭喜lz找出问题。chunk以\r\n'0'\r\n\r\n作为结束标志, 回复 8# 瀚海书香
不好意思啊,因为我对netfilter不是很熟,我刚才看了一下,不知道如何入手,我觉得应该先netfilter的接口先入手吧,以后弄熟了在去看他的源代码比较好,不知道我说的对不对,谢谢大神