免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 泽畔无材
打印 上一主题 下一主题

[网络子系统] netfilter修改http报文后抓包正常,浏览器无法显示 [复制链接]

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-05 10:53 |显示全部楼层 |倒序浏览
本帖最后由 泽畔无材 于 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部分的事情了,害我在底层找半天。。
更新:修正 上面这个属性后,初步搞定了~


                       

评分

参与人数 1可用积分 +2 收起 理由
Godbach + 2 很给力!

查看全部评分

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
2 [报告]
发表于 2014-05-05 11:19 |显示全部楼层
回复 2# lonelyair
content length 也改过了的,有些动态生成的网页是没有content length的,经过测试,即使不改centent length, chrome也可以显示整个网页。
另外,诡异的是,对于有些网页,不管其长度是否要分片,上述模块可以正确添加一小段代码,比如<!-- test -->, 但是对于多数网页来说,都是返回ERR_INVALID_CHUNKED_ENCODING。。


   

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
3 [报告]
发表于 2014-05-05 11:36 |显示全部楼层
回复 4# lonelyair
移除模块后不会出现这个错误。
content cache没有设置,不过每次测试前都清除浏览器缓存数据,并且将请求改为不允许gzip压缩编码等
应该只要找出目前这个问题所在,就差不多能完成http的报文修改了(虽然昨天已经实现过了的啊,后来不知道改了哪里就成这样了。。)


   

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
4 [报告]
发表于 2014-05-06 09:18 |显示全部楼层
回复 6# lonelyair

Transfer-Encoding是chunk的话,即分块策略传输,每段开始有一个十六进制数字表示该段的长度。
我是参考http://www.cnblogs.com/jcli/archive/2012/10/19/2730440.html的内容的。
   

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
5 [报告]
发表于 2014-05-06 10:34 |显示全部楼层
回复 13# Godbach
我直接调用__nf_nat_mangle_tcp_packet,它会帮忙全部处理了的。后来发现不是底层的问题,是http层的问题,见主贴底部的更新。。


   

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
6 [报告]
发表于 2014-05-06 20:58 |显示全部楼层
回复 19# lonelyair

hook在NF_INET_POST_ROUTING,
我仔细看了下__nf_nat_mangle_tcp_packet,好像只处理了当前包的seq修正,可能接下来的包有系统自带的hook根据status的那个标志位自动处理seq修正了?反正抓包结果表明序列号都是对的。。
HTTP请求只是改了下禁止gzip,和响应的改法差不多。
   

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
7 [报告]
发表于 2014-05-08 15:48 |显示全部楼层
回复 18# Godbach

现在发现个小问题,我的hook点在NF_INET_POST_ROUTING,而dnat在NF_IP_PRE_ROUTING就处理了,在我的hook里检查,发现dst ip的确已经被改正了,但是mac仍然是网关的mac,想问下数据包的mac是何时被改正为内网机子的mac呢?在这个hook里能否获取到目标的mac?
   

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
8 [报告]
发表于 2014-08-22 11:48 |显示全部楼层
回复 23# lyyxh2004

可以的,ip层自动分片
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP