iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j RETURN
##提高ssh数据包的优先权:放在第1类,要知道ssh是交互式的和重要的,不容待慢哦
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j RETURN
#
##smtp邮件:放在第4类,因为有时有人发送很大的邮件,为避免它堵塞,让它跑4道吧
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j RETURN
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j MARK --set-mark 8
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j RETURN
## name-domain server:放在第1类,这样连接带有域名的连接才能快速找到对应的地址,提高速度的一法
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j RETURN
#
## http:放在第3类,是最常用的,最多人用的,
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN
##pop邮件:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j RETURN
## https:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j RETURN
## Microsoft-SQL-Server:放在第2类,我这里认为较重要,一定要保证速度的和优先的.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j RETURN
## voip用, 提高,语音通道要保持高速,才不会断续.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j RETURN
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j RETURN
## vpn ,用作voip的,也要走高速路,才不会断续.
iptables -t mangle -A PREROUTING -p udp -m udp --dport 7707 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 7707 -j RETURN
## 放在第1类,因为我觉得它在我心中很重要,优先.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j RETURN
## WWW caching service:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j RETURN
##提高本地数据包的优先权:放在第1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j RETURN
iptables -t mangle -A OUTPUT -p icmp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p icmp -j RETURN
#本地small packets (probably just ACKs)
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j RETURN
#(4). 向PREROUTING中添加完mangle规则后,用这条规则结束PREROUTING表:
##也就是说前面没有打过标记的数据包将交给1:24处理。
##实际上是不必要的,因为1:24是缺省类,但仍然打上标记是为了保持整个设置的协调一致,而且这样
#还能看到规则的包计数。
iptables -t mangle -A PREROUTING -i $DEV -j MARK --set-mark 6
echo "标记完毕! mangle mark done!"
}
#-----------------------------------------------------------------------------------------------------
#8.取消mangle标记用的自定义函数
stop_mangle() {
echo -n "停止数据标记 stop mangle table......"
( iptables -t mangle -F && echo "ok." ) || echo "error."
}
#9.取消队列用的
stop_routing() {
echo -n "(删除所有队列......)"
( tc qdisc del dev $DEV root && tc qdisc del dev $DEV ingress && echo "ok.删除成功!" ) || echo "error."
}
#10.显示状态
status() {
echo "1.show qdisc $DEV (显示上行队列):----------------------------------------------"
tc -s qdisc show dev $DEV
echo "2.show class $DEV (显示上行分类):----------------------------------------------"
tc class show dev $DEV
echo "3. tc -s class show dev $DEV (显示上行队列和分类流量详细信息):------------------"
tc -s class show dev $DEV
echo "说明:设置总队列上行带宽 $UPLINK k."
echo "1. classid 1:11 ssh、dns、和带有SYN标记的数据包。这是最高优先权的类包并最先类 "
echo "2. classid 1:12 重要数据,这是较高优先权的类。"
echo "3. classid 1:21 web,pop 服务 "
echo "4. classid 1:22 smtp服务 "
echo "5. classid 1:23 ftp-data服务 "
echo "6. classid 1:24 其他服务 "
}
#11.显示帮助
usage() {
echo "使用方法(usage): `basename $0` [start | stop | restart | status | mangle ]"
echo "参数作用:"
echo "start 开始流量控制"
echo "stop 停止流量控制"
echo "restart 重启流量控制"
echo "status 显示队列流量"
echo "mangle 显示mark标记"
}
#----------------------------------------------------------------------------------------------
#12. 下面是脚本运行参数的选择的控制
#
kernel=`eval kernelversion`
case "$kernel" in
2.2)
echo " (!) Error: won't do anything with 2.2.x 不支持内核2.2.x"
exit 1
;;
2.4|2.6)
case "$1" in
start)
( start_routing && start_mangle && echo "开始流量控制! TC started!" ) || echo "error."
exit 0
;;
stop)
( stop_routing && stop_mangle && echo "停止流量控制! TC stopped!" ) || echo "error."
exit 0
;;
restart)
stop_routing
stop_mangle
start_routing
start_mangle
echo "流量控制规则重新装载!"
;;
status)
status
;;
mangle)
echo "iptables -t mangle -L (显示目前mangle表表标记详细):"
iptables -t mangle -nL
;;
*) usage
exit 1
;;
esac
;;
*)
echo " (!) Error: Unknown kernel version. check it !"
exit 1
;;
esac
#三.结束语
#1. 如果要支持htb,请到相关网站下载有关补丁.
#此脚本是参考http://lartc.org 和 http://luxik.cdi.cz/~devik/qos/htb/ 和http://www.docum.org/docum.org
#和听取chinaunix.net的C++版主JohnBull的"Linux的高级路由和流量控制北京沙龙讲座录音
#及关于<>,经过不断调试得出的总结结果,在此感谢所有作出贡献的人.
#2. iptables,在http://www.iptables.org/ .iptables v1.2.7a 和tc是Red hat linux 9.0下自带的版本.
#3. 此脚本已经在Red Hat Linux 9.0内核2.4.20上,内网约70台频繁上网机器的环境下运行数月,事实证明良好.
#4. 如果ADSL带宽不同或有变,调节相关rate参数及ceil参数即可.
#5. 还有,如果结合IMQ,IMQ(Intermediate queueing device,中介队列设备)把上行和下行都进行分类控制
#就更理想了,但要支持IMQ,就要重新编译内核.关于补丁和更多的文档请参阅imq网站http://www.linuximq.net/
#6. 欢迎交流yahoo messegsender: kindgeorge#yahoo.com此脚本将有待不断完善.
#7. 除了ADSL外,还可以进行其他宽带的控制.
#8. 如果看谁老是在网内搞鬼,经常占满带宽,就把它列为黑名单,并派到"无所谓的数据通道",以防无所谓的人
#在阻碍正务: iptables -t mangle -I PREROUTING 1 -s 192.168.xxx.xxx -j MARK --set-mark 6
# iptables -t mangle -I PREROUTING 2 -s 192.168.xxx.xxx -j RETURN
#9.使用方法: 整篇文档拷贝后,chmod +x tc2 ,
#执行脚本: ./tc2 start (或其他参数start | stop | restart | status | mangle )即可
#如果想每次在ppp启动时就启动,则在/etc/ppp/ip-up 文件里面加上一句: /路径/tc2 restart
echo "script done!"
exit 1
#end----------------------------------------------------------------------------------------
结合web界面的流量监测就更完美了.