tc、iptables实现流量控制

tc、iptables实现流量控制,也可用u32实现,拙劣小记备忘,望高手多多指正…

该linux主机作为局域网网关,eth0外围,eth1内网,要求对局域网内的指定主机(10.100——10.254)实现上传和下载流量控制,局域网内部的相互通信不限制,如果要对100以内的IP限制,请对sub_class子类ID进行补全,以免类ID错乱,【比如用:printf “%03d” 2】,ip和优先级左侧不可以用0补全。

:tc只能对向外发送的数据进行控制。

#!/bin/bash
#
#
WAN_DEV=eth0
LAN_DEV=eth1
ACK_MARK=9
#
#
# 清除mangle标记规则,如果iptables中只有此限速脚本用到iptables mangle标记,可启用此项,否则,请酌情使用。
iptables -t mangle -F
#
# ##########   download limit  ################
#
#
# ########## remove all rules on lan_dev ###
#
# qdisc:queue discipline简写
#
tc qdisc del dev $LAN_DEV root 2>/dev/null
#
#
# 1,创建根队列
# htb:分层令牌桶,HTB(Hierarchical Token Bucket)
# r2q,是指没有default的root,使整个网络的带宽没有限制
tc qdisc add dev $LAN_DEV root handle 2:0 htb r2q 1
#
# 2,为队列创建主干类,并设置带宽
tc class add dev $LAN_DEV parent 2:0 classid 2:1 htb rate 100Mbit ceil 100Mbit prio 0
#
#
#
####  创建SYN响应优先类  ######
#tc class add dev $LAN_DEV parent 2:1 classid 2:2 htb rate 2mbit ceil 2mbit prio 5 burst 100kbit
#tc qdisc add dev $LAN_DEV parent 2:2 handle 222:0 sfq perturb 4
#tc filter add dev $LAN_DEV parent 2:0 protocol ip prio 1 handle $ACK_MARK fw classid 2:2

##### 此处ack响应标记必须放在前边   ########
#iptables -t mangle -A POSTROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -o $LAN_DEV -j MARK --set-mark $ACK_MARK
#iptables -t mangle -A POSTROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -o $LAN_DEV -j RETURN
#
#
#
#
#
####  create function   #####
function DOWN_FUNC()
{

# 3,创建第一级子类
tc class add dev $LAN_DEV parent 2:1 classid 2:1$DOWN_SUB_CLASS_ID htb rate 1Mbit ceil 2Mbit prio 10 burst 100Kbit
# 对子类,创建随机公平调度队列,perturd重新计算时间间隔
tc qdisc add dev $LAN_DEV parent 2:1$DOWN_SUB_CLASS_ID handle $DOWN_SFQ sfq perturb 4
#
#
#
# 4,设置filter
tc filter add dev $LAN_DEV parent 2:0 protocol ip prio $DOWN_SUB_CLASS_ID handle $DOWN_MARK fw classid 2:1$DOWN_SUB_CLASS_ID
#

# 5,用iptables设置mangle标记
# 创建mangle标记规则
iptables -t mangle -A POSTROUTING ! -s 10.10.10.0/24 -d $LAN_IP -o $LAN_DEV -j MARK --set-mark $DOWN_MARK
iptables -t mangle -A POSTROUTING ! -s 10.10.10.0/24 -d $LAN_IP -o $LAN_DEV -j RETURN

}
#
#
#
### DIP:Download IP #######
#
for (( DIP=100;DIP <= 254;DIP++ ))
do
  LAN_IP="10.10.10.$DIP"
  DOWN_SUB_CLASS_ID=$DIP
  DOWN_MARK="2$DIP"
  DOWN_SFQ="2$DIP:0"
  DOWN_FUNC
done
#
#
#
##############  upload limit  ###############
#
# ########## remove all rules on wan_dev ###
# qdisc:queue discipline简写
tc qdisc del dev $WAN_DEV root 2>/dev/null
#
# 1,创建根队列
# htb:分层令牌桶,HTB(Hierarchical Token Bucket)
# r2q,是指没有default的root,使整个网络的带宽没有限制
tc qdisc add dev $WAN_DEV root handle 1:0 htb r2q 1
#
# 2,为队列创建主干类,并设置带宽
tc class add dev $WAN_DEV parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit prio 0
#
#
function  UP_FUNC()
{

# 3,创建第一级子类
tc class add dev $WAN_DEV parent 1:1 classid 1:1$UP_SUB_CLASS_ID htb rate 2Mbit ceil 5Mbit prio 10 burst 1Mbit
# 对子类,创建随机公平调度队列,perturd重新计算时间间隔
tc qdisc add dev $WAN_DEV parent 1:1$UP_SUB_CLASS_ID handle $UP_SFQ sfq perturb 4
#
# 4,设置filter
tc filter add dev $WAN_DEV parent 1:0 protocol ip prio $UP_SUB_CLASS_ID handle $UP_MARK fw classid 1:1$UP_SUB_CLASS_ID
#
# 5,用iptables设置mangle标记
#iptables -t mangle -A POSTROUTING -s $LAN_IP ! -d 10.10.10.0/24 -o $WAN_DEV -j MARK --set-mark $UP_MARK
#iptables -t mangle -A POSTROUTING -s $LAN_IP ! -d 10.10.10.0/24 -o $WAN_DEV -j RETURN

iptables -t mangle -A POSTROUTING -s $LAN_IP -o $WAN_DEV -j MARK --set-mark $UP_MARK
iptables -t mangle -A POSTROUTING -s $LAN_IP -o $WAN_DEV -j RETURN
}
#
#
######  UIP:Upload IP  ######
#
for (( UIP=100;UIP <= 254;UIP++ ))
do
  LAN_IP="10.10.10.$UIP"
  UP_SUB_CLASS_ID=$UIP
  UP_MARK="1$UIP"
  UP_SFQ="1$UIP:0"
  UP_FUNC
done

原创内容,转载请注明出处! http://www.enunix.com/129

参考:

https://segmentfault.com/a/1190000000666869

http://www.tuicool.com/articles/7zYzey

http://blog.sina.com.cn/s/blog_79ecd9b00101q894.html

2

评论

还没有任何评论,你来说两句吧

发表评论

京ICP备16055031-1号 意见反馈:webadmin@enunix.com