初次接触强大的TC(流量)控制,遇到的麻烦还真不少,严重的概念性混淆,错误的参数使用,“牛口不对马嘴”的端口指向。总之的确花了不少时间.不过还是需要感谢身边兄弟的点拨(有些时候当自己出现概念性混淆时,最好的办法就是停下来静静的莫子都不想,等脑袋清醒了在去理解。),很多时候自己的思维会把自己带到沟里去的。
这次研究TC,只是单纯的从限制单个IP上传(下载)流量,具体更深入的了解需要后期花更多的时间。在网上看了一下资料,发现大部分适合其个人使用(不过我们可以借助参考),所有感谢无私的开源。
 
Linux TC 单IP上传(下载)限制
下面的是通过脚本实例说明的,分为上传脚本和下载脚本.在变更适当的变量(网口,IP,带宽)后可以直接使用,在使用之前最好参看详细说明。说明中有错误之处可以随时留言,帮鄙人更正,以免造成他人的错误使用.
测试环境:
 
TC限制过程中的注意事项:

1.    分清楚网卡(内网卡与外网卡),这个在指定规则的时候尤为重要;

2.    队列规则,类,过滤器的结合参数使用;

3.    在使用策略的过程中调用iptablesmangle容易出问题,父类与子类同时使用的时候是否关联;

4.    结合iptables转发机制是否正确使用过滤器;

 
IP上传(下载)具体的说明如下所示:                               

一.      上传限制策略(脚本)

#!/bin/bash

#Open-source Stone

#限制内网单个IP带宽,在外网的总出口,我这边外网总出口为eth0,eth0口为下面做上传限制必须使用的端口

###################

#以下规则为限制下载带宽#

###################

#清除Iptables Mangle规则

/sbin/iptables -t mangle -F

 
#清除清除eth0上原有的队列类型

tc qdisc del dev eth0 root 2>/dev/null

 
#创建队列规则添加到eth0,root表示根规则,设置句柄为1,htb default 1表示没有进行分类的数据包都走1:1缺省类

tc qdisc add dev eth0 root handle 1: htb default 1

 
#在父类1:的基础上,创建一个子类1:1,使用令牌桶(htb)队列,保证子类的带宽为1000Mbit(根据实际带宽设置)

tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Mbit

 
#1:1类的基础上,创建一个1:10的子类,使用令牌桶(htb)队列,保证子类的带宽为800kbit,这个子类最大能得到的带宽值为800kbit,(这个就是我们要限制的上传带宽)

#合计下来100K左右

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 800kbit ceil 800kbit

 
#创建队列规则,添加设备eth0,创建一个1:10的子类,句柄为10 采用sfp随即公平队列目的:不被某个连接不停占用带宽,以保证带宽的平均公平使用,10秒后重新配置一次散列算法

tc qdisc add dev eth0 parent 1:10 handle 10 sfq perturb 10

 
#添加一个filter过滤器到eth0,其父分类为11,使用ip协议,优先级为1,句柄为10,要通过NAT这里只能使用FW规则进行流量表示

tc filter add dev eth0 parent 1:1 protocol ip prio 1 handle 10 fw classid  1:10

 
#关联iptablesmangle,其目的ip10.1.10.59(需要限制的ip) 标识为1

/sbin/iptables -A PREROUTING -t mangle -i eth0 -d 10.1.10.59/24 -j MARK --set-mark 1

 
 
.下载限制策略(脚本)

#!/bin/bash

#Open-source Stone

#限制内网单个IP带宽,在内网的总出口,我这边内网总出口为eth1,eth1口是下面做TC 做限制流量限制必须使用的端口

###################

#以下规则为限制下载带宽#

###################

#清除Iptables Mangle规则

/sbin/iptables -t mangle -F

 
#清除eth1上原有的队列类型

tc qdisc del dev eth1 root 2>/dev/null

 
#eth0上创建一个根分类,句柄为1,使用htb(分层令牌桶),r2q是没有默认的root(根分类),使整个网络带宽无限制

tc qdisc add dev eth1 root handle 1: htb r2q 1

 
#在根分类的基础上创建一个11的子分类,设定下载速度为800kbit最高可以是1600kbit(这个值可以根据具体需求进行变更)

#合计下来100K左右

tc class add dev eth1 parent 1: classid 1:1 htb rate 800kbit ceil 1600kbit

 
#父类为1,过滤协议使用ip,优先级为2,采用u32分类器,目的ip 10.1.10.59(需要限制的ip)送入11的队列当中

tc filter add dev eth1 parent 1: protocol ip prio 2 u32 match ip dst 10.1.10.59/24 flowid 1:1

 
#关联iptablesmangle,目的地址为10.1.10.59(需要限制的ip),标识为2

/sbin/iptables -t mangle -A POSTROUTING -d 10.1.10.59/24 -j MARK --set-mark 2

 
 
 
总结:

上述脚本变更具体IP,网卡,限制带宽便可使用,上述只是针对具体IPTC限速使用,不适合某个IP段。

在测试的过程中遇到比较常见的问题如下:

1.     指定网卡端口出错(混淆内外网卡)

2.     子类与父类关联出错(致使规则不生效)

3.     参数涉及多,概念易混淆(往往出现限制效果达不到想要的)

4.     具体的测试脚本存放在10.1.10.35/root下,”down.sh”为限制下载流量,up.sh”为限制上传流量,内网测试的机器是10.1.10.59

5.     通过上传下载工具测试,针对单IP达到预期效果。