【教學】這個 script 可以配合 QoS 做到每個 ip 限流



贊助商連結


dbtsai
2006-07-14, 08:52 PM
這是我拿來作宿舍網路用的,需要另外裝 qos, imq 和 l7-filter plugin, 這樣 kernel 才會支援.

當然您也可以使用 qos plugin, 但因為我啟用 imq1, 所以你的 qos.sh 裏面的
insmod imq numdevs=1 >/dev/null 2>&1 要改成
insmod imq numdevs=2 >/dev/null 2>&1

這樣就可以和原來的模組和平相處

我不常上這個站,有問題可以 mail 給我討論
dbtsai at phys.ncku.edu.tw



###################################################
# Qos scripts with L7-filter Incoming
#
# by 蔡東邦 2006/06/20 台大物理
###################################################

# 定義下傳控制所使用的設備
DEV=imq1
GREENDEV=eth0
REDDEV=eth1

# For each ip
IPUP=70 # 每個 ip 可以分到的上傳速度
IPDN=512 # 每個 ip 可以分到的下傳速度
IPSTART=150 # 要限速的開始 ip
IPEND=155

######################
# 列出目前 QOS 狀態並離開
######################

if [ "$1" = "status" ]
then
echo "############### Download ###################"
echo "[qdisc]"
tc -s qdisc show dev $GREENDEV

echo ""
echo "[class]"
tc -s class show dev $GREENDEV

echo ""
echo "[filter]"
tc -s filter show dev $GREENDEV

echo ""
echo "############### Upload ###################"

echo "[qdisc]"
tc -s qdisc show dev $DEV

echo ""
echo "[class]"
tc -s class show dev $DEV

echo ""
echo "[filter]"
tc -s filter show dev $DEV

echo ""

echo "###########Download iptables##############"
iptables -t mangle -L QOS-IP-IN -v -x 2> /dev/null

echo "############Upload iptables###############"
iptables -t mangle -L QOS-IP-OUT -v -x 2> /dev/null

exit
fi


######################
# stop it and exit
######################

#清除所有舊的規則
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev $GREENDEV root 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $GREENDEV -j QOS-IP-IN 2> /dev/null > /dev/null
iptables -t mangle -D PREROUTING -i $DEV -j QOS-IP-OUT 2> /dev/null > /dev/null
iptables -t mangle -D QOS-IP-OUT -j IMQ --todev 1 >/dev/null 2>&1
iptables -t mangle -F QOS-IP-IN 2> /dev/null > /dev/null
iptables -t mangle -X QOS-IP-IN 2> /dev/null > /dev/null
iptables -t mangle -F QOS-IP-OUT 2> /dev/null > /dev/null
iptables -t mangle -X QOS-IP-OUT 2> /dev/null > /dev/null

ip link set imq1 down 2> /dev/null > /dev/null

if [ "$1" = "stop" ]
then
echo "Qos per IP Stop on $DEV."
exit
fi


######################
# 開始執行 QOS 控制 (預設)
######################

insmod imq numdevs=2 >/dev/null 2>&1
insmod ipt_IMQ >/dev/null 2>&1

ip link set imq1 up

#定義最頂層規則
tc qdisc add dev $GREENDEV root handle 100: hfsc default 10 #上傳
tc qdisc add dev $DEV root handle 200: hfsc default 10 #下載

#定義總頻寬
tc class add dev $GREENDEV parent 100: classid 100:1 hfsc sc rate 100000kbit ul rate 100000kbit
tc class add dev $DEV parent 200: classid 200:1 hfsc sc rate 100000kbit ul rate 100000kbit

#第一組類別 : 100:10 此為預設類別
tc class add dev $GREENDEV parent 100:1 classid 100:10 hfsc sc umax 1500b dmax 50ms rate 200kbit ul rate 200kbit
tc class add dev $DEV parent 200:1 classid 200:10 hfsc sc umax 1500b dmax 50ms rate 10kbit ul rate 50kbit
#第二組類別 : 100:20 此為到 gateway 的類別
tc class add dev $GREENDEV parent 100:1 classid 100:20 hfsc sc umax 1500b dmax 30ms rate 10000kbit ul rate 100000kbit
tc class add dev $DEV parent 200:1 classid 200:20 hfsc sc umax 1500b dmax 30ms rate 10000kbit ul rate 100000kbit

# 對每個 ip 設控制
for (( i=$IPSTART; i<=$IPEND; i++ ))
do
nu=$(($i+1000))
tc class add dev $GREENDEV parent 100:1 classid 100:$nu hfsc sc umax 1500b dmax 50ms rate 50kbit ul rate ${IPDN}kbit
nu2=$(($i+2000))
tc class add dev $DEV parent 200:1 classid 200:$nu2 hfsc sc umax 1500b dmax 50ms rate 5kbit ul rate ${IPUP}kbit
done


