免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 9863 | 回复: 31
打印 上一主题 下一主题

[网络管理] iptables L7标记文件大小进行速度限制,,白金大哥加精 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-21 23:52 |只看该作者 |倒序浏览
本帖最后由 Oumulong 于 2010-07-21 23:56 编辑

题目有点过哈。。。。
请教白金大哥,

,我抓包找到一个下载包中有content-Length是本文件的大小。
写了个L7
http.+content-Length:.*[5-9][0-9][0-9][0-9][0-9][0-9][0-9]来匹配也就是6M以下的数据。。作标记。然后TC限速。。。
iptables -t mangle -R PREROUTING -m layer7 --l7proto httpl -j CONNMARK --set-mark 1
有个奇怪的现象。。
因 为一个连接中只有一个包可以显示content-Length,,文件大小。。
可我在mangle PREROUTING 中会看到发几个包。。我测试时只有一个下载文件大于6M..

我用了-J MARK
-J CONNMARK 来标记。。
都不能达到我的效果。。


正规表达式。。我用测试工具是可以通过的。。

不知道问题出在那里。?

谢谢

论坛徽章:
0
2 [报告]
发表于 2010-07-22 09:56 |只看该作者
因 为一个连接中只有一个包可以显示content-Length,,文件大小。。
可我在mangle PREROUTING 中会看到发几个包。。我测试时只有一个下载文件大于6M..

http 协议有 keep alive 功能,所以你说一个连接中只有一个包可以看到 content-length 是不对的
而你说在 mangle PREROUTING 中会看到发几个包,我不太理解你的意思

另外,这是个问题还是个精华?为什么在有问题的同时还要求加精?

论坛徽章:
0
3 [报告]
发表于 2010-07-22 10:30 |只看该作者

http 协议有 keep alive 功能,所以你说一个连接中只有一个包可以看到 content-length 是不对的
而你说在 mangle PREROUTING 中会看到发几个包,我不太理解你的意思


如你下载一个10M的文件..抓包content-length =10M就只有一个..不会有另一个包还显示这个文件的大小 ..
你可以抓包试下..

另外加精的问题..我觉得这个问虽然现在没有很好的解决..但提出了解决的方向...
等问题解决好后..将给很多人带来方便和益处..很因人需要这样的功能却无从下手..

论坛徽章:
0
4 [报告]
发表于 2010-07-22 11:14 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2010-07-22 11:29 |只看该作者

  1. http.+content-Length:.*[5-9][0-9][0-9][0-9][0-9][0-9][0-9]
复制代码
这个匹配效率太低了,因为 content-length: 后面一定直接跟随数字
应该换成这个

  1. http.+content-length:[5-9][0-9][0-9][0-9][0-9][0-9][0-9]
复制代码
另外你还是没有解释 “mangle PREROUTING 中会看到发几个包” 是什么意思

这个功能我已经实现了,不是不是通过 layer7 去做的,而是写了个单独的匹配模块,正则的方法局限性很大

论坛徽章:
0
6 [报告]
发表于 2010-07-22 11:32 |只看该作者
另外,CONNMARK 过以后并不代表数据包被 MARK 了
而 tc 是根据数据包 MARK 来分类的,而不是 CONNMARK

所以,建议
1、使用 -j MARK 而不是 -j CONNMARK
2、如果使用 -j CONNMARK 后,需要在起始位置判断 connmark 是否有内容,如果有,用 connmark-save 的方法将标记保存到数据包中

论坛徽章:
0
7 [报告]
发表于 2010-07-22 11:38 |只看该作者
用模块是最好的办法..白金大哥能不能共享一下这个模块..
因为没有写模块的能力..所以没法下手..看能不能用L7实现...

http.+content-Length:.*[5-9][0-9][0-9][0-9][0-9][0-9][0-9]

这是为什么有人.*呢..就是因为抓包时你可以发现Length:和数字之间有不定的空格

另外你还是没有解释 “mangle PREROUTING 中会看到发几个包” 是什么意思


用iptalbes -t mangle -nvL 就可以看到PREROUTING 链被标记过的包..的数量.
正确情况应该只有一个包啊..只有那个包里有content-Length大于设置定值才能通过...为何有很多包呢(肯定不会有那么多包被标记的,,只有可能是正则的问题了,,再验证一下正则)

论坛徽章:
0
8 [报告]
发表于 2010-07-22 11:42 |只看该作者
用模块是最好的办法..白金大哥能不能共享一下这个模块..
因为没有写模块的能力..所以没法下手..看能不能用L7实现...

l7 应该是可以做到的,但是效率不会太高,准确率也不会太高

这是为什么有人.*呢..就是因为抓包时你可以发现Length:和数字之间有不定的空格

至少我没有遇到过这种情况,能贴图证明一下这种情况的存在吗?

用iptalbes -t mangle -nvL 就可以看到PREROUTING 链被标记过的包..的数量.
正确情况应该只有一个包啊..只有那个包里有content-Length大于设置定值才能通过...为何有很多包呢(肯定不会有那么多包被标记的,,只有可能是正则的问题了,,再验证一下正则)

我在 6 楼已经提供了解决办法,你参考一下

论坛徽章:
0
9 [报告]
发表于 2010-07-22 12:05 |只看该作者
[img]

[/img]

论坛徽章:
0
10 [报告]
发表于 2010-07-22 12:12 |只看该作者
我查了一下我的程序代码,匹配的是 "Content-Length: ",然后取后面的数字
我遇到的都是后面有一个空格然后才是数字的形式,没有遇到过其他情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP