在如今的网络界,也许TC知道的人并不多了,这篇文章做留恋吧。

以前研究TC时记录下的讲解与配置文件。

eth1:192.168.1.1,内网口 
业务需求:保证正常的网页浏览,FTP,SMTP,POP3,对其它的所有应用加以限制,以免影响正常业务的使用。 
1、让交互数据包保持较低的延迟时间,也就是说上载或下载文件不会打扰SSH/telnet等。 
2、上载或下载期间有合理的速率用于网页浏览,即使http属于一种大量数据传输,也不应受其它传输影响太大 
3、对FTP-data限速,不会占用所有带宽 
4、对SMTP,pop3限速 
5、对未分类的进行限制,以免影响 
6、保证上载不会影响下载,上载数据流会影响下载的速率,这是相当普遍的现象。 
7、对每个IP的下载速率进行限制 
8、取得空闲带宽的优先级别如:交互数据,FTP-data,smtp,pop3;网页浏览,其它业务优先级别最低

二、方法: [/color6]
1、(eth0)使用HTB分成五类:如下图 
+---------+ 
| root 1: | 
+---------+ 

+--------------------------------+ 
| class 1:1 | 
+--------------------------------+ 
| | | | | | 
+----+ +----+ +----+ +----+ +----+ 
|1:11| |1:12| |1:13| |1:14| |1:15| 
+----+ +----+ +----+ +----+ +----+ 
classid 1:11: 
1)这个类优先权最高。拥有最低的延迟并最先取得空闲带宽,因此要设置这个类的峰值速率。 
ssh、telnet、dns、quake3、irc,ftp控制,smtp命令和带有SYN标记的数据包都应属于这一类。 
2)为了保证上行数据流不会伤害下行流,我们还要把ACK数据包排在队列前面。这就是当发生大批量数据流的时 
候,双向传输均受到严重影响的原因。因为下行数据的ACK必须同上行流进行竞争,并在处理过程中被延迟。 
3)限制上载速率:把上载速率限制在比可用带宽稍小一些的位置上,于是你的MODEM中就不会形成队列了。 
4)排除了下行队列(除了偶尔的突发),保证交互数据包永远排在上行队列的最前面。 
classid 1:12:大批量传输的类。主要用来处理浏览网页的数据包,目标端口80,8080,443,8443的包。 
classid 1:13:此类是拥用最大吞吐TOS位的数据包。用于处理目的地址为xxxx的FTP-data。 
classid 
1:14:这里是邮件(SMTP、pop3)相关和TOS要求最小成本的数据流。用于处理目的地址为xxxx的smtp,pop3服务 
classid 1:15:最后是经过NAT进行大批量传输的机器,以保证他们不会妨碍正常服务。 
2、(eth0)限制下载速率:。丢掉那些太快到来的数据包,不让他们导致TCP/IP的速率低于我们期望的速率。因 
为我们不希望轻易地丢弃数据包,所以我们要配置“burst”来容纳突发传输。 
3、(eth1)限制下载速率:对每一个IP限制最高下载速率 
三、 [/color6]1、队列处理 
#脚本:用384kbps作为峰值速率,调整CEIL为上行速率的75%。 
#Set the following values to somewhat lesss than your actual download and uplink speed. 
DOWNLINK=2000 
UPLINK=384 
#清空已有的队列,并把出错消息清空 
#clean existing down and uplink qdiscs,put the errors to /dev/null 
tc qdisc del dev eth0 root 2> /dev/null > /dev/null 
tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null 
tc qdisc del dev eth1 root 2> /dev/null > /dev/null 
########################################uplink########################################### 
#建立HTB父类,默认数据由1:15这个类通走 
#install root HTB,point default traffic to 1:15: 
tc qdisc add dev eth0 root handle 1: htb default 15 
#设定uplink的最大速率。 
#shape everything at $UPLINK speed -this prevents huge queues in your DSL modem which destroy 
latency: 
# main class 
tc class add dev eth0 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit 
#分类,1:11为最高优先级别,stmp,pop3,ftp-data次之,网页浏览再次之。并对每个类限制了最高速率。 
#high prio class 1:11: 
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 128kbit ceil 128kbit prio 0 
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 128kbit ceil ${UPLINK}kbit prio 2 
tc class add dev eth0 parent 1:1 classid 1:13 htb rate 32kbit ceil ${UPLINK}kbit prio 1 
tc class add dev eth0 parent 1:1 classid 1:14 htb rate 32kbit ceil ${UPLINK}kbit prio 1 
#bulk & default class 1:15 -gets slightly less traffic,and a lower priority: 
tc class add dev eth0 parent 1:1 classid 1:15 htb rate 16kbit ceil ${UPLINK}kbit prio 3 
可以在类下面再附加上另一个队列规定,以保证带宽的公平使用: 
#bost get Stochastic Fairness: 
tc qdisc add dev eth0 parent 1:12 handle 12: sfq perturb 10 
tc qdisc add dev eth0 parent 1:13 handle 13: sfq perturb 10 
tc qdisc add dev eth0 parent 1:14 handle 14: sfq perturb 10 
tc qdisc add dev eth0 parent 1:15 handle 15: sfq perturb 10 
2、分类: 
上面的队列处理中等于把所有发出的数据包都送给了1:15 
(tc qdisc add dev eth0 root handle 1: htb default 15)。 
现在应该需要告诉机器那些数据包走哪条路。设置过滤器以便用iptables对数据包进行分类。 
可以通过RETURN方法避免遍历所有的规则。 
#TOS Mininum Delay (ssh,telnet) in 1:11: 
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11 
#80,8080,443 in 1:12 
tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12 
#ftp-data in 1:13 
tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13 
#smtp,pop3 in 1:14

tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:14 

tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:15 
这样数据包会有一个特定的FWMARK标记值(hanlde x fw),表明它应该送给哪个类( classid x)。

附上一个配置脚本:

###/!sbin/bash
############ TC control [HTB] #########
#varible setting
eth=eth0
S_NET=192.168.0.1
#ISP distribule IP
INTER_IP=1.2.3.4
############SNAT#######################
#iptables -t nat -F
#iptables -t nat -I POSTROUTING -s $S_NET -o $eth -j SNAT --to-source $INTER_IP
#iptables -t nat -A POSTROUTING -s $S_NET -o $eth -j MASQUERADE
#clean existing down and uplink qdiscs,put the errors to /dev/null
tc qdisc del dev eth0 root 2> /dev/null > /dev/null
tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null
tc qdisc del dev eth1 root 2> /dev/null > /dev/null
#root class
tc qdisc add dev $eth root handle 1: htb default 10
#classid
tc class add dev $eth parent 1:  classid 1:1  htb rate 2Mbit ceil 3Mbit
tc class add dev $eth parent 1:1 classid 1:11 htb rate 80Kbit ceil 100Kbit prio 1
tc class add dev $eth parent 1:1 classid 1:12 htb rate 500Kbit ceil 550Kbit prio 2
tc class add dev $eth parent 1:1 classid 1:13 htb rate 400Kbit ceil 450Kbit prio 3
tc class add dev $eth parent 1:1 classid 1:14 htb rate 400Kbit ceil 450Kbit prio 4
#bost get Stochastic Fairness:
tc qdisc add dev $eth parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev $eth parent 1:13 handle 13: sfq perturb 10
tc qdisc add dev $eth parent 1:14 handle 14: sfq perturb 10
#TOS Mininum Delay (ssh,telnet) in 1:11:
tc filter add dev $eth parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
#80,8080,443 in 1:12
tc filter add dev $eth parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
#ftp-data in 1:13
tc filter add dev $eth parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
#smtp,pop3 in 1:14
tc filter add dev $eth parent 1:0 protocol ip prio 4 handle 4 fw classid 1:14
###

############IPTABLES handle############
#clear mangle rules
iptables -t mangle -F
# ssh,telnet
iptables -t mangle -A PREROUTING -s $S_NET  -p tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s $S_NET  -p tcp --dport 23 -j MARK --set-mark 1
#80,8080,443
iptables -t mangle -A PREROUTING -s $S_NET  -p tcp --syn --dport 80  -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s $S_NET  -p tcp --syn --dport 8080  -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s $S_NET  -p tcp --syn --dport 443  -j MARK --set-mark 2
#ftp-data
iptables -t mangle -A PREROUTING -s $S_NET  -p tcp --dport 21 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -s $S_NET  -p tcp --dport 22 -j MARK --set-mark 3
#smtp,pop3
iptables -t mangle -A PREROUTING -s $S_NET  -p tcp --dport 25  -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -s $S_NET  -p tcp --dport 110 -j MARK --set-mark 4
###########SHOW TC MANGLE##############
tc qdisc show dev $eth
tc class show dev $eth
tc filter show dev $eth
iptables -t mangle -L PREROUTING
##END
echo "[+] setting TC(htb) successful"

[置顶] Linux 流量控制的更多相关文章

  1. [置顶] Linux信号相关笔记

    最近又温习了一遍Linux中的信号知识,发现有很多东西以前没有注意到,就通过这篇博客记录一下,巩固一下知识点. 一,信号基础: 信号是什么?为了回答这个问题,首先要从异常说起,这里的异常不是指c++/ ...

  2. [置顶] linux常用命令大全

    SSH 密令控制台 user/pwd 一:停止tomcat 1,cd .. 进入根目录 2,cd home/ 3,ll 4,cd bin/ 进入tomcat bin目录 5,ll 6,ps -ef | ...

  3. [置顶] linux 解压版安装

    1:下载mysql解压版包去官网下载www.mysq.com 下载.下载linux通用版本就好了 2.基本配置 首先,我们准备好Linux环境,我们使用CentOS 5.8进行试验安装.第一步,我们需 ...

  4. [置顶] linux第二天,g++,gcc,ps,cat,sort,grep,kill,less,ls -l ,

    33.less sample.txt 分页输出文件内容到屏幕 34./search content (搜索内容) 可以将文档中有searchcontent 的行输出到屏幕 35.grep scienc ...

  5. [置顶] linux内核启动1-启动参数(启动参数的获取和处理,分析setup_arch)

    最近公司要求调试一个内核,启动时有问题,所以就花了一点时间看看内核启动. 看的过程中总结了一点东西,希望可以帮助大家调试内核. 当我开始看的时候,第一件事是从网上搜集资料,不看不知道,一看吓一跳!牛人 ...

  6. [置顶] Linux下的截图小工具

    Linux下的截图工具scrot 基于命令行 先下载:scrot apt-get install scrot 对该工具的操作: 分为以下几个部分 1.抓取整个桌面 scrot pic.jpg 2.抓取 ...

  7. [置顶] linux内核启动2-setup_arch中的内存初始化(目前分析高端内存)

    上一篇微博留下了这几个函数,现在我们来分析它们         sanity_check_meminfo();         arm_memblock_init(&meminfo, mdes ...

  8. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  9. [置顶] linux常用命令手册

    前言:整理了一份linux常用命令手册,与大家分享.这是一些比较常用的命令. 我已经整理成一份PDF带书签的手册,可以到CSDN免费下载. 下载地址:http://download.csdn.net/ ...

随机推荐

  1. PHPExcel导出excel

    如果导出中文时出现乱码,可以尝试将字符串转换成gb2312,例如下面就把$yourStr从utf-8转换成了gb2312: $yourStr = mb_convert_encoding("g ...

  2. 复制档案或目录 linux cp命令详解

    cp (复制档案或目录) [root@linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[root@linux ~]# cp [options ...

  3. Python抓取双色球数据

    数据来源网站http://baidu.lecai.com/lottery/draw/list/50?d=2013-01-01 HTML解析器http://pythonhosted.org/pyquer ...

  4. JSP中使用的模式——JSP+JavaBean

    模式二:JSP+Servlet+JavaBean 链接地址:http://wxmimperio.coding.io/?p=189 JSP中两种模式的总结 链接地址:http://wxmimperio. ...

  5. "Invalid bound statement (not found): com.sitech.admin.dao.TbOpenAbilityInfoDao.findAbilityReadyUp"mybatis配置文件bug

    问题描述: 通常在正常启动某项工程后操作某个功能时抛出的bug: org.apache.ibatis.binding.BindingException: Invalid bound statement ...

  6. hbase 架构

    由图可以client并不直接和master交互,而是与zookeeper交互,所以master挂掉,依然会对外提供读写服务, 但master挂掉后无法提供数据迁移服务. 所以说 hbase无单点故障, ...

  7. matlab的cell数组

    matlab的cell数组 元胞数组: 元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵.组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每 ...

  8. dispatch_semaphore

    dispatch_semaphore 信号量基于计数器的一种多线程同步机制.在多个线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题. dispatch_queue_t queue = di ...

  9. ios6,ios7,ios7.1下设置UISearchbar的背景色

    ios系统升级到7.1后,原来在7.0下显示正常的UISearchbar现在又出现问题了.究其原因,是由于UISearchbar的subview又做修改了. float version = [[[ U ...

  10. BZOJ2342: [Shoi2011]双倍回文

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 923  Solved: 317[Submit][Status ...