Linux做nat服务 tc限制流量
- 格式:doc
- 大小:34.00 KB
- 文档页数:2
# !/bin/shtouch /var/lock/subsys/localecho 1 > /proc/sys/net/ipv4/ip_forwardroute add default gw 10.0.0.0 (这是加入电信网关,如果你已设了不用这条)DOWNLOAD=640Kbit (640/8 =80K ,我这里限制下载最高速度只能80K)UPLOAD=640Kbit (640/8 =80K,上传速度也限制在80K)INET=192.168.0. (设置网段,根据你的情况填)IPS=1 (这个意思是从192.168.0.1开始)IPE=200 (我这设置是从IP为192.168.0.1-200这个网段限速,根据自已的需要改)ServerIP=253 (网关IP)IDEV=eth0ODEV=eth1/sbin/tc qdisc del dev $IDEV root handle 10:/sbin/tc qdisc del dev $ODEV root handle 20:/sbin/tc qdisc add dev $IDEV root handle 10: cbq bandwidth 100Mbitavpkt 1000/sbin/tc qdisc add dev $ODEV root handle 20: cbqbandwidth 1Mbit avpkt 1000/sbin/tc class add dev $IDEV parent10:0 classid 10:1 cbq bandwidth 100Mbit rate 100Mbit allot1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000/sbin/tc class add dev $ODEV parent 20:0 classid 20:1cbq bandwidth 1Mbit rate 1Mbit allot 1514 weitht 10Kbit prio 8 maxburst 20 avpkt 1000COUNTER=$IPSwhile [ $COUNTER -le $IPE ]do/sbin/tc class add dev $IDEV parent 10:1 classid 10:1$COUNTER cbq banwid th 100Mbit rate$DOWNLOAD allot 1514 weight 20Kbit prio 5 maxburst 20 avpkt 1000 boun ded/sbin/tc qdisc add dev $IDEV parent 10:1$COUNTER sfq quantum 1514b pert urb15/sbin/tc filter add dev $IDEV parent 10:0 protocol ip prio 100 u32 match ipd st $INET$COUNTER flowid 10:1$COUNTERCOUNTER=` expr $COUNTER + 1 `doneiptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -J MASQUERAD EHTB官方网站:http://luxik.cdi.cz/~devik/qos/htb/LINUX HTB队列规定用户指南HTB Linux queuing discipline manual - user guideMartinDeveraakadevik(************)Manual: devik and Don CohenLast updated: 5.5.2002译者:龚关*******************1. Introduction 介绍2. Link sharing 链路共享3. Sharing hierarchy 共享层次4. Rate ceiling 速率限度5. Burst 突发6. Priorizing bandwidth share 带宽分配优先7. Understanding statistics 查看统计8. Making, debugging and sending error reports 开发,调试和错误报告1. Introduction 介绍HTB 意味着是一个更好理解更容易掌握的可以快速替换LINUX CBQ 队列规定的队列, CBQ和HTB都可以帮助你限制你的链路上的出口带宽;他们允许你把一条物理链路模拟成几条更慢的链路或者是把发出的不同类型的流量模拟成不同的连接,在他们的实际应用中, 你必须指定怎么分配物理链路给各种不同的带宽应用并且如何判断每种不同的应用的数据包是怎么样被发送的;这篇文章将告诉你怎么使用HTB . 这里有很多的例子和分析图以及一些特殊问题的讨论. 这个HTB的发布版本已经有更多的升级, 详细情况请看HTB 的主页.请先查阅: TC 工具(不仅仅是HTB ) 有关速率的单位换算: kbps = kilo bytes kbit = kilo bits2. Link sharing 链路共享案例: 我们有两不同的用户A和B, 都通过网卡eth0 连接到internet ,我们想分配60 kbps 的带宽给B 和40 kbps的带宽给A, 接下来我们想对A用户的带宽再做一个分配, 给30 kbps的带宽给WWW服务, 10 kbps的带宽给其他用途; 任何没有用的带宽可以分配和其他需要带宽类(在分配的总带宽允许的范围内的部分)HTB 可以保障提供给每个类带宽的数量是它所需求的最小需求或者等于分配给它的数量.当一个类需要的带宽少于分配的带宽时,剩余的带宽被分配给其他需要服务的类.注: 这里这种情况被称为”借用”剩余带宽, 我们以后将用这个术语, 但无论如何,好像很不好因为这个”借用”是没有义务偿还的.上面所提到的不同类型的流量在HTB里表现为类, 上面是一个简单的分布图.我们来看看所用到的命令:tc qdisc add dev eth0 root handle 1: htb default 12这条命令分配了HTB队列规定给eth0 并且指定了一个名称为(handle" 1句柄1: , 这个名称用于标识它下面的子类, default 12 的意思是没有被分类的流量被分配到类1:12注: 一般(不仅仅是HTB其他所有TC的队列和类),句柄都被写成X:Y 这里X是队列规定的整数型的标识符,Y是这个队列规定的类的整数型标识符,队列规定的句柄标识符的Y必须是0,而句柄的类的标识符的数值必须是一个非零的整数. "1:" 等同于"1:0".tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps第一行在队列1:下创建了一个根类1:1,并且定义了HTB队列规定作为这个根类的父类,一个根类可以像队列规定下其他类一样允许它的子类相互借用带宽, 但是根类之间不能相互借用带宽,我们可以在HTB队列下直接创建三个类,但是其中一个类的剩余带宽不能够借用给其他需要的类,在这种情况下我们想允许带宽借用,所以我们为根类创建扩展类并且让这些类在根类的范围内发送数据,我们定义了下面的三行, ceil参数我们在以后将讲述.注: 有时候人们会问我为什么他们必须重复dev eth0 描述在他们已经定义并使用了handle 或者parent ,原因是本地接口比如eth0 和eth1他们各自都可能会有类的句柄表示为1:1.我们还必须描述那些数据包属于那个类, 有关详细内容请查看有关TC 过虑器的相关文档. 命令看起来像下面这样:tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.4 match ip dport 80 0xffff flowid 1:10tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.4 flowid 1:11 (We identify A by its IP address which we imagine here to be 1.2.3.4.)(我们根据它的IP地址进行分类识别,这里我们假设为1.2.3.4)注:U32过虑器有一个非文档化的设计会导致在你使用U32分类器”tc filter show”命令时会显示出不同的prio的值.你可能会注意到我们没有为类1:12创建过虑, 很明显,这个例子中被用作缺省, 就是没有被上面两条分类规则定义的任何数据包(任何原地址非1.2.3.4)将被发送到类1:12现在我们可以很方便的为队列规定分配子类, 如果没有指定缺省是pfifotc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10这是我们所需要的全部命令, 让我们来看看有什么事情发如果我们给每个类发送90kbps的数据然后停止发送其中一个类在某一时刻.在图的底部标有"0:90k". 标签中央水平位置(在9附近.同时标有红色1)现实了数据流量随时间的变化情况.冒号之前是类的标识符;(0表示类1:10, 1 表示类1:11, 2 表示类1:12)冒号之后是新的速率在那个时间有标注. 比如类0在时间0的时候速率改变为90K ;在时间3为0K (0= 0k) ,在时间6时返回90K;最初所有的类共同流量为90kb. 以后以被指定更高的速度传输, 每一个类都被限制在其被指定的速率, 在时间3的时候我们停止传送类0的数据, 分配给类0的速率被分配给其他两个类.如图所示1至6内的类1和类2 (很难看出类1的增长因为它只有4kbps.) 同样在时间9时类1流量停止它的带宽被分配到另外两个类(类0的增长同样很难看出), 在时间15类2被分配给类0和类1, 在时间18 类1和类2 同时停止,所以类0得到它所需要的所有90 kbps.带宽.现在是个接触quantums概念的很好的时机.实际上当一些想借用带宽的类服务于其他竞争的类之前相互给定的一定数量的字节, 这个数量被称为quantums . 你应该明白如果一些竞争的类是可以从它的父类那里得到所需的quantums; 精确的指定quantums的数量尽可能的小并其大于MTU是很重要的.一般你不需要手工指定一个quantums因为HTB会根据计算选择数值.计算类的quantum相对于用r2q参数分配; 它的缺省的值是10因为典型的MTU是1500,缺省值很适合速率为15 kBps (120 kbit).当你创建队列最小的速率指定r2q 1, 比较适合速率为12 kbit;如果你需要手工指定quantum 当你添加或者更改类,如果预想计算的值是不适合的你可以清除日志里的警告. 当你用命令行指定了quantum 类的r2q将被忽略.如果A和B是不同的客户这个解决方案看起来很好, 但是如果A 付了40kbps 他可能更希望他不用的WWW的带宽可以用在自己的其他服务上而并不想分享个B. 这种需求是可以通过HTB的类的层次得到解决的.3. Sharing hierarchy 共享层次前面章节的问题在这一节里通过类层次结构来得到解决, 用户A 可以很清楚的表达自己的类; 回到前面我们说过提供给每个类带宽的数量是它所需求的最小需求或者等于分配给它的数量. 这样可以用在其他非父类的HTB类里. 我们叫他们为子类, 对于HTB的父类来说我们称为内部类, 规则是使用服务的总量最小而且总量等于他的子类所请求的总和.这里我们分配40kbps给用户A ,这就意味着如果A的需求少于分配的WWW带宽, 那么剩下的将被用来服务于A的其他应用.(如果有需要), 至少总和为40kbps.注:数据包的分类规则可以分配给内部节点, 也可以有分配其他的过虑器给内部节点,最终应该到达子类或者是特定的类class 1:0 ;父类提供的速率应该是它所有子类的总和.现在的命令如下:tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:2 htb rate 40kbps ceil 100kbpstc class add dev eth0 parent 1:2 classid 1:10 htb rate 30kbps ceil 100kbpstc class add dev eth0 parent 1:2 classid 1:11 htb rate 10kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps我们现在来看看流量图显示的我们用层次结构的解决方案. 当A的WWW流量停止, 它所分配的带宽被二次分配到它的其他流量上, 所以A的总带宽仍然为40kbps.如果A的总请求带宽小于40kbps.那么剩余的流量将被分配给B.4. Rate ceiling 速率限度参数ceil指定了一个类可以用的最大带宽, 用来限制类可以借用多少带宽.缺省的ceil是和速率一样.(也是我们为什么必须在上面的例子里指定它用来显示借用带宽的上限)我们改变前面例子里的类1:2 (A) 和1:11 (A's other) ceil 100kbps 分别为ceil 60kbps 和ceil20kbps.和前面的图显示不同, 在时间3 (WWW 流量停止) 因为A 的其他流量限制在20kbps. 所以用户A得到仅仅总带宽20kbps没有用的20kbps被分配给了B .第二个不同是在时间15时B停止, 因为没有ceil, 所有它的带宽被给了A , 但是现在A 仅仅允许使用60kbps,所以剩余的40kbps 闲置.这个特性对于ISP是很有用的, 因为他们一般限制被服务的用户的总量即使其他用户没有请求服务.(ISPS 很想用户付更多的钱得到更好的服务) ,注根类是不允许被借用的, 所以没有指定ceil注: ceil的数值应该至少和它所在的类的速率一样高, 也就是说ceil应该至少和它的任何一个子类一样高5. Burst 突发网络硬件只能在一个时间发送一个包这仅仅取决于一个硬件的速率. 链路共享软件可以利用这个能力动态产生多个连接运行在不同的速度. 所以速率和ceil不是一个即时度量只是一个在一个时间里发送包的平均值. 实际的情况是怎样使一个流量很小的类在某个时间类以最大的速率提供给其他类. burst 和cburst 参数控制多少数据可以以硬件最大的速度不费力的发送给需要的其他类.如果cburst 小于一个理论上的数据包他形成的突发不会超过ceil 速率, 同样的方法TBF的最高速率也是这样.你可能会问, 为什么需要bursts . 因为它可以很容易的提高向应速度在一个很拥挤的链路上. 比如WWW 流量是突发的. 你访问主页. 突发的获得并阅读. 在空闲的时间burst将再"charge"一次.注: burst 和cburst至少要和其子类的值一样大.如图, 接着前一章的例子,我改变burst给红和黄(agency A)类20 kb但cburst仍然为缺省(cca 2 kb).绿色的峰出现在时间13由于在SMTP类设置了burst;A类在限度下自从时间9并且聚集了20 kb的突发流量,峰高于20 kbps(被ceil参数限制因为它的cburst接近包的尺寸),聪明的读者可能会问为什么在时间7处没有红色和黄色的峰;因为黄色已经接近ceil所以没有空间用于突发;有一个不必要的人为的低谷在时间4, 那是因为我忘记添加burst 给根连接到(1:1)类;峰从时间1并且当时间4蓝色的类想借用黄色的速率被拒绝并且自己补偿;局限性: 当你在计算机上用一个小的时间片操作一个高速链路你需要为所有的类设置很小的burst 和cburst . 在i386系统上是10ms 在Alphas.系统是1ms ;最小的burst可以max_rate*timer 被估算出来; 所以10Mbit的速率在i386 系统上burst为12kb如果你设置太小的burst 你可能会得到比你设置更小的速率, 后来TC 工具在你没有指定burst.时将估计并且设置一个最小且可能的burst.6. Priorizing bandwidth share 带宽分配优先带宽分配的优先级包括两个方面, 首先它影响到子类剩余带宽的分配, 到现在我们已经知道剩余带宽按照速率比例来分配, 我以第三节的配置为例(没有设置ceiling 和bursts的层次结构)除了SMTP (green)的优先权改为0(更高) 其他所以类都改为1从视图我们可以看到类得到了所有剩余带宽, 规则是优先权越高的类越优先得到剩余带宽., 但必须是在rate 和ceil得到保障的前提下.另一个方面的问题,包的延时, 在以太网里的延时度量是很困难的,但有一个简单的办法.我们添加一个带宽小于100 kbps的HTB类.第二个类(我们测量的)作为一个子类,然后我们模仿成更慢并且延时比较大的链路.出于简单的原因, 我们用两个有关联的类;# qdisc for delay simulationtc qdisc add dev eth0 root handle 100: htbtc class add dev eth0 parent 100: classid 100:1 htb rate 90kbps# real measured qdisctc qdisc add dev eth0 parent 100:1 handle 1: htbAC="tc class add dev eth0 parent"$AC 1: classid 1:1 htb rate 100kbps$AC 1:2 classid 1:10 htb rate 50kbps ceil 100kbps prio 1$AC 1:2 classid 1:11 htb rate 50kbps ceil 100kbps prio 1tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 2tc qdisc add dev eth0 parent 1:11 handle 21: pfifo limit 2注: 另一个HTB的子类和同一个HTB内的子类是不一样的, 因为HTB的类发送数据和硬件发送能力一样的, 所以在限度以内的数据发送仅仅取决于设备速度而不是上级类; HTB下的HTB类输出是模拟一个逻辑硬件; (大的延时)假定速率同为50 kbps的两个类在时间3S 时执行命令如下:tc class change dev eth0 parent 1:2 classid 1:10 htb rate 50kbps ceil 100kbps burst 2k prio 0你可以看到WWW的延时趋近于0而SMTP的延时增大. 当你的优先级别更高而其他类的延时就更大.稍后在7S 时,模仿WWW以60 kbps和SMTP 以40 kbps.发送数据.你可以看到另一个有趣的现象.当WWW越限之后HTB首先是限制带宽.什么样的类需要优先权? 一般需要延时低的类; 比如视频和音频流; (你必须使用正确的流量速率防止流量相互淹没. ) 或者是交互性(TELNET .SSH )流量正常突发并且不影响其他的流量.提高ICMP的优先权可以得到一个很好的PING的延时返回, 但这是一个假相, 因为从技术角度来说在测试联通性时这种情况并不是你想要的.7. Understanding statistics 查看统计TC 工具允许你对LINUX队列规定进行统计; 不幸的是统计结果作者没有解释所以你不能经常用到他们; 这里我尽力解释来帮助理解HTB的状态; 首先是HTB的整体状态. 下面是第三节里的一个片段;# tc -s -d qdisc show dev eth0qdisc pfifo 22: limit 5pSent 0 bytes 0 pkts (dropped 0, overlimits 0)qdisc pfifo 21: limit 5pSent 2891500 bytes 5783 pkts (dropped 820, overlimits 0)qdisc pfifo 20: limit 5pSent 1760000 bytes 3520 pkts (dropped 3320, overlimits 0)qdisc htb 1: r2q 10 default 1 direct_packets_stat 0Sent 4651500 bytes 9303 pkts (dropped 4140, overlimits 34251)前三个规定是HTB的子队列, 我们跳过他们因为PFIFO的状态是自我解释的. Overlimit告诉你有多少次队列延时了数据包; direct_packets_stat 告诉你有多少包直接通过队列被送出; 其他的解释是自我解释型的, 让我们看看类的状态;tc -s -d class show dev eth0class htb 1:1 root prio 0 rate 800Kbit ceil 800Kbit burst 2Kb/8 mpu 0bcburst 2Kb/8 mpu 0b quantum 10240 level 3Sent 5914000 bytes 11828 pkts (dropped 0, overlimits 0)rate 70196bps 141ppslended: 6872 borrowed: 0 giants: 0class htb 1:2 parent 1:1 prio 0 rate 320Kbit ceil 4000Kbit burst 2Kb/8 mpu 0bcburst 2Kb/8 mpu 0b quantum 4096 level 2Sent 5914000 bytes 11828 pkts (dropped 0, overlimits 0)rate 70196bps 141ppslended: 1017 borrowed: 6872 giants: 0class htb 1:10 parent 1:2 leaf 20: prio 1 rate 224Kbit ceil 800Kbit burst 2Kb/8 mpu 0b cburst 2Kb/8 mpu 0b quantum 2867 level 0Sent 2269000 bytes 4538 pkts (dropped 4400, overlimits 3635rate 14635bps 29ppslended: 2939 borrowed: 1599 giants: 0我删除了类1:11 和1:12 以便输出更简单扼要; 可以看到有我们设置的参数, 还有level 和DRR quantum 信息;overlimits 显示了有多少次类要求被发送数据而被rate/ceil 限制不能发送;(现在显示的仅仅是子类)rate, pps 告诉你通过类实际的速率(10秒的平均值) 他和你选择的速率是一样的.Lended 这个类借出的包; borrowed 则是被借入的数据包从父类;Giants 显示了大于TC命令设置的MTU的数据包的数量;HTB和其协调工作,否则将会影响速率的精确性,, 添加MTU 到你的TC命令里(缺省是1600 bytes)8. Making, debugging and sending error reports开发, 调试和发送错误报告如果你拥有kernel 2.4.20或者更新的内核你就不必要打补丁, 但你需要更新TC 工具从HTB 3.6 包里得到并且使用它;为了和老内核工作协调, 下载内核源码, 用patch -p1 -i htb3_2.X.X.diff装载补丁程序, 然后用make menuconfig;make bzImage; 编译内核时不要忘了选中QoS 和HTB.我将非常感激如果你认为在使用发现了HTB错误. 我需要详细的输出; 在队列规定出现异常行为时请在tc qdisc add .... htb.后面加上参数debug 3333333 ; 它将会在系统日志里记录一些调试记录,为此你可能需要在你的/etc/syslog.conf. 文件里加上kern.debug-/var/log/debug这一行. 通过压缩包电邮给我,并且付上问题描述和时间.名称:tc - 显示/维护流量控制设置命令格式:tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ]tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ filtertype specific parameters ] flowid flow-idtc [-s | -d ] qdisc show [ dev DEV ]tc [-s | -d ] class show dev DEV tc filter show dev DEVTC用途简介:Tc用于Linux内核的流量控制。
Linux系统中tc命令的使用详解Linux系统中tc是一个流量控制工具,全称叫traffic control。
下面由店铺为大家整理了linux系统中tc命令的使用详解,希望对大家有帮助!Linux系统中tc命令的使用详解名称:tc - 显示/维护流量控制设置一、linux tc命令格式tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ] tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ]tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ filtertype specific parameters ] flowid flow-idtc [-s | -d ] qdisc show [ dev DEV ]tc [-s | -d ] class show dev DEVtc filter show dev DEV二、linux tc命令原理介绍Linux操作系统中的流量控制器TC(Traffic Control)用于linux内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控制。
TC模块实现流量控制功能使用的队列规定分为两类,一类是无类队列规定,另一类是分类队列规定。
无类队列规定相对简单,而分类队列规定则引出了分类和过滤器等概念,使其流量控制功能增强。
Linux 高级流量控制本篇主要讲用TC 对Linux 进行高级流量控制通过大量实践结合TC 流控HOWTO 文档整理而得如果你对Linux 流控感兴趣,如果你需要搭建高性能的Linux 网关, 本文将会使你受益颇多。
注:至少具备Linux OS 的中级水平知识,熟悉TCP/IP, Linux 网卡工作原理,以及配置Linux 网关的经验,将有助于对本文的理解。
本文参考文档:Tc 流控HOWTO 文档/HOWTO/html_single/Traffic-Control-HOWTO/Linux TC 流量控制工具/view/f02078db50e2524de5187e45.html回页首一 . Linux 流控简介Linux 流控的意义:有效的控制Linux 网卡进出流量, 了解网卡工作原理, 搭建高性能的Linux 网关, 对Linux 高级系统流控有进一步的认识。
Linux 流量控制方法:控发不控收, 所以只能对产生瓶颈网卡处的发包速率进行控制, 而网络瓶颈分析亦为Linux 网络流控的第一步 .Linux 流量控制过程分二种:1. 队列控制即QOS, 瓶颈处的发送队列的规则控制,常见的有SFQPRIO2. 流量控制即带宽控制, 队列的排队整形,一般为TBF HTBLinux 流量控制算法分二种:3. 无类算法用于树叶级无分支的队列,例如:SFQ4. 分类算法用于多分支的队列,例如:PRIO TBF HTBLinux 流控实现工具TC:Linux 下流量控制工具, 从Linux2.2 版开始已并入内核,功能非常强大,详见参考文档。
回页首二 . 以下文章将以二种算法的不同流控分别介绍:1. 无类算法SFQa. 队列控制的无类算法SFQSFQ(Stochastic Fairness Queueing 随机公平队列) 是公平队列算法家族中的一个简单实现 . 它的精确性不如其它的方法, 但实现了高度的公平, 需要的计算量亦很少 .SFQ 算法主要针对一个TCP 会话或者UDP 流 . 流量被分成相当多数量的FIFO 队列中, 每个队列对应一个会话 . 数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会 . 这种方式非常公平, 保证了每一个会话都不会没其它会话所淹没 .SFQ 之所以被称为"随机", 是因为它并不是真的为每一个会话创建一个队列, 而是使用一个散列算法, 把所有的会话映射到有限的几个队列中去 . 因为使用了散列, 所以可能多个会话分配在同一个队列里, 从而需要共享发包的机会, 也就是共享带宽 . 为了不让这种效应太明显,SFQ 会频繁地改变散列算法, 以便把这种效应控制在几秒钟之内( 时间由参数设定).注:SFQ 只会发生在数据发生拥堵, 产生等待队列的网卡上 .. 出口网卡若无等待队列,SFQ 亦不起作用 ...清单 1. 在网卡上建立SFQ#tc qdisc add dev eth0 root handle 1: sfqSFQ 参数有 perturb( 重新调整算法间隔 ) quantum 基本上不需要手工调整 :handle 1: 规定算法编号 .. 可以不用设置由系统指定 ..#tc qdisc sh dev eth0 显示算法#tc qd del dev eth0 root 删除注 : 默认 eht0 支持 TOSSFQ 队列一般用在树叶级, 配合其它流量整形算法一并使用……b. 流量控制的无类算法TBF令牌桶过滤器(TBF) 是一个简单的队列规定: 只允许以不超过事先设定的速率到来的数据包通过, 但可能允许短暂突发流量朝过设定值 .TBF 很精确, 对于网络和处理器的影响都很小, 实现是针对数据的字节数进行的, 而不是针对数据包进行, 常用于网关限速 .TBF 的实现在于一个缓冲器( 桶), 不断地被一些叫做"令牌"的虚拟数据以特定速率填充着 . (token rate). 桶最重要的参数就是它的大小, 也就是它能够存储令牌的数量 . 每个到来的令牌从数据队列中收集一个数据包, 然后从桶中被删除 . 这个算法关联到两个流上——令牌流和数据流, 于是我们得到 3 种情景:A. 数据流以等于令牌流的速率到达TBF. 这种情况下, 每个到来的数据包都能对应一个令牌, 然后无延迟地通过队列 .B. 数据流以小于令牌流的速度到达TBF. 通过队列的数据包只消耗了一部分令牌, 剩下的令牌会在桶里积累下来, 直到桶被装满 . 剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉, 这种情况下会发生突发传输 .C. 数据流以大于令牌流的速率到达TBF. 这意味着桶里的令牌很快就会被耗尽 . 导致TBF 中断一段时间, 称为"越限". 如果数据包持续到来, 将发生丢包 . 此种情况最重要, 因为它可以用来对数据通过过滤器的速率进行整形 . 令牌的积累可以导致越限的数据进行短时间的突发传输而不必丢包, 但是持续越限的话会导致传输延迟直至丢包 .清单 2. 在网卡建立TBF#tc qd add dev eth1 root handle 1: tbf rate 256kbit burst 10000 latency 50ms 速率 256kbit 突发传输 10k 最大延迟 50ms#tc -s qd sh dev eth1 统计#tc qd del dev eth1 root 删除rate 限制的传输速率用位来计算latency 确定了一个包在TBF 中等待传输的最长等待时间 .burst 桶的大小, 以字节计 . 指定了最多可以有多少个令牌能够即刻被使用 . 注: 管理的带宽越大, 需要的缓冲器就越大 . 在Intel 体系上,10 兆bit/s 的速率需要至少10k 字节的缓冲区才能达到期望的速率 . 缓冲区太小导致潜在的丢包 .c. 无类算法除这二种队列以外, 另有pfifo_fast( 网卡出口默认根队列规定) 经常使用的也就是SFQ/TBF ……这二种用法如下:单纯地降低出口速率, 使用令牌桶过滤器 . 调整桶的配置后可用于控制很高的带宽 .链路已经塞满, 保证不会有某一个会话独占出口带宽, 使用随机公平队列 . 当然最要的还是工作中得来的经验, 就其应用方面只要能满足需求即可 .. 要做到灵活应用还得大量的实践 ..2. 分类算法—— PRIO/CBQ/HTB分类算法主要作用是可以对多种数据流区别对待 . 一旦数据包进入一个分类的队列规定, 它就得被送到某一个类中分类, 对数据包进行分类的工具是过滤器 . 过滤器会返回一个决定, 队列规定就根据这个决定把数据包送入相应的类进行排队 . 每个子类都可以再次使用它们的过滤器进行进一步的分类 . 直到不需要进一步分类时, 数据包才进入该类包含的队列规定排队 . 除了能够包含其它队列规定之外, 绝大多数分类的队列规定能够流量整形注: 过滤器对数据包进行分类的工具, 是从队列规定内部调用的, 而不是从别处 .( 用在分叉的分支上)列规定家族: 根, 句柄, 兄弟和父辈每块网卡都有一个出口"根队列规定", 缺省情况下是前面提到的pfifo_fast 队列规定 . 每个队列规定都指定一个句柄, 以便以后的配置语句能够引用这个队列规定 . 除了出口队列规定之外, 每块网卡还有一个入口, 以便policies 进入的数据流 .队列规定的句柄有两个部分: 一个主号码和一个次号码 . 习惯上把根队列规定称为"1:", 等价于"1:0". 队列规定的次号码永远是0. 类的主号码必须与它们父辈的主号码一致 .数据包如何出队并交给硬件当内核决定把一个数据包发给网卡的时候, 根队列规定1: 会得到一个出队请求, 然后把它传给1:1, 然后依次传给10:,12: 和13:( 子类自定义), 然后试图从它们中进行dequeue() 操作 . 也就是说, 内核需要遍历整颗树, 换句话说, 类及其兄弟仅仅与其"父队列规定"进行交谈, 而不会与网卡进行交谈 . 只有根队列规定才能由内核进行出队操作! 更进一步, 任何类的出队操作都不会比它们的父类更快 . 我们可以把SFQ 作为一个子类, 放到一个可以进行流量整形的父类中, 从而能够同时得到SFQ 的调度功能和其父类的流量整形功能 .a. 队列控制的分类算法PRIOPRIO 分类优先算法( 从左至右优先发包), 队列规定并不进行整形, 它仅仅根据你配置的过滤器把流量进一步细分 . 你可以认为PRIO 队列规定是pfifo_fast 的一种衍生物, 区别在每个频道都是一个单独的类, 而非简单的FIFO.当数据包进入PRIO 队列规定后, 将根据你给定的过滤器设置选择一个类 . 缺省情况下有三个类, 这些类仅包含纯FIFO 队列规定而没有更多的内部结构 . 你可以把它们替换成你需要的任何队列规定 . 每当有一个数据包需要出队时, 首先处理:1 类 . 只有当标号更小的类中没有需要处理的包时, 才会标号大的类 .PRIO 配置范例示意图:大批量数据使用30:, 交互数据使用20: 或10:.清单 3. 在网卡建立PRIO分类的一示例图:2. HTB 分层令牌桶网卡工作示例图:3. ADSL 上网流量限控脚本ADSL 带宽是下行3200Kbit, 上行只有320Kbit 网卡工作示例图:。
Linux tc流量控制相关笔记一、概念1.qdisc,队列规定(规则)。
管理设备的队列进出队列的算法。
2.class,分类。
存放队列元素,也是根据过滤条件进行分类后存放结果的位置。
创建class时,该class会有一个默认的qdisc子结点,类型为pfifo_fast。
如果该class下再另创建一个qdisc,则原来默认的pfifo_fast qdisc会自动被删除。
如果再将另创建的qdisc删除,则class下会自动恢复默认的qdisc。
3.filter,过滤器。
分类的实施者,决定由哪个class处理数据包。
4.每一个qdisc或class都有一个唯一的标识:handle(句柄)。
格式是:“主号:次号”。
句柄具有接口本地性,不同的网络接口下的qdisc或class可以有相同的句柄。
对于qdisc可省略次号,例如:“1:”等价于“1:0”,次号固定是0。
class不能省略次号。
class的主号码必须和父类的主号码一致。
5.任何class出队列都不会比父类快、不会比parent允许的时间更早。
父类相当于子类的限制条件。
6.class的rate指保证得到的带宽,是一个平均值。
所有子类的rate总和应不大于父类的rate值。
7.删除qdisc后,该qdisc下配置的所有的qdisc、class、filter会全部被删除。
在reboot设备后,所有的配置也会自动被清除。
二、流量控制的步骤1.针对物理设备(例如:eth1)绑定一个qdisc。
2.在qdisc上建立class。
3.为class建立相应的filter,将数据包映射到相应的class进行处理。
配置完成后,可使用tc qdisc/class/filter show dev DEVNAME 命令查看配置的结果。
要测量实际的流量,可通过传输或下载文件进行查看。
linux下可测量流量速率的工具有ifstat,iftop,nethogs,sysstat,iptraf等。
tc 是Linux 下的一个流量控制工具,用于控制网络流量的各个方面。
如果你想使用tc 来发送丢包,你可以设置流量控制策略来达到这个目的。
以下是一个简单的示例,说明如何使用tc 发送丢包:1. 首先,确保你的tc 工具是可用的。
你可以通过运行tc 命令来检查。
2. 使用tc qdisc 命令查看当前的队列规则:bashtc qdisc show3. 创建一个新的队列规则,并设置丢包率:bashtc qdisc add dev eth0 root handle 1: htb default 12tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbittc class add dev eth0 parent 1:1 classid 1:12 htb rate 10mbittc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw flowid 1:12上述命令会在eth0 网络接口上创建一个基于类的队列规则,并设置一个丢包率。
这里只是一个简单的示例,你可能需要根据你的实际需求进行调整。
4. 你还可以使用tc 的其他命令和参数来进一步调整和配置流量控制策略。
例如,你可以使用tc filter 命令来过滤流量,或使用tc qdisc 命令来修改队列规则等。
5. 要移除设置的队列规则,可以使用以下命令:bashtc qdisc del dev eth0 root注意:在实际环境中使用tc 时,请确保你了解其工作原理和潜在的影响,并谨慎操作。
不当的配置可能会导致网络性能问题或其他未预期的行为。
Linux下的网络流量控制和负载均衡技巧随着互联网的发展,网络流量的控制和负载均衡在现代计算机网络中变得越来越重要。
在Linux操作系统下,我们可以利用一些技巧来实现网络流量的控制和负载均衡,从而提高网络的性能和稳定性。
一、流量控制技巧1. 网络流量监控在Linux中,我们可以使用一些工具来监控网络流量,例如iftop、ntop和vnStat等。
这些工具可以帮助我们实时监控网络中的流量情况,了解网络使用的情况,以便做出相应的调整。
2. 限制带宽为了控制网络中的流量,我们可以使用Linux的qdisc和class来实现带宽的限制。
通过设置合适的带宽限制,可以避免某些应用程序或用户占用过多的带宽,保证网络的公平性和稳定性。
3. 软件防火墙Linux中的iptables工具可以用于实现网络流量的策略型防火墙。
我们可以根据需要,对进出网络的流量进行限制,以实现网络流量的控制和安全性的提升。
二、负载均衡技巧1. 负载均衡算法在Linux中,可以选择多种负载均衡算法来实现负载均衡,例如轮询、加权轮询、最小连接和哈希等。
根据实际情况选择合适的负载均衡算法,可以将流量均匀地分配给不同的服务器,提高系统的处理能力和响应速度。
2. 使用代理服务器通过使用代理服务器,我们可以将进入系统的流量分发到多个后端服务器上。
不仅可以提高系统的性能,还可以实现负载均衡和故障恢复的功能。
常用的代理服务器有Squid和Nginx等。
3. 软件负载均衡器在Linux中,我们可以使用一些软件负载均衡器来实现流量的均衡分配,如LVS(Linux Virtual Server)和HAProxy等。
这些软件负载均衡器可以根据实际需求,对流量进行智能地调度和分发,提高系统的可用性和性能。
三、其他技巧1. 网络优化通过一些网络优化技巧,可以提高Linux系统的网络性能。
比如优化TCP/IP协议栈、调整网络缓冲区大小、使用适当的网络设备驱动程序等。
Linux流量控制Linux操作系统中的流量控制框架创建了一个通用环境,它集成了所有用于限制和流量整形的可以互联的不同元素。
在实际操作中这些元素甚至可以作为一个模块动态地加载和卸载。
TC(Traffic Control)工具提供了一个命令行用户接口来配置Linux流量控制。
该工具让用户可以设定并配置几乎所有的流量控制框架要素,比如排队规则(qdisc)、类(class)及过滤器(filter),他们之间的关系见下图。
排队规则:每个网络设备配有一个排队规则。
通常,要发送的报文被送到一个排队规则中并且按照特定规则在此队列中排序。
类:排队规则可以有多个接口,这些接口用于向队列管理插入报文。
在单个排队规则中,可以把报文分配到不同的类。
过滤器:通常用来将外发报文分片到排队规则的类中。
排队规则Linux可支持无类排队规则和分类排队规则。
无类排队规则包括FIFO(先进先出)、TBF(令牌桶过滤器)、SFQ(随机公平队列)等;分类排队规则包括PRIO(优先级)、CBQ(类基队列)、HTB(分层令牌桶)等。
FIFOFIFO(pfifo_fast)先进先出。
它的队列包括三个波段(band)。
在每个波段里面,使用先进先出规则。
而三个波段的优先级也不相同,band 0的优先级最高,band 2的最低。
如果band 0里面有数据包,系统就不会处理band 1里面的数据包,band 1和band 2之间也是一样。
数据包是按照服务类型(Type of Service,TOS)被分配多三个波段里面的。
pfifo_fast 队列规定作为硬性的缺省设置,不能对它进行配置。
TBF & HTB令牌桶过滤器(Token Bucket Filter,TBF)是一个简单的队列,它只允许以不超过事先设定的速率到来的数据包通过,但可能允许短暂突发流量超过设定值。
TBF 的实现在于一个缓冲器(桶),它不断地被一些称为令牌的虚拟数据以特定速率填充。
LinuxTC流量控制——网络知识1 linux下的发送流量控制1.1 简单网络拓扑PC上开启两个虚拟机A_NAT和B_BRG,A_NAT网卡开启NAT模式,B_BRG网卡开启Bridge 模式。
A_NAT自动分配IP为:192.168.175.130,B_BRG手动分配IP为:192.168.111.193。
在B_BRG上配置TC流量控制命令,并在PC上开启FlashFXP软件,两端分别连接A_NAT 和B_BRG,如下图所示:通过B_BRG向A_NAT传输文件(WINDOWS7-32.GHO 大小306MB),观察传输速度的变化。
1.1.1 不限制流量通过tc qdisc del dev eth0 root 2>/dev/null命令清除掉流量限制,传输文件观察速度如下:说明在没有流量控制命令时,速度可以达到4MB/秒。
1.1.2限制流量最高1Mbit控制流量速度,限制在1Mbit(相当于125KB)以内,配置如下命令:tc qdisc add dev eth0 root tbf rate 1Mbit latency 50ms burst 10000 mpu 64 mtu 150000利用FTP实验如下图:图中显示速度被控制在90KB/秒左右,说明流量控制命令起到作用。
1.1.3 限制流量最高5Mbit清除掉流量限制再执行如下命令控制流量,将速度提高2.2的5倍观察效果:tc qdisc add dev eth0 root tbf rate 5Mbit latency 50ms burst 10000 mpu 64 mtu 150000图中显示速度被控制在430KB/秒左右,约为2.1中速度的5倍,说明流量控制命令起到作用。
1.1.4 限制流量最高10Mbit清除掉流量限制再执行如下命令控制流量,将速度提高2.2的10倍观察效果:tc qdisc add dev eth0 root tbf rate 10Mbit latency 50ms burst 10000 mpu 64 mtu 150000图中显示速度被控制在850KB/秒左右,约为2.1中速度的10倍,说明流量控制命令起到作用。
Linux下TC(trafficcontrol)以及netem的使⽤⼀:综述:linux系统中的流量控制器(TC)主要是在输出端⼝处建⽴⼀个队列进⾏流量控制。
TC是⼀个可以根据数据包的任何⼀个部分的特征对其进⾏分类的⼯具,并且可以为各类数据提供不同带宽,从⽽控制他们的传输速度。
TC是iproute2的⼀部分,集成在2.2.及以上版本的内核中,还可以与linux内核⾥的各种架构(如Netfilter netem)协同⼯作。
⼆:TC的组件TC主要由队列规定(qdisc),类(class)和过滤器(filter)这3个组件组成,绘图中⼀般⽤圆形表⽰队列规定,⽤矩形表⽰类:1:qdisc:TC的核⼼组件,也被称为队列,是管理⽹卡输⼊,输出数据的⼀个算法,⽤于确定数据包的发送⽅式。
队列规定可分为两类:(1)不分类的qdisc:内部不包含可配置的⼦类,对进⼊队列的数据包不进⾏区分对待,⽽只是对数据包进⾏重新编排,延迟发送或者丢弃,主要有:pfifo-fast.TBF.SFQ等(2)分类队列规定:内部可包含⼀个或多个⼦类,使⽤过滤器对数据包进⾏分类,然后交给相应的⼦类处理,分类队列规定有CBQ,HTB等2:类:就是数据的类别,各种数据通过过滤器进⾏分类,最后被放⼊类的队列规定⾥⾯进⾏排队。
如果⼀个类没有⼦类,那么这个类被称为叶⼦类,否则就被成为内部类。
1:1和1:12是内部类,其他均为叶⼦类,叶⼦类有⼀个负责为这个类发送数据的队列规定,⽽且这个qdisc可以是分类的,如1:10有⼀个分类的队列规定。
TC中通常把类的队列规定称为叶⼦qdisc(只有叶⼦类才有队列规定)3:过滤器就是⼀些规则,根据这些规则对数据包进⾏分类,过滤器可以属于队列规定,也可以属于内部类,若需要在叶⼦类上再实现分类,那就必须将过滤器与叶⼦类的分类队列规定关联起来,⽽不能与叶⼦类相关联。
最常⽤的是U32过滤器,由⼀个过滤器和⼀个动作组成,选择器⽤来对数据包进⾏匹配,⼀旦匹配成功就执⾏该动作。
公司一台服务器,网络环境太高,那台服务器和源服务器连接下载,就跑到 400M-500M,为了控制一下, 所以研究了一下 TC。
来做流量控制.给他控制到小点,不要让这一台占了所有的网络。
TC 很是强大啊,很 多所谓的硬件路由器,都是基于这个做的。
TC 介绍在 linux 中,TC 有二种控制方法 CBQ 和 HTB.HTB 是设计用来替换 CBQ 的。
它是一个层次式的过 滤框架.TC 包括三个基本的构成块:队列规定 qdisc(queueing discipline )、类(class)和分类器(Classifiers)TC 中的队列 中的队列(queueing discipline): 用来实现控制网络的收发速度.通过队列,linux 可以将网络数据包缓存起来,然后根据用户的设置,在尽 量不中断连接(如 TCP)的前提下来平滑网络流量.需要注意的是,linux 对接收队列的控制不够好,所以我 们一般只用发送队列,即“控发不控收”.它封装了其他两个主要 TC 组件(类和分类器)。
内核如果需要通 过某个网络接口发送数据包,它都需要按照为这个接口配置的 qdisc(排队规则)把数据包加入队列。
然后, 内核会尽可能多地从 qdisc 里面取出数据包,把它们交给网络适配器驱动模块。
最简单的 QDisc 是 pfifo 它不对进入的数据包做任何的处理, 数据包采用先入先出的方式通过队列。
不过,它会保存网络接口一时无法处理的数据包。
队列规则包括 FIFO (先进先出) RED , (随机早期探测) SFQ , (随机公平队列) 和令牌桶 (Token Bucket) , 类基队列(CBQ),CBQ 是一种超级队列,即它能够包含其它队列(甚至其它 CBQ)。
TC 中的 Class 类 class 用来表示控制策略.很显然,很多时候,我们很可能要对不同的 IP 实行不同的流量控制策略,这时 候我们就得用不同的 class 来表示不同的控制策略了.TC 中的 Filter 规则 filter 用来将用户划入到具体的控制策略中(即不同的 class 中).比如,现在,我们想对 xxa,xxb 两个 IP 实行不同的控制策略(A,B),这时,我们可用 filter 将 xxa 划入到控制策略 A,将 xxb 划入到控制策 略 B, filter 划分的标志位可用 u32 打标功能或 IPtables 的 set-mark (大多使用 iptables 来做标记) 功能来实现。
linux tc 删规则-概述说明以及解释1.引言1.1 概述概述部分的内容:在使用Linux系统进行网络配置时,为了进行流量控制和流量管理,我们通常会使用Linux tc(Traffic Control)工具来配置规则。
通过配置规则,我们可以限制网络中数据包的发送速率、延迟、带宽等参数,从而实现对网络流量的有效控制和管理。
然而,随着网络需求的变化,我们可能需要删除一些已经配置的规则,以便重新设置或调整网络流量的控制方式。
本文将重点介绍如何在Linux系统中使用tc命令删除已配置的规则。
首先,我们将提供一些关于tc命令的基本概念和使用方法的背景知识。
然后,我们将详细解释如何通过使用tc命令的特定选项和参数来删除已经存在的规则。
最后,我们将总结本文的主要内容,并给出一些建议和注意事项,以帮助读者更好地理解和应用本文所介绍的内容。
通过学习本文,读者将能够了解如何正确地使用Linux tc工具来删除网络流量控制规则。
这将有助于他们在实际应用中更灵活地配置和管理网络流量,提高网络的性能和稳定性。
值得注意的是,在进行规则删除操作时,一定要谨慎操作,确保不会对网络的正常运行产生不良影响。
希望本文能够为读者提供有价值的指导和参考,使他们能够更好地理解和应用Linux tc工具。
1.2 文章结构文章结构部分的内容包括了整篇文章的组织和内容安排。
它对读者来说是非常重要的,因为一个清晰的结构可以帮助读者更好地理解所读文章的内容。
下面对文章结构部分进行具体描述:文章结构部分主要包括以下几个方面的内容:1. 文章的总体框架:文章的总体框架包括引言、正文和结论三个部分。
引言部分主要介绍文章的背景、目的及意义,正文部分展开对主题的论述、分析和阐述,结论部分对整篇文章进行总结和提供结论。
2. 各个章节的标题和内容简介:在文章目录中列举了各个章节的标题,这些标题应该能够准确地反映出各个章节的内容。
然后在文章结构部分,需要为每个章节提供简短的内容简介,以便读者能够对各个章节的重点内容有所了解。
Linux的流量控制器(TrafficControl)Linux从kernel 2.1.105开始支持QOS,不过,需要重新编译内核。
运行 make config时将 EXPERIMENTAL _OPTIONS 设置成 y,并且将Class Based Queueing (CBQ), Token Bucket Flow, Traffic Shapers 设置为 y ,运行 make dep; make clean; make bzilo,生成新的内核。
在Linux操作系统中流量控制器(TC)主要是在输出端口处建立一个队列进行流量控制,控制的方式是基于路由,亦即基于目的IP地址或目的子网的网络号的流量控制。
流量控制器TC,其基本的功能模块为队列、分类和过滤器。
Linux内核中支持的队列有,Class Based Queue ,Token Bucket Flow ,CSZ ,First In First Out ,Priority ,TEQL ,SFQ ,ATM ,RED。
这里讨论的队列与分类都是基于CBQ(Class Based Queue)的,而过滤器是基于路由(Route)的。
配置和使用流量控制器TC,主要分以下几个方面:分别为建立队列、建立分类、建立过滤器和建立路由,另外还需要对现有的队列、分类、过滤器和路由进行监视。
其基本使用步骤为:1) 针对网络物理设备(如以太网卡eth0)绑定一个CBQ队列;2) 在该队列上建立分类;3) 为每一分类建立一个基于路由的过滤器;4) 最后与过滤器相配合,建立特定的路由表假设环境:流量控制器上的以太网卡(eth0) 的IP地址为192.168.1.66,在其上建立一个CBQ队列。
假设包的平均大小为1000字节,包间隔发送单元的大小为8字节,可接收冲突的发送最长包数目为20字节。
假如有三种类型的流量需要控制:1) 是发往主机1的,其IP地址为192.168.1.24。
linux下NAT配置详解linux下NAT配置详解(2007-03-30 23:00)Linux下NAT配置详解一,配置前的准备:1,Linux版本:我的是(企业版,至于红帽9已经不能得到升级和技术支持,所以现在都用企业版。
):[root@tpwb /]# uname -r2.6.9-34.EL(版本内核)2,IPTABLES版本:[root@tpwb ~]# iptables -viptables v1.2.11: no command specifiedTry `iptables -h' or 'iptables --help' for more information.如果没有安装,安装一下,在次我不讲如何安装IPTABLS,3,远程软件SecureCRT5,去百度搜索一下多的事。
也可以从我网吧的网页下载。
4,命令术语的了解:要用到的命令:iptables,vi,route,cat,echo,reboot,ntsysv.5,相关术语:什么是NAT,及工作原理.linux下IPTABLES防火墙的基本了解,配置.二,开始配置配置NAT采用双网卡(也可用单网卡,但不推荐),如何配置网卡ip,看我的另一篇文章:/u/30548/showart.php?id=244176下面看一下我的网卡IP配置情况[root@tpwb network-scripts]# cat ifcfg-eth0DEVICE=eth0BOOTPROTO=staticBROADCAST=211.101.46.255HWADDR=4C:00:10:59:6B:20IPADDR=211.101.46.251NETMASK=255.255.255.0NETWORK=211.101.46.0ONBOOT=yesTYPE=Ethernet[root@tpwb network-scripts]# cat ifcfg-eth1DEVICE=eth1ONBOOT=yesBOOTPROTO=staticIPADDR=192.168.1.1NETMASK=255.255.255.0HWADDR=4C:00:10:10:03:55我才用的是固定IP,外网IP:211.101.46.251内网IP是:192.168.1.1在来看一下DNS和网关[root@tpwb ~]# cat /etc/resolv.confnameserver 192.168.1.1 内网DNS地址nameserver 202.106.0.20 外网DNS地址[root@tpwb /]# vi /etc/sysconfig/networkNETWORKING=yesHOSTNAME=tpwbGATEWAY=211.101.46.1 你的网关(211.101.46.251的网关)[root@tpwb sysconfig]# routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface211.101.46.0 * 255.255.255.0 U 00 0 eth0192.168.1.0 * 255.255.255.0 U 00 0 eth1169.254.0.0 * 255.255.0.0 U0 0 0 eth1default 211.101.46.1 0.0.0.0 UG 0 0 0eth0保证default是 211.101.46.1下面我们要确定一下DNS是否安装,为要DNS呢?其实也可以不要,但这里有个问题,有人在设置DNS时,设置成192.168.1.1 IPTABLES配置没有问题,其他也没有问题,就是上不了网!!其实就是因为DNS配置成192.168.1.1了,你该成202.106.0.20就好了,就不能该成192.168.1.1了吗!当然不是你只要安装DNS,并且把它开启就可以了!!!也有人说要配置caching-only dns,但经过我实验,不配置也可以![root@tpwb ~]# service named restart停止 named:启动named:[ 确定 ]好到现在前期准备工作差不多了!我的是固定IP地址,所以输入[root@tpwb ~]#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 211.101.46.251你对照着写就行了不同之处可能会在,eth0(外网接口)看是否和你一样,还有IP地址,私网IP(192.168.1.0/24)和公网IP地址(211.101.46.251)工作原理我就不说了,自己去找资料看看吧!!现在在客户端配置好ip地址和网关,dns如:ip地址:192.168.1.2子网掩码:255.255.255.0网关:192.168.1.1DNS:192.168.1.1然后ping一下192.168.1.1看能否ping通.在ping 211.101.46.1 看能否ping通不能对吧!还要打开ip转发功能.[root@tpwb ~]#echo 1 > /proc/sys/net/ipv4/ip_forward在ping一次,ok 了看看能不能上网,不能,还差一点!就是IPTABLES设置[root@tpwb ~]#iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT [root@tpwb ~]#iptables -A OUTPUT -p udp --dport 53 -j ACCEPT 允许DNS服务端口的tcp,udp数据包流出在试一次,好了吧!如果想让所有的配置重起后依然起作用呢,好继续1,要把IPTABLES的配置保存.[root@tpwb ~]#/etc/rc.d/init.d/iptables save2, [root@tpwb rc.d]# vi /etc/rc.d/rc.local#!/bin/sh## This script will be executed *after* all the other init scripts.# You can put your own initialization stuff in here if you don't# want to do the full Sys V style init stuff.touch /var/lock/subsys/localecho 1 > /proc/sys/net/ipv4/ip_forward 看这一行,是添加的! ~~保存,退出.3,[root@tpwb ~]# ntsysvntsysv 1.3.13.3 - (C) 2000-2001 Red Hat, Inc.lqqqqqqqqqqqqu 服务tqqqqqqqqqqqqkx xx 您想自动启动哪些服务?xx xx [ ] FreeWnn # xx [ ] NetworkManager a xx [*] acpid a xx [ ] amanda a xx [ ] amandaidx a xx [ ] amd a xx [ ] amidxtape a xx [*] anacron a xx xx lqqqqqqk lqqqqqqk xx x 确定x x 取消x xx mqqqqqqj mqqqqqqj xx xx xmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj按<F1> 可获取关于某项服务的详情。
linux做nat服务tc限制流量用bt和电驴疯狂下载,我们上网游戏,所以对nat上网做了流量控制我们上网环境如下:eth0 外网ip :a.b.c.deth1 内网ip1:192.168.0.0/24 给老板和bteth2 内网ip2:192.168.1.0/24 给我和csfans用linux 做nat 命令如下:echo 1 > /proc/sys/net/ipv4/ip_forwardiptables -Fiptables -t nat -F ----清除旧规则iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to a.b.c.d ---为内网ip1 做natiptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT -- to a.b.c.d ---为内网ip2 做nat------------为流量控制做基于fw过滤器的标记iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.0/24 -j MARK --set-mark 1iptables -I PREROUTING -t mangle -p tcp -s 192.168.1.0/24 -j MARK --set-mark 2------------为上传速率做流量控制tc 要求内核2.4.18以上,所以不够的要升级tc 只能控制网卡发送包的速率,所以上传速率的限制要在eth0上做----删除旧有队列tc qdisc del dev eth0 root----加一个根队列,速率用网卡的速率10Mbit,也可用上传的速率tc qdisc add dev eth0 root handle 100: cbq bandwidth 10Mbit avpkt 1000----加一个根类tc class add dev eth0 parent 100:0 classid 100:1 cbq bandwidth 10Mbit rate 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 8 avpkt 1000 bounded----加一个子类用于内网1速率限制为300Kbittc class add dev eth0 parent 100:1 classid 100:2 cbq bandwidth 10Mbit rate 300Kbit allot 1513 weight 30Kbit prio 5 maxburst 8 avpkt 1000 bounded----加一个子类用于内网2速率限制为320Kbittc class add dev eth0 parent 100:1 classid 100:3 cbq bandwidth 10Mbit rate 320Kbit allot 1513 weight 32Kbit prio 6 maxburst 8 avpkt 1000 bounded----设置队列规则tc qdisc add dev eth0 parent 100:2 sfq quantum 1514b perturb 15tc qdisc add dev eth0 parent 100:3 sfq quantum 1514b perturb 15------将队列和fw过滤器映射起来其中hand 1 的1是开始用iptables 做的标记,hand 2 的2也是开始用iptables 做的标记tc filter add dev eth0 parent 100:0 protocol ip prio 1 handle 1 fw classid 100:2tc filter add dev eth0 parent 100:0 protocol ip prio 2 handle 2 fw classid 100:3-----------------------再做下载限制我只限制了老板和bt的下载速率,过滤器是用u32tc qdisc del dev eth1 roottc qdisc add dev eth1 root handle 200: cbq bandwidth 10Mbit avpkt 1000tc class add dev eth1 parent 200:0 classid 200:1 cbq bandwidth 10Mbit rate 10Mbit allot 1514 weight 2Kbit prio 8 maxburst 8 avpkt 1000 boundedtc class add dev eth1 parent 200:1 classid 200:2 cbq bandwidth 10Mbit rate 1000Kbit allot 1513 weight 1Mbit prio 5 maxburst 8 avpkt 1000 boundedtc qdisc add dev eth1 parent 200:2 sfq quantum 1514b perturb 15tc filter add dev eth1 parent 200:0 protocol ip prio 25 u32 match ip dst 192.168.0.0/24 flowid 200:2----------------------现在可以用tc -s qdisc ls dev eth0tc -s qdisc ls dev eth1tc -s class ls dev eth0tc -s class ls dev eth1 监视流量作基于ip 的流量控制只要把网段改为ip就可以比如iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.0/24 -j MARK --set-mark 1iptables -I PREROUTING -t mangle -p tcp -s 192.168.1.0/24 -j MARK --set-mark 2可以改为iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.17/32 -j MARK --set-mark 1iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.18/32 -j MARK --set-mark 2则192.168.0.17和192.168.0.18的上传流量得到控制下载控制可改为tc filter add dev eth1 parent 200:0 protocol ip prio 25 u32 match ip dst 192.168.0.17/32 flowid 200:2 则192.168.0.17的下载流量得到控制。
Linux 限速工具TC 手册简明版tc -- 显示/维护流量控制设置摘要tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ]tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ filtertype specific parameters ] flowid flow-idtc [-s | -d ] qdisc show [ dev DEV ]tc [-s | -d ] class show dev DEV tc filter show dev DEV简介Tc用于Linux内核的流量控制。
流量控制包括以下几种方式:SHAPING(限制)当流量被限制,它的传输速率就被控制在某个值以下。
限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。
shaping(限制)只适用于向外的流量。
SCHEDULING(调度)通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。
SCHEDULING(调度)也只适于向外的流量。
POLICING(策略)SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。
DROPPING(丢弃)如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。
Linux下使⽤tc(TrafficControl)流量控制命令模拟⽹络延迟和丢包 Linux下使⽤tc(Traffic Control) 流量控制命令模拟⽹络延迟和丢包qdisc is short for 'queueing discipline'TC案例如何使⽤tc模拟⽹络延迟和丢包修改⽹络延时: sudo tc qdisc add dev eth0 root netem delay 1000ms查看流量管理:tc qdisc show删除策略:sudo tc qdisc del dev eth0 root netem delay 1000ms验证效果:ping 192.168.102.124 -c 20修改丢包率:sudo tc qdisc add dev eth0 root netem loss 10%删除策略:sudo tc qdisc del dev eth0 root netem loss 10%--------------------------------------------------------------------------------------------------------------------------------------------配置⽹络超时123 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24[root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem delay 100msRTNETLINK answers: Invalid argument[root@dev-xx-xx ~]# tc qdisc showqdisc mq 0: dev eth0 rootqdisc pfifo_fast 0: dev eth0 parent :1 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 qdisc pfifo_fast 0: dev eth0 parent :2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 qdisc pfifo_fast 0: dev eth0 parent :3 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 qdisc pfifo_fast 0: dev eth0 parent :4 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 [root@dev-xx-xx ~]# tc qdisc add dev eth0 root netem delay 100ms[root@dev-xx-xx ~]# ping 192.168.102.124PING 192.168.102.124 (192.168.102.124) 56(84) bytes of data.64 bytes from 192.168.102.124: icmp_seq=1 ttl=64 time=0.074 ms64 bytes from 192.168.102.124: icmp_seq=2 ttl=64 time=0.066 ms64 bytes from 192.168.102.124: icmp_seq=3 ttl=64 time=0.080 ms64 bytes from 192.168.102.124: icmp_seq=4 ttl=64 time=0.043 ms64 bytes from 192.168.102.124: icmp_seq=5 ttl=64 time=0.084 ms64 bytes from 192.168.102.124: icmp_seq=6 ttl=64 time=0.094 ms^C--- 192.168.102.124 ping statistics ---12 packets transmitted, 12 received, 0% packet loss, time11131msrtt min/avg/max/mdev= 0.043/0.081/0.107/0.018 ms[root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem delay 100ms[root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem delay 100msRTNETLINK answers: Invalid argument配置⽹络丢包率123456 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22[root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem loss 10%RTNETLINK answers: Invalid argument[root@dev-xx-xx ~]# tc qdisc add dev eth0 root netem loss 10%[root@dev-xx-xx ~]# tc qdisc showqdisc netem 8005: dev eth0 root refcnt 5 limit 1000 loss 10% [root@dev-xx-xx ~]# ping 192.168.102.124 -n 20PING 20 (0.0.0.20) 56(124) bytes of data.^C--- 20 ping statistics ---21 packets transmitted, 0 received, 100% packet loss, time20650ms[root@dev-xx-xx ~]# ping 192.168.102.124 -c 20 PING 192.168.102.124 (192.168.102.124) 56(84) bytes of data. 64 bytes from 192.168.102.124: icmp_seq=1 ttl=64 time=0.101 ms 64 bytes from 192.168.102.124: icmp_seq=2 ttl=64 time=0.062 ms 64 bytes from 192.168.102.124: icmp_seq=3 ttl=64 time=0.098 ms 64 bytes from 192.168.102.124: icmp_seq=4 ttl=64 time=0.098 ms 64 bytes from 192.168.102.124: icmp_seq=5 ttl=64 time=0.062 ms 64 bytes from 192.168.102.124: icmp_seq=6 ttl=64 time=0.088 ms 64 bytes from 192.168.102.124: icmp_seq=7 ttl=64 time=0.045 ms 64 bytes from 192.168.102.124: icmp_seq=8 ttl=64 time=0.070 ms23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6564 bytes from 192.168.102.124: icmp_seq=9 ttl=64 time=0.062 ms 64 bytes from 192.168.102.124: icmp_seq=10 ttl=64 time=0.066 ms 64 bytes from 192.168.102.124: icmp_seq=11 ttl=64 time=0.088 ms 64 bytes from 192.168.102.124: icmp_seq=12 ttl=64 time=0.070 ms 64 bytes from 192.168.102.124: icmp_seq=13 ttl=64 time=0.089 ms 64 bytes from 192.168.102.124: icmp_seq=14 ttl=64 time=0.087 ms 64 bytes from 192.168.102.124: icmp_seq=15 ttl=64 time=0.054 ms 64 bytes from 192.168.102.124: icmp_seq=16 ttl=64 time=0.085 ms 64 bytes from 192.168.102.124: icmp_seq=17 ttl=64 time=0.064 ms 64 bytes from 192.168.102.124: icmp_seq=18 ttl=64 time=0.124 ms 64 bytes from 192.168.102.124: icmp_seq=19 ttl=64 time=0.063 ms 64 bytes from 192.168.102.124: icmp_seq=20 ttl=64 time=0.108 ms--- 192.168.102.124 ping statistics ---20 packets transmitted, 20 received, 0% packet loss, time19000msrtt min/avg/max/mdev= 0.045/0.079/0.124/0.020 ms [root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem loss 10% [root@dev-xx-xx ~]# ping 192.168.102.124 -c 20PING 192.168.102.124 (192.168.102.124) 56(84) bytes of data.64 bytes from 192.168.102.124: icmp_seq=1 ttl=64 time=0.041 ms 64 bytes from 192.168.102.124: icmp_seq=2 ttl=64 time=0.132 ms 64 bytes from 192.168.102.124: icmp_seq=3 ttl=64 time=0.344 ms 64 bytes from 192.168.102.124: icmp_seq=4 ttl=64 time=0.404 ms 64 bytes from 192.168.102.124: icmp_seq=5 ttl=64 time=0.086 ms 64 bytes from 192.168.102.124: icmp_seq=6 ttl=64 time=0.088 ms 64 bytes from 192.168.102.124: icmp_seq=7 ttl=64 time=0.063 ms 64 bytes from 192.168.102.124: icmp_seq=8 ttl=64 time=0.109 ms 64 bytes from 192.168.102.124: icmp_seq=9 ttl=64 time=0.064 ms 64 bytes from 192.168.102.124: icmp_seq=10 ttl=64 time=0.092 ms 64 bytes from 192.168.102.124: icmp_seq=11 ttl=64 time=0.044 ms 64 bytes from 192.168.102.124: icmp_seq=12 ttl=64 time=0.066 ms 64 bytes from 192.168.102.124: icmp_seq=13 ttl=64 time=0.094 ms 64 bytes from 192.168.102.124: icmp_seq=14 ttl=64 time=0.097 ms 64 bytes from 192.168.102.124: icmp_seq=15 ttl=64 time=0.108 ms 64 bytes from 192.168.102.124: icmp_seq=16 ttl=64 time=0.043 ms 64 bytes from 192.168.102.124: icmp_seq=17 ttl=64 time=0.093 ms 64 bytes from 192.168.102.124: icmp_seq=18 ttl=64 time=0.056 ms 64 bytes from 192.168.102.124: icmp_seq=19 ttl=64 time=0.093 ms 64 bytes from 192.168.102.124: icmp_seq=20 ttl=64 time=0.039 ms--- 192.168.102.124 ping statistics ---20 packets transmitted, 20 received, 0% packet loss, time18999msrtt min/avg/max/mdev= 0.039/0.107/0.404/0.093 ms[root@dev-xx-xx ~]#TC常⽤命令1)模拟延迟传输:# tc qdisc add dev eth0 root netem delay 100ms该命令将 eth0 ⽹卡的传输设置为延迟 100 毫秒发送,更真实的情况下,延迟值不会这么精确,会有⼀定的波动,后⾯⽤下⾯的情况来模拟出带有波动性的延迟值2)模拟延迟波动:# tc qdisc add dev eth0 root netem delay 100ms 10ms该命令将 eth0 ⽹卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送。
利用TC进行流量控制(Qos前言:我看到网络上关于linux系统中的流量控制文章很多不实用,即使参考也不能很快编写流量控制规则,且有很多错误。
之前我也写过一篇文章,被很多网站引用,为感谢对我的支持,我把一个实例编写出来,供大家参考和学习(绝对实用!,绝对精华!大家可以把网上其它人的文章和我的文章比较一下就知道了!)需求:目前公司专线带宽为4M,上下行对等,因近期内部人员使用P2P对网络造成较大影响,所以现在进行流量控制(大部人禁止使用P2P下载,但一些管理人员不能限制,无奈之下只有采取流量控制)。
目的:即保证ERP系统的运行,又不影响其它用户的使用,换句话说,让他们没有感觉,同时达到了我们的目的。
注:因为TC只能限制发送数据包,所以下载在内网卡上进行,而上传在外网卡上进行控制。
一、下载设置1、规则(eth0为内网卡,可以限制下载流量)tc qdisc add dev eth0 root handle 2:0 htb default 30tc class add dev eth0 parent 2:0 classid 2:1 htb rate 4Mbit burst 15ktc class add dev eth0 parent 2:1 classid 2:10 htb rate 4Mbit burst 15k 最大流量4Mtc class add dev eth0 parent 2:1 classid 2:20 htb rate 2000kbit ceil 2Mbit burst 15k 最大流量2Mtc class add dev eth0 parent 2:1 classid 2:30 htb rate 1000kbit ceil 1000kbit burst 15k 最大流量1Mtc qdisc add dev eth0 parent 2:10 handle 10: sfq perturb 10tc qdisc add dev eth0 parent 2:20 handle 20: sfq perturb 10tc qdisc add dev eth0 parent 2:30 handle 30: sfq perturb 10U32_1="tc filter add dev eth0 protocol ip parent 2:0 prio 1 u32"$U32_1 match ip src 192.168.9.0/24 flowid 2:10 (192.168.9.0/24总公司ERP服务器所在网络)使访问ERP服务器可用最大带宽4M,优先级为1U32_2="tc filter add dev eth0 protocol ip parent 2:0 prio 2 u32"$U32_2 match ip dst 192.168.1.172/32 flowid 2:20$U32_2 match ip dst 192.168.1.82/32 flowid 2:20$U32_2 match ip dst 192.168.1.200/32 flowid 2:20以上3个IP为总经办人员,限制他们下载流量为2M,优先级为2tc filter add dev eth0 protocol ip parent 2:0 prio 3 u32 match ip dst 192.168.1.0/24 flowid 2:30 (因为有默认,此行可以省略,为了规则更清晰,还是设置为好)以上只是设置默认情况下下载带宽只有1000K,即将近1M. 优先级为32、注意事项:优先级不要相同二、上传设置1、规则(eth1为连接专线的网卡,可限制上传带宽)iptables -F -t mangleiptables -X -t mangleiptables -Z -t mangleiptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.200/32 -j MARK --set-mark 1iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.172/32 -j MARK --set-mark 1iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.82/32 -j MARK --set-mark 1#iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.0/24 -j MARK --set-mark 2 (可以不用此条)tc qdisc add dev eth1 root handle 1:0 htb default 30tc class add dev eth1 parent 1:0 classid 1:1 htb rate 4Mbit burst 15ktc class add dev eth1 parent 1:1 classid 1:10 htb rate 4Mbit burst 15k 最大上传流量为4Mtc class add dev eth1 parent 1:1 classid 1:20 htb rate 1000kbit ceil 2Mbit burst 15k 最大流量为2Mtc class add dev eth1 parent 1:1 classid 1:30 htb rate 400kbit ceil 400kbit burst 15k 最大流量为400Ktc qdisc add dev eth1 parent 1:10 handle 10: sfq perturb 10tc qdisc add dev eth1 parent 1:20 handle 20: sfq perturb 10tc qdisc add dev eth1 parent 1:30 handle 30: sfq perturb 10U32="tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32"tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.9.0/24 flowid 1:10以上规则使用达到ERP服务器的流量不受限制,也即最大可为4M tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 1 fw classid 1:20以上规则使总经办3个IP地址的上传流量为2M#tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 2 fw classid 1:30 (因为默认下使用此规则,所以可以省略)默认下不符合以上两规则的全部使用此规则,上传带宽最大为400K(不要说我苛刻哟)2、注意事项1) 因为内部IP地址在经过外网卡时会进行NAT,所以不能用源地址进行U32匹配,只能是FW规则进行流量标识2) 优先级一定不能相同,否则fw规则将失效3) 以上规则可以放到一个文件内运行。
TC规则涉及到队列(QUEUE) 分类器(CLASS) 过滤器(FILTER),filter划分的标志位可用U32或iptables的set-mark来实现 ) 一般是"控发"不控收 linux(注意:下有两块网卡,一个eth1是外网,另一块eth0是内网.在eth0上做HTB。
filter划分标志位可用u32打标功能或iptables的set-mark功能,如果用iptables来打标记的话,下行速LV在eth0处控制,但打标应在进入eth0之前进行,所以,“-i eth1";例子:主要命令就下面三句:创建一个HTB的根1.tc qdisc add dev eth0 root handle 1: htb default 20创建一个HTB 的类,流量的限制就是在这里限制的,并设置突发.2.tc class add dev eth0 parent 1: classid 1:1 htb rate 200kbit(速率) ceil 200kbit burst 20k(突发流量)创建一个过滤规则把要限制流量的数据过滤出来,并发给上面的类来限制速度3.tc filter add dev eth0 parent 1: prio 1(优先级) protocol ip u32 match ip sport 80 0xfff flowid 1:1说明:让交互数据包保持较低的延迟时间,并最先取得空闲带宽,比如:ssh telnet dns quake3 irc ftp控制 smtp命令和带有SYN标记的数据包,都应属于这一类。
为了保证上行数据流不会伤害下行流,还要把ACK数据包排在队列前面,因为下行数据的ACK必须同上行流进行竟争。
TC+IPTABLES+HTB+SFQ1 tcp/ip 协议规定,每个封包,都需要有ACKNOWLEDGE讯息的回传,也就是说,传输的资料需要有一个收到资料的讯息回复,才能决定后面的传输速度,并决定是否重新传输遗失的资料,上行的带宽一部分就是用来传输这些ACK资料的.上行带宽点用大的时候,就会影响ACK资料的传送速度,并进而影响到下载速度,2 试验证明,当上传满载时,下载速度变为原来速度的40%,甚至更低,,因为上载文件(包括ftp上传,发邮件SMTP),如果较大,一个的通讯量令带宽超向包和,那么所有的数据包按照先进先出的原则进行排队和等待,这就可以解释为什么网内其中有人用ftp上载文件或发送大邮件的时候,整个网速变得很慢的原因.解决速度之道:1 为了解决这些速度问题,对经过线路的数据进行了有规则的分流.把本来在宽带上的瓶颈转移到我们的LINUX路由器上,可以把带宽控制的比我们购买的带宽小一点. 这样,我们就可以方便的用tc技术对经过的数据进行分流与控制.我们的想像就像马路上的车道一样,有高速道,还有小车道,大车道,需要高速的syn ack icmp ssh等走高速道,需要大量传输的ftp-data,smtp等走大车道,不能让它堵塞整条马路,各行其道.linux下的TC(traffic control)就有这样的作用,只要控制得当,一定会有明显的效果.tc 和iptables结合是最好的简单运用的结合方法.我们设置过滤器以便用iptables对数据包进行分类,因为iptables更灵活,而且还可以为每个规则设置计数器,iptables用mangle链来mark数据包,告诉了内核,数据包会有一个特定的FWMARK标记值(handle x fw) 表明它应该送给那个类(classid x:x),而prio是优先值,表明那些重要数据应该优先通过那个通道,首先选择队列(选择htb),一般系统默认的是fifo的先进先出队列,就是说包是按照先来先处理的原则,如果有一个大的数据包在前面,那么后面的包只能等前面的发完后才能接着发了,这样就算后面既使是一个小小的ack包,也要等待了,这样上传就影响了下载,就算你有很大的下载带宽也无能为力.HTB(Hierarchical token bucket,分层的令牌桶),就像CBQ一样工作,但是并不靠计算闲置时间来整形,它是一个分类的令牌桶过滤器.,它只有很少的参数.结构简图: 1:~~~~~~~~~~~~~~~~`~~~~~~~~~~~~_________1:1~~~~~~~~~1:2________|~~~|~~~~|~~~~|~~~~~|~~~~~~~~|~~~~~~~~|~~~~~~~|1:11~~~1:12~~~~~~~~~~~~1:21~~~1:22~~~1:23~~1:24优先顺序: 1:11 1:12 1:21 1:22 1:23 1:24根据上面的例子,开始脚本:关于参数的说明:rate:是一个类保证得到的带宽值,如果有不只一个类,请保证所有子类总和是小于或等于父类,ceil: ceil是一个类最大能得到带宽值.prio: 是优先权的设置,数值越大,优先权越小,如果是分配剩余带宽,就是数值小的会最优先取得剩余的空闲的带宽权.一般大数据的话,控制在50%-80%左右吧,而ceil最大建议不超过85%,以免某一个会话占用过多的带宽.rate可按各类所需要分配:1:11是很小而且最重要的数据包通道,当然要多分点,甚至必要时先全部占用,不过一般不会的,所以给全速.1:12是很重要的数据道,给多点,最少给一半,但需要时可以再多一点rate规划 1:2=1:21 +1:22 +1:23 +1:24 一般总在50%-80%左右.1:21 http,pop是最常用的啦,为了太多人用,而导致堵塞,我们不能给得太多,也不能太少.1:22 我打算给smtp用,优先低于1:21,以防发大的附件大量占用带宽.1:23 我打算给ftp-data,和1:22一样,很可能大量上传文件,所以,rate不能给的太多,而当其他有剩时可以给大些,ceil设置大些.1:24 是无所谓通道,就是一般不是我们平时工作上需要的通道,给小点防止这些人妨碍有正常工作需要的人.上行uplink 320K,设置销低于理论值.DEV="PPP0"UPLINK=300下行downlink 3200K大概一半左右,以便能够得到更多的关发连接.DOWNLINK=15001 曾加一个根队列,没有进行分类的数据包都走这个1:24是缺省类:tc qdisc add dev $DEV parent 1: htb default 241.1 增加一个根队下面主干类1: 速率为$UPLINK ktc cladd add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 01.1.1 在主干类1下建立第一叶子类,这是一个最高优先权的类,需要高优先和高速的包走这条通道,比如SYN ACK ICMP等.tc class add dev $DEV parent 1:1 classid 1:11 htb rate ${$uplink}kbit ceil ${uplink}kbit prio 11.1.2 在主类1下建立第二叶子类,这是一个次高优先权的类,比如我们重要的CRM数据。
linux做nat服务tc限制流量
用bt和电驴疯狂下载,我们上网游戏,所以对nat上网做了流量控制
我们上网环境如下:
eth0 外网ip :a.b.c.d
eth1 内网ip1:192.168.0.0/24 给老板和bt
eth2 内网ip2:192.168.1.0/24 给我和csfans
用linux 做nat 命令如下:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F ----清除旧规则
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to a.b.c.d ---为内网ip1 做nat
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT -- to a.b.c.d ---为内网ip2 做nat
------------为流量控制做基于fw过滤器的标记
iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.0/24 -j MARK --set-mark 1
iptables -I PREROUTING -t mangle -p tcp -s 192.168.1.0/24 -j MARK --set-mark 2
------------为上传速率做流量控制
tc 要求内核2.4.18以上,所以不够的要升级
tc 只能控制网卡发送包的速率,所以上传速率的限制要在eth0上做
----删除旧有队列
tc qdisc del dev eth0 root
----加一个根队列,速率用网卡的速率10Mbit,也可用上传的速率
tc qdisc add dev eth0 root handle 100: cbq bandwidth 10Mbit avpkt 1000
----加一个根类
tc class add dev eth0 parent 100:0 classid 100:1 cbq bandwidth 10Mbit rate 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 8 avpkt 1000 bounded
----加一个子类用于内网1速率限制为300Kbit
tc class add dev eth0 parent 100:1 classid 100:2 cbq bandwidth 10Mbit rate 300Kbit allot 1513 weight 30Kbit prio 5 maxburst 8 avpkt 1000 bounded
----加一个子类用于内网2速率限制为320Kbit
tc class add dev eth0 parent 100:1 classid 100:3 cbq bandwidth 10Mbit rate 320Kbit allot 1513 weight 32Kbit prio 6 maxburst 8 avpkt 1000 bounded
----设置队列规则
tc qdisc add dev eth0 parent 100:2 sfq quantum 1514b perturb 15
tc qdisc add dev eth0 parent 100:3 sfq quantum 1514b perturb 15
------将队列和fw过滤器映射起来其中hand 1 的1是开始用iptables 做的标记,hand 2 的2也是开始用iptables 做的标记
tc filter add dev eth0 parent 100:0 protocol ip prio 1 handle 1 fw classid 100:2
tc filter add dev eth0 parent 100:0 protocol ip prio 2 handle 2 fw classid 100:3
-----------------------再做下载限制我只限制了老板和bt的下载速率,过滤器是用u32
tc qdisc del dev eth1 root
tc qdisc add dev eth1 root handle 200: cbq bandwidth 10Mbit avpkt 1000
tc class add dev eth1 parent 200:0 classid 200:1 cbq bandwidth 10Mbit rate 10Mbit allot 1514 weight 2Kbit prio 8 maxburst 8 avpkt 1000 bounded
tc class add dev eth1 parent 200:1 classid 200:2 cbq bandwidth 10Mbit rate 1000Kbit allot 1513 weight 1Mbit prio 5 maxburst 8 avpkt 1000 bounded
tc qdisc add dev eth1 parent 200:2 sfq quantum 1514b perturb 15
tc filter add dev eth1 parent 200:0 protocol ip prio 25 u32 match ip dst 192.168.0.0/24 flowid 200:2
----------------------
现在可以用tc -s qdisc ls dev eth0
tc -s qdisc ls dev eth1
tc -s class ls dev eth0
tc -s class ls dev eth1 监视流量
作基于ip 的流量控制只要把网段改为ip就可以
比如
iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.0/24 -j MARK --set-mark 1
iptables -I PREROUTING -t mangle -p tcp -s 192.168.1.0/24 -j MARK --set-mark 2
可以改为
iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.17/32 -j MARK --set-mark 1
iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.18/32 -j MARK --set-mark 2
则192.168.0.17和192.168.0.18的上传流量得到控制
下载控制可改为
tc filter add dev eth1 parent 200:0 protocol ip prio 25 u32 match ip dst 192.168.0.17/32 flowid 200:2 则192.168.0.17的下载流量得到控制。