zoukankan      html  css  js  c++  java
  • [置顶] Linux 流量控制

    在如今的网络界,也许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"

  • 相关阅读:
    BZOJ1045 [HAOI2008]糖果传递 && BZOJ3293 [Cqoi2011]分金币
    [BZOJ1103][POI2007]大都市meg dfs序+树状数组
    [BZOJ1122][POI2008]账本BBB 单调队列+后缀和
    [BZOJ1131][POI2008]Sta
    [BZOJ1370][Baltic2003]Gang团伙 并查集+拆点
    网易云基于 Kubernetes 的深度定制化实践
    微服务化的基石——持续集成
    微服务的接入层设计与动静资源隔离
    从互联网+角度看云计算的现状与未来(2)
    从互联网+角度看云计算的现状与未来(1)
  • 原文地址:https://www.cnblogs.com/riskyer/p/3294019.html
Copyright © 2011-2022 走看看