免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2008-01-03 11:42 |显示全部楼层
对,就是用hashlimit修改的

论坛徽章:
0
12 [报告]
发表于 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表进行锁定用的。

因此,我的这个想法并没有能够实现,可是我也不知道如何修改它。

论坛徽章:
0
13 [报告]
发表于 2008-01-03 13:15 |显示全部楼层
原帖由 mack2050 于 2008-1-3 12:36 发表
我的线路是电信的以太网接入,不用ADSL设备,但是要进行虚拟拨号才可以,所以确实用到了PPP0

-A FORWARD -o eth0 -m iprange --dst-range 192.168.1.12-192.168.80.0 -m hashspeed  /! --hashspeed-bytes 60K - ...



如果是bash的话,应该用 \!  来转义 !   而不是/!

不过,用 iptables-save 或者 iptables -L 来显示设定的情况的时候,会只显示!,而没有\

论坛徽章:
0
14 [报告]
发表于 2008-01-03 18:30 |显示全部楼层
原帖由 5639863 于 2008-1-3 14:29 发表
dmesg看到如下信息:
ipt_hashspeed: Unknown symbol xt_unregister_matches
ipt_hashspeed: Unknown symbol ipt_unregister_matches
ipt_hashspeed: Unknown symbol ipt_register_matches
这是什么意思?



有可能是没有加载相依赖的内核模块,比如 x_tables 和 ip_tables

是不是手动加载内核模块了?(比如  insmod ./ipt_hashspeed.ko)

论坛徽章:
0
15 [报告]
发表于 2008-01-03 18:33 |显示全部楼层
原帖由 mack2050 于 2008-1-3 18:29 发表
呵呵,发布最新测试反馈!
一切顺利,能把我想要的IP段限速在我指定的范围内,不过我的网关(192.168.1.11)和广播地址(192.168.1.255)也在其中,暂时似乎没有什么影响,大家看看觉得会不会有什么问题!

-A FORWARD  ...



正常情况下,网关的IP不会出现在路过的数据包中,只有网关的MAC会出现在数据包中

正常访问的情况下,广播数据包是很少的

论坛徽章:
0
16 [报告]
发表于 2008-01-03 20:07 |显示全部楼层
原帖由 5639863 于 2008-1-3 19:16 发表


应该是手动加载了一下,但没有成功,所以出现上面的提示。我depmod -a 然后在insmod,但还是不行。只好重新编译,但出现下面的问题:
make -C /lib/modules/2.6.18.8/build M=/root/hashspeed-0.1 modules ...



我检查了一下,发现旧版本的内核是 ipt_register_match,而且参数也只有一个

我针对这个做了修改,你到我的主页上下载最新的,然后再编译看看,或者,自己修改后,再编译看看

ipt_unregister_match(ipt_hashspeed);
ipt_register_match(ipt_hashspeed);

有几处

原来是
ipt_unregister_matches(ipt_hashspeed, ARRAY_SIZE(ipt_hashspeed));
ipt_register_matches(ipt_hashspeed, ARRAY_SIZE(ipt_hashspeed));

论坛徽章:
0
17 [报告]
发表于 2008-01-03 21:36 |显示全部楼层
原帖由 5639863 于 2008-1-3 20:56 发表
make -C /lib/modules/2.6.18.8/build M=/root/hashspeed-0.1 modules
make[1]: Entering directory `/usr/src/linux-2.6.18.8'
  CC [M]  /root/hashspeed-0.1/ipt_hashspeed.o
/root/hashspeed-0.1/ipt_ha ...



网上似乎看到例子,这个是编译iptables模块的时候的错误

cc -shared -o libipt_hashspeed.so libipt_hashspeed.o
好象有大侠说把 Makefile中的
$(CC) -shared  修改成  ld -shared 就可以编译过去。

还有,我查看了一下2.6.18的定义

static void
hashspeed_destroy(const struct ipt_match *match, void *matchinfo
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
        ,unsigned int matchsize
#endif
)

把hashspeed_destroy部分的定义修改一下(如上),编译看看,是不是编译内核模块的时候就没有警告信息了

[ 本帖最后由 springwind426 于 2008-1-3 21:50 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2008-01-04 10:43 |显示全部楼层
原帖由 dzb_01 于 2008-1-3 22:35 发表
springwind426兄,能否解决一下hashspeed在iptables-1.4.0下的编译,谢谢先
内核2.6.23,iptables-1.4.0,内核模块编译通过,iptables模块编译错误如下

[root@qq hashspeed-0.1]# make
make -C /usr/src/l ...



你到我的主页上下载最新的吧,我看了一下iptables-1.4.0的头文件,需要把linux的include也包含到-I中才行

还有,我修改了一下Makefile,修正了可能检测错误iptables版本的情况
(比如,我当前的系统安装的iptables版本是1.3.8,可是我想编译供1.4.0的iptables运行的模块,虽然指定了iptables的源代码所在路径,可是,版本检测却是当前的版本。)

论坛徽章:
0
19 [报告]
发表于 2008-01-04 10:52 |显示全部楼层
原帖由 5639863 于 2008-1-4 10:50 发表



哈哈,太感谢了啊,我刚刚下载你最新的修改版本,并把里面的$(cc) -share 改成ld -share编译成功。



我没有修改成ld也是编译成功的,而且也能够正常运行

我的环境:
linux 2.6.22
iptables-1.4.0
gcc 4.1.3 20071209

论坛徽章:
0
20 [报告]
发表于 2008-01-04 12:03 |显示全部楼层
原帖由 5639863 于 2008-1-4 11:12 发表
springwind426 兄,我没有想通在有代理的情况下,应该怎么做限制,因为有代理的时候走的是INPUT链,将如何控制呢?

我根据前面的例子写了一个针对我自己机器的规则:

iptables -I INPUT   -s 192.168.0.8 ...


你可以试试:

iptables -t nat -I POSTROUTING 1 -o 内网网卡 -m hashspeed \! --hashspeed-bytes 256K --hashspeed-mode dstip --hashspeed-name dlimit -j DROP

就是在NAT链上做控制,在内网卡的发包上做控制,能够控制内网的下载速度

iptables -t nat -I PREROUTING 1 -i 内网网卡 -m hashspeed \! --hashspeed-bytes 256K --hashspeed-mode srcip --hashspeed-name slimit -j DROP

这个是在内网网卡的收包上做控制,能够控制内网的上传速度

因为数据包进入的时候,是先进入nat表的PREROUTING链,然后经过filter表,而出去的时候,是先经过filter,然后再经过nat表的POSTROUTING链

只是有人说,在nat表中做访问控制,可能会影响效率,我没有试过。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP