文档章节

流量控制

xDreamYY
 xDreamYY
发布于 2013/09/12 10:11
字数 1019
阅读 264
收藏 3

    最近在做流量控制的需求,钻研了大半个月,有些心得,特记下,方便以后查阅。

    流量控制的实现方案是netfilter + l7-filter + tc。netfilter从内核获取数据包,通过l7-filter实现不同协议数据包的不同mark,针对不同mark做不同的tc命令,实现不同协议的流控。原理如此,但在实施过程中还是有诸多困难的。

    首先l7-filter的移植,l7-filter使用C++实现,公司项目使用C实现,且项目代码比较混乱,包含C++库引入很多问题,无赖之下,将l7-filter用C改写了一遍(还好代码不多),改写基于的版本是l7-filter-userspace-0.12-beta1。如果有和我情况差不多的童鞋,一定要移植完全,否则流控根本无法做。

    l7-filter用户空间代码分两块,一块是nfq_queue获取packet,然后设置包mark;另一块是nf_conntrack跟踪流信息,将一条流相关的包放入一个buffer中。这两部分协调工作,标记流的mark,这样才能流控。比如一条流(src-->dst, dst ---> src)可能只是头几个包有明显的特征信息,这样l7-filter匹配只能匹配头一个包的信息,如果没有nf_conntrack将接下来的数据一起放到buffer里面,后面的数据就无法匹配,那么流控就无法进行。我最初也是想当然的只移植了nfq_queue部分,最后当然无法实现流控。

    mark设置完成后,流控就是tc的事情了。tc虽然很复杂,但是实现流控也就几条特定的命令,我的命令如下

下载

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 10: htb default 256
tc class add dev eth0 parent 10: classid 10:1 htb rate 1mbit ceil 1mbit
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 40kbps ceil 40kbps prio 1
tc qdisc add dev eth0 parent 10:10 handle 101: sfq perturb 10
tc filter add dev eth0 parent 10: protocol ip prio 10 handle 14 fw classid 10:10
上传

tc qdisc del dev eth1 root
tc qdisc add dev eth1 root handle 10: htb default 256
tc class add dev eth1 parent 10: classid 10:1 htb rate 1mbit ceil 1mbit
tc class add dev eth1 parent 10:1 classid 10:10 htb rate 100kbps ceil 100kbps prio 1
tc qdisc add dev eth1 parent 10:10 handle 101: sfq perturb 10
tc filter add dev eth1 parent 10: protocol ip prio 3 handle 19 fw classid  10:10
设置tc命令,一定要分清在哪个设备上,如eth0或eth1。一般的tc命令是在dev的out队列做流控。所以要限制上传,则需要在out口限制,而下载则在in口限制。

比如网络环境如下, 192.168.9.2  ---> eth0 ---> eth1 ---> 192.168.8.2。如果要对192.168.9.2做上传流控,则需要在eth1上设置上传tc的速率,而192.168.9.2的下载流控,则需要在eth0上设置下载tc的速率。

    这样总的来说,流控的框架就打好了,过来的包,通过l7-filter标记mark,然后到达tc,实现流控。比如此时使用http完全可以实现上传和下载的控制。但真要做好流控还要很长的路要走。

    比如ftp,ftp传输数据的使用子流,而子流的数据库没有任何的特征信息,l7-filter根据无法mark,那么流控也无从做起。网上说ftp的流控需要使用modprobe ip_nat_ftp,modprobe ip_conntrack_ftp,这也是l7-filter网络推荐的。但我在实际使用过程中没有任何效果,也没有任何报错信息,所以后来就放弃了,如果有哪位童鞋真的成功过,还请给点意见。最后无赖之下,ftp使用方案是根据客户端建立子流传输文件时的端口规律,实现控制。

    当然还有P2P的流,传输过程中也没有任何特征信息,l7-filter也无法标记,流控也很难。

    总的来说,l7-filter只能标记部分包的信息,所以做起流控,还是很难,不知道是不是因为我对l7-filter的理解不够深刻。

© 著作权归作者所有

xDreamYY
粉丝 0
博文 24
码字总数 4988
作品 0
南京
私信 提问
阻断攻击从接入交换机入手zz

阻断攻击从接入交换机入手 郑瑞文   宽带网接入交换机通常需要与用户终端直接连接,一旦用户终端感染蠕虫病毒,病毒发作就会严重消耗带宽和交换机资源,甚至造成网络瘫痪,这一现象在Slamm...

JavaGG
2009/05/05
141
0
高可用流量管理框架 - Sentinel

Sentinel 是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护...

小鼠标李豪
2018/08/06
11.7K
4
微服务神经元 Neural(Nerver) 发布 3.0.0

微服务神经元是一个分布式服务框架中的神经组织,主要为分布式架构提供:流量控制、服务降级、幂等机制、泛化容错、流量熔断、隔离舱壁、超时控制、慢性重试等功能。其概念设计如下图所示: ...

李景枫
2016/07/04
1K
9
2014.5.17---网络流量整形与带宽控制技术

1.流量整形:缓冲区和令牌桶。当报文的发送速度过快时,首先在缓冲区进行缓存,在令牌桶的控制下再均匀地发送这些被缓冲的报文。 2.带宽控制是一种限制流量输出速率的措施,带宽控制的作用是...

guy_kg
2014/05/17
0
0
阿里中间件开源组件 Sentinel 发布首个官方推荐可生产版本

近日,阿里中间件开源组件Sentinel 发布首个官方推荐可生产版本:1.3.0-GA ,该版本包括 Sentinel 控制台功能的完善和一些 bug 修复,以及其它的产品改进,是一个具有里程碑意义的生产可用版...

中间件小姐姐
2018/11/02
4.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

How to find table in a database with HeidiSQL

In this article I want to show you how you can find table by name with HeidiSQL. Find table by typing One of the options to find table is to having focus in the object explorer ......

Ciet
10分钟前
4
0
基于SWIG跨平台开发的C++编码规范

1、数组定义 使用数组不建议采用指针方式eg double *,或者 double test[4] 直接采用std::vector或list即可。对于固定长度的数组定义为一个结构体 double test[4]instead ofstruct Vec...

洋碱
12分钟前
2
0
用Markdown编程之布局

基本就是用Markdown的布局方式。 \:是转义符号,最高优先级。 行首+# :用于空间布局,1-6分别标明:模式根、子模式、子模式内。 行首+> :用于标注和通信,1个标明标注,2个标明分类,3个标...

dwcz
19分钟前
3
0
SpringBoot定时器多线程解决方案

@Scheduled 作用:spring定时器(定时执行一次或定时轮询执行一段代码) 使用场景:注解在方法上 参数说明:常用参数 @Scheduled 参数说明 String cron:cron表达式定义了方法执行的时间规则(网...

whoisliang
20分钟前
4
0
3.01、Spring AOP的理解

注:转 https://mp.weixin.qq.com/s/PsgTLn8cdTxdd542XgVkUA 什么是AOP AOP(Aspect-Oriented Programming), 即 面向切面编程 , 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相......

追忆2025
25分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部