原文地址:http://blog.csdn.net/suiyuan19840208/article/details/8449025
brctl addbr br0
brctl addif br0 eth1
ifconfig br0 192.168.119.7
ifconfig eth0 10.10.106.230
echo 1 > /proc/sys/net/ipv4/ip_forward
在实际的项目中,由于需要控制下载和上传的带宽,为特定的用户提供可靠的带宽保证。
上传时使用的是WAN口即用来连接外网的,在我们的设备上面有wifi和LAN接口,分别提供内部的俩种上网方式。
因此在设备上面创建虚拟设备br0,
brctl addbr br0
brctl addif br0 eth1
brctl addif br0 ath0
ifconfig br0 192.168.119.7
ifconfig eth0 10.10.106.230
echo 1 > /proc/sys/net/ipv4/ip_forward
br0上面设置如下命令:
tc qdisc del dev br0 root
tc qdisc add dev br0 root handle 302:0 htb default 43
tc class add dev br0 parent 302:0 classid 302:1 htb rate 4096Kbit ceil 4096Kbit
tc class add dev br0 parent 302:1 classid 302:42 htb rate 512Kbit ceil 4096Kbit prio 0
tc filter add dev br0 parent 302:0 prio 42 u32 match u32 0xaabb 0x0000ffff at -16 match u32 0xccdd0106 0xffffffff at -12 flowid 302:42
tc qdisc add dev br0 parent 302:42 handle 42: sfq perturb 10
tc class add dev br0 parent 302:1 classid 302:43 htb rate 512Kbit ceil 4096Kbit prio 100
tc qdisc add dev br0 parent 302:43 handle 43: sfq perturb 10
eth0上面设置如下命令:
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 301:0 htb default 42
tc class add dev eth0 parent 301:0 classid 301:1 htb rate 512Kbit ceil 512Kbit
tc class add dev eth0 parent 301:1 classid 301:9 htb rate 100Kbit ceil 512Kbit prio 0
tc filter add dev eth0 parent 301:0 protocol ip prio 3 u32 match ip src 192.168.119.6 flowid 301:9
tc qdisc add dev eth0 parent 301:9 handle 9: sfq perturb 1
tc class add dev eth0 parent 301:1 classid 301:42 htb rate 100Kbit ceil 512Kbit prio 4
tc qdisc add dev eth0 parent 301:42 handle 42: sfq perturb 10
tc -s class show dev eth0
查看设置相关的命令如下:
tc -s class show dev eth0
tc qdisc ls dev eth0
tc class ls dev eth0
tc -s -d filter show dev eth0
#简单显示指定设备的队列状况
tc qdisc ls dev eth0
#详细显示指定设备的队列状况
tc –s qdisc ls dev eth0
#简单显示指定设备的分类状况
tc class ls dev eth0
#详细显示指定设备的分类状况
tc –s class ls dev eth0
#显示过滤器的状况
tc –s filter ls dev eth0
tc -s -d filter show dev eth0
使用TC命令流量控制的时候,创建的qdisc,class,filter的基本顺序如下:
其基本使用步骤为:
1) 针对网络物理设备(如以太网卡eth0)绑定一个CBQ队列
2) 在该队列上建立分类
3) 为每一分类建立一个基于路由的过滤器
4) 最后与过滤器相配合,建立特定的路由表
#将一个cbq队列绑定到网络物理设备eth0上,其编号为1:0;网络物理设备eth0的实际带宽为10Mbit,包的平均大小为1000字节;包间隔发送单元的大小为8字节,最小传输包大小为64字节。
/sbin/tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64
#创建根分类1:1;分配带宽为10Mbit,优先级别为1。该队列的最大可用带宽为10Mbit,实际分配的带宽为10Mbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为1,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为1Mbit。
/sbin/tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 weight 1Mbit
#创建分类1:2,其父分类为1:1,分配带宽为64Kbit,优先级别为8。该队列的最大可用带宽为10Mbit,实际分配的带宽为64Kbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为8,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为100Kbit,且不可借用未使用带宽。
/sbin/tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 100Kbit bounded
#创建分类1:3,其父分类为1:1,分配带宽为64Kbit,优先级别为9。该队列的最大可用带宽为10Mbit,实际分配的带宽为64Kbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为9,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为100Kbit,且不可借用未使用带宽。
/sbin/tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 9 avpkt 1000 cell 8 weight 100Kbit bounded
#在分类底下,创建队列,使用sfq随即公平队列
/sbin/tc qdisc add dev eth0 parent 1:2 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth0 parent 1:3 sfq quantum 1514b perturb 15
#限制各ip地址的下载带宽,使用u32过滤器,对目的地址进行分类,对应已经创建的队列
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.66 flowid
*******************************类似的TC命令如下*********************************************
ebtables -t broute -D BROUTING -i eth0 -j mark --mark-set 301 --mark-target CONTINUE
ebtables -t broute -D BROUTING -i eth0 -s aa:bb:cc:dd:01:06 -j mark --mark-set 991 --mark-target CONTINUE
ebtables -t broute -F
ebtables -t broute -A BROUTING -i eth0 -j mark --mark-set 301 --mark-target CONTINUE
ebtables -t broute -A BROUTING -i eth0 -s aa:bb:cc:dd:01:06 -j mark --mark-set 991 --mark-target CONTINUE
上面是通过ebtables对特定的数据包mark上标签。
tc qdisc del dev br0 root
tc qdisc add dev br0 root handle 302:0 htb default 43
tc class add dev br0 parent 302:0 classid 302:1 htb rate 4096Kbit ceil 4096Kbit
tc class add dev br0 parent 302:1 classid 302:42 htb rate 2048Kbit ceil 4096Kbit prio 0
tc filter add dev br0 parent 302:0 prio 42 u32 match u32 0xaabb 0x0000ffff at -16 match u32 0xccdd0106 0xffffffff at -12 flowid 302:42
tc qdisc add dev br0 parent 302:42 handle 42: sfq perturb 10
tc class add dev br0 parent 302:1 classid 302:43 htb rate 2048Kbit ceil 4096Kbit prio 100
tc qdisc add dev br0 parent 302:43 handle 43: sfq perturb 10
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 301:0 htb default 42
tc class add dev eth0 parent 301:0 classid 301:1 htb rate 512Kbit ceil 512Kbi
tc class add dev eth0 parent 301:1 classid 301:9 htb rate 100Kbit ceil 400Kbit prio 0
tc filter add dev eth0 parent 301:1 prio 9 handle 991 fw flowid 301:9
tc qdisc add dev eth0 parent 301:9 handle 9: sfq perturb 10
tc class add dev eth0 parent 301:1 classid 301:42 htb rate 200Kbit ceil 512Kbit prio 0
tc qdisc add dev eth0 parent 301:42 handle 42: sfq perturb 10
----------------------------------------------------------------------------
tc qdisc del dev eth1 root
tc qdisc add dev eth1 root handle 301:0 htb default 42
tc class add dev eth1 parent 301:0 classid 301:1 htb rate 8Mbit ceil 8Mbit
tc class add dev eth1 parent 301:1 classid 301:43 htb rate 3Mbit ceil 8Mbit prio 0 burst 30k
tc class add dev eth1 parent 301:1 classid 301:9 htb rate 4Mbit ceil 8Mbit prio 4 burst 30k
tc filter add dev eth1 parent 301:0 protocol ip prio 3 u32 match ip dst 192.168.119.111 flowid 301:9
tc filter add dev eth1 parent 301:0 protocol ip prio 3 u32 match ip dst 192.168.119.12 flowid 301:43
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 301:0 htb default 42
tc class add dev eth0 parent 301:0 classid 301:1 htb rate 8Mbit ceil 8Mbit
tc class add dev eth0 parent 301:1 classid 301:43 htb rate 3Mbit ceil 8Mbit prio 0 burst 30k
tc class add dev eth0 parent 301:1 classid 301:9 htb rate 4Mbit ceil 8Mbit prio 4 burst 30k
tc filter add dev eth0 parent 301:0 protocol ip prio 3 u32 match ip src 192.168.119.111 flowid 301:9
tc filter a
################################类似的TC命令如下############################################
#set the env vlaue
DOWNLINK_Mbit=4
let DOWNLINK=$DOWNLINK_Mbit*1024
UPLINK=512
#UP MIN
UP_WCDMA_MIN=160
UP_WLAN_MIN=20
UP_LAN_MIN=20
#DOWN MIN
DOWN_WCDMA_MIN=350
DOWN_WLAN_MIN=100
DOWN_LAN_MIN=200
#UP MAX
UP_WCDMA_MAX=$UPLINK
UP_WLAN_MAX=$UPLINK
UP_LAN_MAX=$UPLINK
#DOWN MAX
DOWN_WCDMA_MAX=$DOWNLINK
DOWN_WLAN_MAX=$DOWNLINK
DOWN_LAN_MAX=$DOWNLINK
#priority
PRIO_WCDMA=1
PRIO_WLAN=2
PRIO_LAN=2
#uplink interface #PPP0
DEV_UP=eth0
#download interface
DEV_DOWN=eth1
#mpc8313 $DEV_UP IP:
IP0=192.168.1.1
#PHONE IP
IP_WCDMA=192.168.1.2
#WLAN IP
IP_WLAN=192.168.1.3
#LAN IP
IP_LAN=192.168.1.4
#clean existing down and up qdisc
echo "cleaning the old qdisc rule ......."
iptables -t mangle -F
tc qdisc del dev $DEV_UP root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_DOWN root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_DOWN ingress 2> /dev/null > /dev/null
echo "start setting the Qos......."
#setting the uplink
tc qdisc add dev $DEV_UP root handle 1:0 htb default 30 r2q 20
tc class add dev $DEV_UP parent 1:0 classid 1:1 htb rate ${UPLINK}Kbit
tc class add dev $DEV_UP parent 1:1 classid 1:10 htb rate ${UP_WCDMA_MIN}Kbit ceil ${UP_WCDMA_MAX}Kbit prio $PRIO_WCDMA burst 15k quantum 20000
tc class add dev $DEV_UP parent 1:1 classid 1:20 htb rate ${UP_WLAN_MIN}Kbit ceil ${UP_WLAN_MAX}Kbit prio $PRIO_WLAN burst 15k quantum 20000
tc class add dev $DEV_UP parent 1:1 classid 1:30 htb rate ${UP_LAN_MIN}Kbit ceil ${UP_LAN_MAX}Kbit prio $PRIO_LAN burst 15k quantum 20000
tc qdisc add dev $DEV_UP parent 1:10 handle 10: sfq perturb 5
tc qdisc add dev $DEV_UP parent 1:20 handle 20: sfq perturb 5
tc qdisc add dev $DEV_UP parent 1:30 handle 30: sfq perturb 5
#set the uplink route filter
iptables -t mangle -A POSTROUTING -o $DEV_UP -s $IP_WCDMA -j MARK --set-mark 1
iptables -t mangle -A POSTROUTING -o $DEV_UP -s $IP_WLAN -j MARK --set-mark 2
iptables -t mangle -A POSTROUTING -o $DEV_UP -s $IP_LAN -j MARK --set-mark 3
tc filter add dev $DEV_UP parent 1:0 protocol ip prio 10 handle 1 fw classid 1:10
tc filter add dev $DEV_UP parent 1:0 protocol ip prio 10 handle 2 fw classid 1:20
tc filter add dev $DEV_UP parent 1:0 protocol ip prio 10 handle 3 fw classid 1:30
#set the downlink
tc qdisc add dev $DEV_DOWN root handle 2: htb default 30
tc class add dev $DEV_DOWN parent 2: classid 2:1 htb rate ${DOWNLINK}Kbit
tc class add dev $DEV_DOWN parent 2:1 classid 2:10 htb rate ${DOWN_WCDMA_MIN}Kbit ceil ${DOWN_WCDMA_MAX}Kbit prio $PRIO_WCDMA burst 30k
tc class add dev $DEV_DOWN parent 2:1 classid 2:20 htb rate ${DOWN_WLAN_MIN}Kbit ceil ${DOWN_WLAN_MAX}Kbit prio $PRIO_WLAN quantum 20000 burst 30k
tc class add dev $DEV_DOWN parent 2:1 classid 2:30 htb rate ${DOWN_LAN_MIN}Kbit ceil ${DOWN_LAN_MAX}Kbit prio $PRIO_LAN quantum 20000 burst 30k
tc qdisc add dev $DEV_DOWN parent 2:10 handle 10: sfq perturb 5
tc qdisc add dev $DEV_DOWN parent 2:20 handle 20: sfq perturb 5
tc qdisc add dev $DEV_DOWN parent 2:30 handle 30: sfq perturb 5
#set the downlink route filter
tc filter add dev $DEV_DOWN parent 2:0 protocol ip prio 10 u32 match ip dst $IP_WCDMA flowid 2:10
tc filter add dev $DEV_DOWN parent 2:0 protocol ip prio 10 u32 match ip dst $IP_WLAN flowid 2:20
tc filter add dev $DEV_DOWN parent 2:0 protocol ip prio 10 u32 match ip dst $IP_LAN flowid 2:30
sleep 1s
echo "Finish!The QOS has started!"