2009年10月22日 星期四

使用tc進行限流(QOS)

系統使用CentOS 5.1
使用內建的tc指令進行限流

1.編輯tc規則
◎此例是與iptables規則檔放在一起,也可另外存放執行

vim /etc/iptables.rule

#設定網卡參數

WAN_IF="eth0"

LAN_IF="eth1"

#下載限流規則(針對內部網卡)
##清除規則
/sbin/tc qdisc del dev $LAN_IF root 2>/dev/null
##設定預設群組
/sbin/tc qdisc add dev $LAN_IF root handle 10: htb default 30
##設定群組總流量,rate保障頻寬、ceil限制頻寬
/sbin/tc class add dev $LAN_IF parent 10: classid 10:1 htb rate 256kbps ceil 256kbps
##設定各群組限流,prio為分配頻寬的優先順序
/sbin/tc class add dev $LAN_IF parent 10:1 classid 10:10 htb rate 64kbps ceil 256kbps prio 1
/sbin/tc class add dev $LAN_IF parent 10:1 classid 10:20 htb rate 64kbps ceil 128kbps prio 1
/sbin/tc class add dev $LAN_IF parent 10:1 classid 10:30 htb rate 32kbps ceil 64kbps prio 2
/sbin/tc qdisc add dev $LAN_IF parent 10:10 handle 101: pfifo
/sbin/tc qdisc add dev $LAN_IF parent 10:20 handle 102: pfifo
/sbin/tc qdisc add dev $LAN_IF parent 10:30 handle 103: pfifo
/sbin/tc filter add dev $LAN_IF parent 10: protocol ip prio 100 handle 10 fw classid 10:10
/sbin/tc filter add dev $LAN_IF parent 10: protocol ip prio 100 handle 20 fw classid 10:20
/sbin/tc filter add dev $LAN_IF parent 10: protocol ip prio 100 handle 30 fw classid 10:30

#上傳限流規則(針對外部網卡)
/sbin/tc qdisc del dev $WAN_IF root 2>/dev/null
/sbin/tc qdisc add dev $WAN_IF root handle 10: htb default 30
/sbin/tc class add dev $WAN_IF parent 10: classid 10:1 htb rate 256kbps ceil 256kbps
/sbin/tc class add dev $WAN_IF parent 10:1 classid 10:10 htb rate 64kbps ceil 256kbps prio 1
/sbin/tc class add dev $WAN_IF parent 10:1 classid 10:20 htb rate 64kbps ceil 128kbps prio 1
/sbin/tc class add dev $WAN_IF parent 10:1 classid 10:30 htb rate 32kbps ceil 64kbps prio 2
/sbin/tc qdisc add dev $WAN_IF parent 10:10 handle 101: pfifo
/sbin/tc qdisc add dev $WAN_IF parent 10:20 handle 102: pfifo
/sbin/tc qdisc add dev $WAN_IF parent 10:30 handle 103: pfifo
/sbin/tc filter add dev $WAN_IF parent 10: protocol ip prio 100 handle 10 fw classid 10:10
/sbin/tc filter add dev $WAN_IF parent 10: protocol ip prio 100 handle 20 fw classid 10:20
/sbin/tc filter add dev $WAN_IF parent 10: protocol ip prio 100 handle 30 fw classid 10:30

2.設定iptables規則,針對IP將封包加上標記
◎如果美各IP需分別設定上傳跟下載的規則,用戶多時會造成規則暴增,所以我改用陣列方式執行規則

#建立QOSa陣列,將分組10用戶IP加入
QOSa=(192.168.1.1 192.168.1.2 192.168.1.3)

#針對QOSa陣列,標記為群組10
for IPa in ${QOSa[@]}; do
/sbin/iptables -t mangle -A POSTROUTING -d $IPa -j MARK --set-mark 10
/sbin/iptables -t mangle -A PREROUTING -s $IPa -j MARK --set-mark 10
done

#建立QOSa陣列,將分組20用戶IP加入
QOSb=(192.168.1.10 192.168.1.11 192.168.1.12)

#針對QOSb陣列,標記為群組20
for IPb in ${QOSb[@]}; do
/sbin/iptables -t mangle -A POSTROUTING -d $IPb -j MARK --set-mark 20
/sbin/iptables -t mangle -A PREROUTING -s $IPb -j MARK --set-mark 20
done

3.執行規則
如果規則都是放在iptables.rule的話,只要執行iptables.rule即可
sh /etc/iptables.rule
或是執行自建的規則檔

0 意見:

##EasyReadMore##