下面代码仅用于双网卡PC做Server时(类似于路由器),做上传下载限制,只用于单独限制流量,暂时未对数据流量类型进行分别限制。
- 100:0 -- 100:1 -- 100:10 (作为默认队列)
- -- 100:20 (作为指定的队列) -- MARK 106
- 扩展
- 100:0 -- 100:1 -- 100:10 (作为默认队列)
- -- 100:20 (针对SKYPY的队列) -- MARK 102
- -- 100:30 (针对FTP的队列) -- MARK 103
- -- 100:40 (针对HTTP的队列) -- MARK 104
流量控制规则说明:
TC qdisc add dev eth1 root handle
100: htb default 10
TC class add dev eth1 parent
100: classid
100:1 htb rate 2Mbit burst 15k
TC class add dev eth1 parent
100:1 classid 100:10 htb rate 512kbit burst 15k
TC class add dev eth1 parent
100:1 classid 100:20 htb rate 1mbit ceil 1mbit burst 15k
TC qdisc add dev eth1 parent 100:10 sfq quantum 1514b perturb 15
TC qdisc add dev eth1 parent 100:20 sfq quantum 1514b perturb 15
TC filter add dev eth1 protocol ip parent 100:0 prio 1 u32 match ip dst 192.168.1.0/24 flowid 100:20
这里对eth1进行设定, 即限制流向eth1的流量的速度。
第一句添加句柄为100:0 的QDISC ,限速算法为HTB,并设置未指定数据流的QDISC为100:10(default 10)
第二句基于100:0添加class,ID为100:1 的总速度为2Mbps
三四两句是基于100:1添加子类并设置速度
五六两句是分别给100:10 和100:20设定队列算法为SFQ。
第七句添加对目的IP地址为192.168.1.0/24范围的封包的过滤器,并使其走100:20这个流队列。即流向eth1且目的IP地址在192.168.1.0/24的范围内的流量的速度为1mbps.若第七句为
TC filter add dev eth1 protocol ip parent 100:0 prio 1 handle
106 fw flowid 100:20
则是添加流向eth1并被mark上206的数据包走100:20这个队列。
使用iptables指定要打上206标识的数据。
iptables -t mangle -I POSTROUTING -o eth1 -d 192.168.1.0/24 -j MARK --set-mark
106 iptables -t mangle -A POSTROUTING -o eth1 -d 192.168.1.0/24 -j RETURN
说明iptables三个主要table
1. filter 是过滤的table,允许或禁止符合某些条件的封包
2. nat 是进行NAT功能试着的table, 如SNAT,DNAT等等
3. mangle 是给特定的服务打上标记,主要用于QOS.
三个表的查看可以使用命令: iptables -t table_name -L -v.
============================================================================
扩展:
如果需要对不同类型的数据进行分流并限速,我们可以在100:1下面建立更多的子类(class),类似于100:10, 100:20,分别指定速度。
然后为每一个子类建立一个QDISC.并使用filter对MARK指定的数据进行分流
再由iptables -t mangle来设定对应的MARK流
实例见
http://blog.chinaunix.net/uid-22490342-id-2125670.html============================================================================
将下列内容保存为文件 do_limit
执行的时候使用命令
"./do_limit LAN_INTERFACE WAN_INTERFACE LAN_NETWORK"
eg: ./do_limit eth1 eth3 192.168.1.0/24
#!/bin/sh
TC="/bin/tc"
LAN_IFACE=$1
INET_IFACE=$2
INTERNAL_LAN=$3
start(){
#################### Qos rule on LAN_IFACE for download ########################
$TC qdisc add dev $LAN_IFACE root handle 100: htb default 10
$TC class add dev $LAN_IFACE parent 100: classid 100:1 htb rate 2Mbit burst 15k
$TC class add dev $LAN_IFACE parent 100:1 classid 100:10 htb rate 1mbit burst 15k
$TC class add dev $LAN_IFACE parent 100:1 classid 100:20 htb rate 1mbit ceil 1mbit burst 15k
$TC qdisc add dev $LAN_IFACE parent 100:10 sfq quantum 1514b perturb 15
$TC qdisc add dev $LAN_IFACE parent 100:20 sfq quantum 1514b perturb 15
$TC filter add dev $LAN_IFACE protocol ip parent 100:0 prio 1 u32 match ip dst $INTERNAL_LAN flowid 100:20
echo "qos rule on $LAN_IFACE start ...........ok!"
#################### Qos rule on INET_IFACE for upload ########################
$TC qdisc add dev $INET_IFACE root handle 200: htb default 10
$TC class add dev $INET_IFACE parent 200: classid 200:1 htb rate 1mbit burst 15k
$TC class add dev $INET_IFACE parent 200:1 classid 200:10 htb rate 512kbit burst 15k
$TC class add dev $INET_IFACE parent 200:1 classid 200:20 htb rate 256kbit ceil 256kbit burst 15k
$TC qdisc add dev $INET_IFACE parent 200:10 sfq quantum 1514b perturb 15
$TC qdisc add dev $INET_IFACE parent 200:20 sfq quantum 1514b perturb 15
$TC filter add dev $INET_IFACE protocol ip parent 200:0 prio 1 handle 206 fw flowid 200:20
iptables -t mangle -I POSTROUTING -o $INET_IFACE -s $INTERNAL_LAN -j MARK --set-mark 206
iptables -t mangle -A POSTROUTING -o $INET_IFACE -s $INTERNAL_LAN -j RETURN
echo "qos rule on atm1 start ...........ok!"
}
stop(){
$TC qdisc del dev $LAN_IFACE root 2>/dev/null
$TC qdisc del dev $INET_IFACE root 2>/dev/null
iptables -t mangle -D POSTROUTING -o ppp1 -s 192.168.182.0/24 -j MARK --set-mark 206 2>/dev/null
iptables -t mangle -D POSTROUTING -o ppp1 -s 192.168.182.0/24 -j RETURN 2>/dev/null
}
status(){
echo "show qdisc ............ "
echo ""
echo "cmd: tc -d -s qdisc "
echo ""
$TC -d -s qdisc
echo "========================================="
echo ""
echo "" echo "show filter ............ "
echo ""
echo "cmd: tc -d -s filter ls dev $LAN_IFACE"
echo ""
$TC -d -s filter ls dev $LAN_IFACE
echo "----------------------------------------"
echo "cmd: tc -d -s filter ls dev $INET_IFACE"
echo ""
$TC -d -s filter ls dev $INET_IFACE
echo "========================================="
echo ""
echo "" echo "show class ............ "
echo ""
echo "cmd: tc -d -s class ls dev $LAN_IFACE"
echo ""
$TC -d -s class ls dev $LAN_IFACE
echo "----------------------------------------"
echo "cmd: tc -d -s class ls dev $INET_IFACE"
echo ""
$TC -d -s class ls dev $INET_IFACE
echo "========================================="
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
show)
status
;;
*)
echo $"Usage:$0 {start|stop|restart|show}"
exit 1
esac
阅读(800) | 评论(0) | 转发(0) |