使用iptables和tc来进行限速

假设eth0位是服务器的外网网络接口。
首先在eth0的qdiscA,qdiscA控制通过本机到外网的速度,因此是用来控制服务器流出速度的
#tc qdisc add dev eth1 root handle 1:htb default 1
tc 队列 添加 设置接口 root为最上层 句柄(做标记用): 标记类型 默认使用1的class
解释如下:无论是队列,还是class和filter都有ID之类的标志符,一般都有parent(父,上层的),注意ID具有接口本地性,不同的网络接口可以有相同的ID.对于这里因为qdisc在顶部,所以parent无,用‘root’字样来标识,ID用1:来标志

default 1表示当某个ip流不满足任何已设定的filter规则时,将自动归入class 1中


然后在qdisc下建立两个class,来指定eth0控制通过本机到外网的速度
#tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2
(注:以上就是我们控制输出的规则:为eth0 下的root队列1:0 添加分类并命名为 1:30 类型为htb 速度为2M,最大可以到4M, 优先级为2)
rate: 是一个类保证得到的带宽值。如果有不只一个类,请保证所有子类总和是小于或等于父类。
prio:用来指示借用带宽时的竞争力,prio越小,优先级越高,竞争力越强。
ceil: ceil是一个类最大能得到的带宽值。
 
接着针对不同的应用在各root class下设置不同的类,如下。
#tc class add dev eth0 parent 1:30 classid 1:31 htb rate 0.5mbit ceil 2mbit prio 3
(在1:30分类下面 创建更细的分类1:31 类型为htb 规定速度0.5mbit  最高2mbit 优先级为3)
为了不使一个大的数据包传递过程(会话)永占带宽,在1:31下面添加 随即公平队列sfq.用于均衡排队的所有数据
#tc qdisc add dev eth0 parent 1:31 handle 31:sfq perturb 10
(以上是在子分类1:30下面继续添加名称为31:的队列。模式为sfq,这是一个循环均衡排队数据包的队列,它不偏向任何数据队列,循环抓取各个队列的数据包。这个循环的时间间隔是10秒钟一次,我们可以任意调节这个时间参数,比如2、4、5、6、8秒......只要不过与频繁与迟钝就好)


接着添加过滤器

#tc filter add dev eth0 parent 1:protocol ip prio 31 handle 31 fw flowid 1:31
添加“过滤分类规则”到root qdisc处(也就是1:0),协议类型为ip 优先级为31。给这个队列起名31 采用的是fw(防火墙筛选)规则,一旦符合筛选,则进入1:31分类。(还记得1:31分类么?就是刚刚在上面添加的,限速0.5M的那个)
用iptable打标,也可以使用u32之类
#iptables -t mangle -I FORWARD -i !eth1 -p tcp –sport 80 -s 192.168.1.33 –j MARK –set-mark 31

(使用iptables命令,对于传递过程中不是来自eth1的ip 且来源地址为192.168.1.33 来源ip为80 的数据全部做上31标记。用以实现此数据经过以上过滤器时被分配到1:31这个0.5m的限速中)



tc qdisc add dev eth0 root handle 2: htb default 10
tc class add dev eth0 parent 2:0 classid 2:1 htb rate 100Mbit
tc class add dev eth0 parent 2:1 classid 2:10 htb rate 100Mbit ceil 100Mbit prio 3
tc qdisc add dev eth0 parent 2:10 handle 100: sfq perturb 10
tc class add dev eth0 parent 2:1 classid 2:11 htb rate 1Mbit ceil 1Mbit prio 2
tc qdisc add dev eth0 parent 2:11 handle 110: sfq perturb 10
tc filter add dev eth0 parent 2:0 protocol ip prio 4 handle 11 fw classid 2:11


/opt/iptables/sbin/iptables -t mangle -A BANDWIDTH_UP_eth0  -s 1.2.3.4   -m time --timestart 0:00:00 --timestop 10:00:00  -j MARK --set-mark 11

猜你喜欢

转载自blog.csdn.net/sjx1989/article/details/50352463