tc filter add dev $GREENDEV parent 100: prio 7 protocol ip handle 1510 fw flowid 100:10
tc filter add dev $GREENDEV parent 100: prio 1 protocol ip handle 1520 fw flowid 100:20
tc filter add dev $DEV parent 200: prio 7 protocol ip handle 2510 fw flowid 200:10
tc filter add dev $DEV parent 200: prio 1 protocol ip handle 2520 fw flowid 200:20

# 對每個 ip 設控制
for (( i=$IPSTART; i<=$IPEND; i++ ))
do
nu=$(($i+1000))
tc filter add dev $GREENDEV parent 100: prio 2 protocol ip handle $nu fw flowid 100:$nu
nu2=$(($i+2000))
tc filter add dev $DEV parent 200: prio 2 protocol ip handle $nu2 fw flowid 200:$nu2
done

# 增加 QOS-IN chain 到 mangle table
# 這裡開始過濾單一 ip 限速
iptables -t mangle -N QOS-IP-IN
iptables -t mangle -I POSTROUTING -o $GREENDEV -j QOS-IP-IN

iptables -t mangle -N QOS-IP-OUT
iptables -t mangle -I PREROUTING -i $GREENDEV -j QOS-IP-OUT
iptables -t mangle -A QOS-IP-OUT -j IMQ --todev 1

# 不限制到 gateway 速度 and Ping
iptables -t mangle -A QOS-IP-OUT -d 192.168.1.1 -j MARK --set-mark 2520
iptables -t mangle -A QOS-IP-OUT -d 192.168.1.1 -j RETURN
iptables -t mangle -A QOS-IP-OUT -s 192.168.1.1 -j MARK --set-mark 2520
iptables -t mangle -A QOS-IP-OUT -s 192.168.1.1 -j RETURN
iptables -t mangle -A QOS-IP-IN -s 192.168.1.1 -j MARK --set-mark 1520
iptables -t mangle -A QOS-IP-IN -s 192.168.1.1 -j RETURN
iptables -t mangle -A QOS-IP-IN -d 192.168.1.1 -j MARK --set-mark 1520
iptables -t mangle -A QOS-IP-IN -d 192.168.1.1 -j RETURN

iptables -t mangle -A QOS-IP-IN -p icmp -j MARK --set-mark 1520
iptables -t mangle -A QOS-IP-IN -p icmp -j RETURN
iptables -t mangle -A QOS-IP-OUT -p icmp -j MARK --set-mark 2520
iptables -t mangle -A QOS-IP-OUT -p icmp -j RETURN

# 對每個 ip 設控制
for (( i=$IPSTART; i<=$IPEND; i++ ))
do
nu=$(($i+1000))
iptables -t mangle -A QOS-IP-IN -d 192.168.1.$i -j MARK --set-mark $nu
iptables -t mangle -A QOS-IP-IN -d 192.168.1.$i -j RETURN
nu2=$(($i+2000))
iptables -t mangle -A QOS-IP-OUT -s 192.168.1.$i -j MARK --set-mark $nu2
iptables -t mangle -A QOS-IP-OUT -s 192.168.1.$i -j RETURN
done

贊助商連結


mis339
2006-07-14, 11:44 PM
老是聽說Linux有多強、有多神、有多猛!
不過都只有看到讚賞,沒看到實作!
總算有先進願意分享實作心得了!
謝謝你的分享!更期待你的下次大作和網友們的回饋!

needmaster
2006-07-17, 08:26 PM
GOOD 不錯的技術分享. 加油!!

不輸給酷學員及鳥哥討論區.

提個小小問題建議.
是否可以設計傳參數,單獨設定某一個IP的頻寬.或刪除某一個IP的設定.
但不是重新RELOAD喔,因為已經設定過的IP不用再設定了.

這個功能就是所謂的即時功能,也就是很多討論區找不到的答案.

加油加油

yunjen
2006-08-27, 11:40 PM
老是聽說Linux有多強、有多神、有多猛!
不過都只有看到讚賞,沒看到實作!
總算有先進願意分享實作心得了!
謝謝你的分享!更期待你的下次大作和網友們的回饋!
339大大,這句話真是貼切又實際,Linux還真被一堆傢伙給說神了。只差一個瓶子與拉環,不然都可以當飛行器了。還是這篇文章實際多了,這兩天回老家時再試測,先謝謝版大。