2009年4月9日星期四

iptables+tc+imq限制网络流量(三)

0 评论

我们把环境都准备好了 现在开始测试吧,比如现在我的网络中192.168.1.211这个ip经常是用p2p等下载导致整个网络丢包慢,我现要对这个用户设置上传保证带宽为3KB/S 上传最大带宽为5KB/S,设置这个用户下载保证带宽为50KB/S 上传最大带宽为60KB/S。
先看下192.168.1.211的流量情况

192.168.1.211下载流量



192.168.1.211上传流量



编辑脚本


vi qoseth0
#!/bin/bash
ifc_zew="eth0" <-- 内网网卡
max_upload="512kbit" <-- 公司最大的上传带宽
upload_user="30kbit"
upload_serv="70kbit"
max_download="6000kbit" <-- 公司最大的下载带宽
download_user="127kbit"
download_serv="127kbit"

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

echo ""
echo "[filter]"
tc -s filter show dev imq1
echo ""
echo "############### Upload ###################"
echo "[qdisc]"
tc -s qdisc show dev imq0

echo ""
echo "[class]"
tc -s class show dev imq0
echo ""
echo "[filter]"
tc -s filter show dev imq0

echo ""

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

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

exit
fi

tc qdisc del dev imq0 root 2> /dev/null > /dev/null
tc qdisc del dev imq1 root 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o eth0 -m connmark --mark 1000 -j QOS-IP-OUT 2> /dev/null > /dev/null
iptables -t mangle -D PREROUTING -i eth0 -m connmark --mark 1000 -j QOS-IP-IN 2> /dev/null > /dev/null
iptables -t mangle -D QOS-IP-OUT -j IMQ --todev 1 >/dev/null 2>&1
iptables -t mangle -D QOS-IP-IN -j IMQ --todev 0 >/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 imq0 down 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 imq0 and imq1."
exit
fi

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

将所有对外工作的打上1000的标记
iptables -A FORWARD -i ppp0 -j CONNMARK --set-mark 1000

ip link set imq0 up

tc qdisc add dev imq0 root handle 1: htb < --定义最顶层的队列规则
tc class add dev imq0 parent 1: classid 1:1 htb rate $max_upload ceil $max_upload 定义根类别1:1
tc class add dev imq0 parent 1:1 classid 1:10 htb rate 488kbit ceil $max_upload quantum 1514 定义叶类别 1:10
tc class add dev imq0 parent 1:1 classid 1:20 htb rate $upload_user ceil $max_upload quantum 1514 定义叶类别 1:20
tc class add dev imq0 parent 1:1 classid 1:30 htb rate $upload_user ceil $max_upload quantum 1514 定义叶类别 1:30
tc class add dev imq0 parent 1:1 classid 1:40 htb rate 24kbit ceil 40kbit quantum 1514 定义叶类别 1:40

定义各类别分别打上不同的标记
tc filter add dev imq0 parent 1: protocol ip prio 1 handle 201 fw flowid 1:10
tc filter add dev imq0 parent 1: protocol ip prio 1 handle 202 fw flowid 1:20
tc filter add dev imq0 parent 1: protocol ip prio 1 handle 203 fw flowid 1:30
tc filter add dev imq0 parent 1: protocol ip prio 1 handle 204 fw flowid 1:40
定义各叶类别的队列规则
tc qdisc add dev imq0 parent 1:10 handle 10 sfq perturb 10
tc qdisc add dev imq0 parent 1:20 handle 20 sfq perturb 10
tc qdisc add dev imq0 parent 1:30 handle 30 sfq perturb 10
tc qdisc add dev imq0 parent 1:40 handle 40 sfq perturb 10

iptables -t mangle -N QOS-IP-IN <-- 新增一条叫QOS-IP-IN的链
将符合要求的并打上标记1000的归为QOS-IP-IN链处理
iptables -t mangle -I PREROUTING -i eth0 -m connmark --mark 1000 -j QOS-IP-IN

将QOS-IP-IN链交由imq0管理
iptables -t mangle -A QOS-IP-IN -j IMQ --todev 0
来源是192.168.1.211机器 属于QOS-IP-IN链的封包打上204标记
iptables -t mangle -A QOS-IP-IN -s 192.168.1.211/32 -j MARK --set-mark 204

ip link set imq1 up
tc qdisc add dev imq1 root handle 1: htb
tc class add dev imq1 parent 1: classid 1:1 htb rate $max_download ceil $max_download
tc class add dev imq1 parent 1:1 classid 1:10 htb rate 3200kbit ceil 6000kbit burst 5k quantum 1514
tc class add dev imq1 parent 1:1 classid 1:20 htb rate $download_user ceil $max_download burst 5k quantum 1514
tc class add dev imq1 parent 1:1 classid 1:30 htb rate $download_user ceil $max_download burst 5k quantum 1514
tc class add dev imq1 parent 1:1 classid 1:40 htb rate 400kbit ceil 480kbit burst 5k quantum 1514
tc filter add dev imq1 parent 1: protocol ip prio 1 handle 101 fw flowid 1:10
tc filter add dev imq1 parent 1: protocol ip prio 1 handle 102 fw flowid 1:20
tc filter add dev imq1 parent 1: protocol ip prio 1 handle 103 fw flowid 1:30
tc filter add dev imq1 parent 1: protocol ip prio 1 handle 104 fw flowid 1:40

tc qdisc add dev imq1 parent 1:10 handle 10 sfq perturb 10
tc qdisc add dev imq1 parent 1:20 handle 20 sfq perturb 10
tc qdisc add dev imq1 parent 1:30 handle 30 sfq perturb 10
tc qdisc add dev imq1 parent 1:40 handle 40 sfq perturb 10

iptables -t mangle -N QOS-IP-OUT
iptables -t mangle -I POSTROUTING -o eth0 -m connmark --mark 1000 -j QOS-IP-OUT

iptables -t mangle -A QOS-IP-OUT -j IMQ --todev 1
iptables -t mangle -A QOS-IP-OUT -d 192.168.1.211/32 -j MARK --set-mark 104

启动脚本 ./qoseth0 start 在192.168.1.211机器上登录外网的一台ftp下载如图

上传如图

符合我们设置的要求

再来我们看看192.168.1.211对nat主机192.168.1.1的下载和上传会不会也被限制住呢?
下载如图


上传如图
可以看出来对nat主机的存储速度就不会限制了 符合我们的要求。


再来测试下使用迅雷下载



再关闭控制 ./qoseth0 stop
再用迅雷下载


可以看到迅雷下载也是可以限制了