免费注册 查看新帖 |

Chinaunix

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

[网络管理] 发布一个速度匹配的内核模块(hashspeed) [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-01-03 01:47 |只看该作者
这样的限速仅仅是通过丢包实现的,如果能结合 tc 实现针对 per IP 进行流量整形就好了
我也在考虑这个问题,但目前还没有什么好的想法
初步想法是修改 tc 的内核代码,通过 hash 实现对 per IP 的控制

论坛徽章:
0
22 [报告]
发表于 2008-01-03 09:16 |只看该作者

测试没有成功

我用了这句-A FORWARD -o eth1 -m iprange --dst-range 192.168.1.12-192.168.80.0 -m hashspeed  ! --hashspeed-bytes 60K --hashspeed-mode dstip --hashspeed-name dlimit -j DROP
可是在长沙电信上测试下载还是有800K的流量呀?另ETH1是连接外网的接口,这个没错吧?后来把ETH1改成ETH0内网的接口,结果整个内网都上不了网了,删了这句还是不行,REBOOT一次才正常!!!
下面是我的配置
# Generated by iptables-save v1.3.8 on Thu Jan  3 09:13:32 2008
*filter
:INPUT DROP [55960:3875019]
:FORWARD DROP [68908:3919599]
:OUTPUT ACCEPT [21416:10431208]
-A INPUT -i eth0 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 22,23,6160 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 20,21 -j ACCEPT
-A FORWARD -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
-A FORWARD -p udp -m multiport --dports 135,137,138,139,445 -j DROP
-A FORWARD -m iprange --src-range 192.168.1.81-192.168.1.90 -j ACCEPT
-A FORWARD -m iprange --dst-range 192.168.1.81-192.168.1.90 -j ACCEPT
-A FORWARD -m iprange --src-range 192.168.1.15-192.168.1.16 -j ACCEPT
-A FORWARD -m iprange --dst-range 192.168.1.15-192.168.1.16 -j ACCEPT
-A FORWARD -s 192.168.1.109 -p tcp -m tcp --dport 7001 -j ACCEPT
-A FORWARD -s 192.168.1.109 -p tcp -m tcp --dport 98 -j ACCEPT
-A FORWARD -m mac --mac-source 00:E0:4C:39:04:4E -m time --timestart 02:01 --timestop 19:58 -j DROP
-A FORWARD -m mac --mac-source 00:E0:4C:39:04:4E -m time --timestart 19:59 --timestop 02:00 -j ACCEPT
-A FORWARD -m mac --mac-source 00:C0:26:AC:CD:A6 -m time --timestart 19:59 --timestop 02:00 -j ACCEPT
-A FORWARD -m mac --mac-source 00:E0:4C:4A:80:F1 -m time --timestart 19:59 --timestop 02:00 -j ACCEPT
-A FORWARD -s 192.168.1.0/255.255.255.0 -m time --timestart 20:00 --timestop 08:20 -j DROP
-A FORWARD -p icmp -m icmp --icmp-type any -j ACCEPT
-A FORWARD -m ipp2p --ipp2p -j DROP
-A FORWARD -m ipp2p --xunlei -j DROP
-A FORWARD -p udp -m udp --dport 15000 -j DROP
-A FORWARD -o eth1 -m iprange --dst-range 192.168.1.12-192.168.80.0 -m hashspeed  ! --hashspeed-bytes 60K --hashspeed-mode dstip --hashspeed-name dlimit -j DROP
-A FORWARD -p tcp -m multiport --dports 53,21,80,443,444,194,119,110,25,161,22,23,91,6911,3004 -j ACCEPT
-A FORWARD -p udp -m multiport --dports 53,123,8000 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m multiport --sports 23,443,444 -j ACCEPT
COMMIT
# Completed on Thu Jan  3 09:13:32 2008
# Generated by iptables-save v1.3.8 on Thu Jan  3 09:13:32 2008
*nat
REROUTING ACCEPT [412791:24627481]
OSTROUTING ACCEPT [148:7462]
:OUTPUT ACCEPT [1211:59074]
-A PREROUTING -i ppp0 -p udp -m udp --dport 7324 -j DNAT --to-destination 192.168.1.86:7324
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 7324 -j DNAT --to-destination 192.168.1.86:7324
-A PREROUTING -i ppp0 -p udp -m udp --dport 14672 -j DNAT --to-destination 192.168.1.86:14672
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 14662 -j DNAT --to-destination 192.168.1.86:14662
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 8015 -j DNAT --to-destination 192.168.1.15:80
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 3000 -j DNAT --to-destination 192.168.1.15:3000
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 3001 -j DNAT --to-destination 192.168.1.15:3001
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 8016 -j DNAT --to-destination 192.168.1.16:80
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 3003 -j DNAT --to-destination 192.168.1.16:3003
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 3002 -j DNAT --to-destination 192.168.1.16:3002
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 8888 -j DNAT --to-destination 192.168.1.86:3389
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
# Completed on Thu Jan  3 09:13:32 2008
我测试的IP是22,我侍会儿再试试不带IPRANGE 匹配看能不能成功!

[ 本帖最后由 mack2050 于 2008-1-3 09:33 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2008-01-03 09:38 |只看该作者
看样子不错,留名有时间再测试,哈哈!

论坛徽章:
0
24 [报告]
发表于 2008-01-03 10:43 |只看该作者
-A FORWARD -o eth1 -m iprange --dst-range 192.168.1.12-192.168.80.0 -m hashspeed  ! --hashspeed-bytes 60K --hashspeed-mode dstip --hashspeed-name dlimit -j DROP

这句明显有问题

看你的样子,似乎是用的adsl(我看到ppp0),而你的内网接口是eth0

因此,只有-o eth0 的时候,-m iprange --dst-range 192.168.1.12-192.168.80.0 才能匹配到
不知道你的shell是什么,在我的shell下执行的时候,需要用 \!  而不是 !

注:
需要严格控制好 网络接口 和 srcip  dstip  的对应关系

你想要控制内网,因此必须在内网接口上做控制
-o 内网接口  的时候,内网地址都是数据包中的  目的地址  ,因此应该是dst
-i 内网接口 的时候,内网地址都是数据包中的  源地址, 因此都应该是src

论坛徽章:
0
25 [报告]
发表于 2008-01-03 10:49 |只看该作者
原帖由 platinum 于 2008-1-3 01:47 发表
这样的限速仅仅是通过丢包实现的,如果能结合 tc 实现针对 per IP 进行流量整形就好了
我也在考虑这个问题,但目前还没有什么好的想法
初步想法是修改 tc 的内核代码,通过 hash 实现对 per IP 的控制


是的,就是通过丢弃不匹配的包来实现的

TC的控制方法很多,这个模块的作用原理是TBF(应该是一种最简单的控制方式),如果TC能够很容易做到Per IP的话,也许早就写出来了。

通过我自己的测试,感觉基本上能够达到我的控制目的,就是限制包发送的速度和带宽占用

基本上能够控制在10%以内。

论坛徽章:
0
26 [报告]
发表于 2008-01-03 11:14 |只看该作者
springwind426 兄这个模块是你自己改的吧?是根据哪个内核版本的 hashlimit 改的?
我对比了一下 2.6.21 的,发现不是 ipt_hashlimit 而是 xt_hashlimit,里面也有很多结构都不一样了
我相对比一下改之前和之后的情况,看看究竟动了哪里

论坛徽章:
0
27 [报告]
发表于 2008-01-03 11:42 |只看该作者
对,就是用hashlimit修改的

论坛徽章:
0
28 [报告]
发表于 2008-01-03 12:36 |只看该作者

回复 #24 springwind426 的帖子

我的线路是电信的以太网接入,不用ADSL设备,但是要进行虚拟拨号才可以,所以确实用到了PPP0

-A FORWARD -o eth0 -m iprange --dst-range 192.168.1.12-192.168.80.0 -m hashspeed  /! --hashspeed-bytes 60K --hashspeed-mode dstip --hashspeed-name dlimit -j DROP

我现在是想控制内网的下载速度,限制每个IP的最高速率为60K,但是一运行这条命令之后,所有内网的机器都不能打开网页了,QQ也上不了,不过能PING通外网,去掉这一句情况还是一样,后来重启才好的,现在都不能再做测试,等下班了才好再继续测试!另我的SHELL查了一下,应该是/bin/bash,是否应该不要/   ?

[ 本帖最后由 mack2050 于 2008-1-3 12:37 编辑 ]

论坛徽章:
0
29 [报告]
发表于 2008-01-03 12:43 |只看该作者
原帖由 springwind426 于 2008-1-3 11:42 发表
对,就是用hashlimit修改的

是根据哪个内核版本的 hashlimit 改的?

论坛徽章:
0
30 [报告]
发表于 2008-01-03 13:07 |只看该作者
原帖由 platinum 于 2008-1-3 12:43 发表

是根据哪个内核版本的 hashlimit 改的?



根据2.6.23的修改的,我做了不少改动,去掉了IPV6的支持,修改了初始值的设置(我用hashlimit测试过,它的初始值和峰值的设置不合理,也就是说,它的令牌桶太小了,尽管我设置的值很大,可是匹配的值却很小,相差多。)
对一些结构的定义我也做了修改,主要是方便我的统计用的(就是添加了一些计数器。)
还有,我把  带宽的控制和数据包速率的控制整合到一起了,这样就可以完全脱离hashlimit(它只有数据包速率的控制),而且,我对控制做了简化,只接收 秒 这个单位,即每秒多少数据流或者每秒多少数据包这样的限制,因此,可以说从控制粒度上没有它细(因为我认为,我没有必要限制到 /分钟  /小时 /天 这样的粒度)
原来,hashlimit并不接收 “逻辑非” 这样的条件,而我恰恰认为这个条件比较重要(即超过部分才匹配),这样,想丢弃某些包的时候,只要一条规则就可以了。


我改进了一下,令牌桶的大小设置成  平均值+burst值了(burst值我初始设定为10%的平均值),我经过测试,令牌桶的容量(峰值)小于平均值的时候,相差越多,误差越大。

其实,对于持续的数据传输,令牌桶的容量再大一点儿也无所谓。(不过,对于持续传输,令牌桶设置大了,对结果也没有任何影响)。

还有,x_tables.h这个在新内核中有,对于旧内核,是没有的,同样的,以xt_打头的函数,对于旧版本也没有的
我原来是想修改成可以在旧版本下也可以编译,可是,用到mutex_lock和mutex_unlock这些函数,只有在新内核中才有,就是mutex.h这个头文件
主要作用是用来在修改hash表的内容的时候对hash表进行锁定用的。

因此,我的这个想法并没有能够实现,可是我也不知道如何修改它。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP