美文网首页路由联盟
5-TC规则(traffic control)IP限速

5-TC规则(traffic control)IP限速

作者: Creator_Ly | 来源:发表于2020-05-06 22:30 被阅读0次

    流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。

    一、TC规则

    1、流量控制方式:

    • SHAPING(限制) 当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。
    • SCHEDULING(调度) 通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。
    • POLICING(策略) SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。
    • DROPPING(丢弃) 如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。

    2、流量控制处理对象:

    • qdisc(排队规则)
    • class(类别)
    • filter(过滤器)。

    1.qdisc

    1.1 CLASSLESS QDisc(不可分类QDisc)一般不用

    不可分类QDISC包括:

    • [p|b]fifo
    • pfifo_fast
    • red
    • sfq
    • tbf

    不可分类QDisc的配置:

    如果没有可分类QDisc,不可分类QDisc只能附属于设备的根。它们的用法如下:

    tc qdisc add dev DEV root QDISC QDISC-PARAMETERS
    

    要删除一个不可分类QDisc,需要使用如下命令:

    tc qdisc del dev DEV root
    

    一个网络接口上如果没有设置QDisc,pfifo_fast就作为缺省的QDisc。

    1.2 CLASSFUL QDISC(分类QDisc)

    可分类QDISC包括:

    • CBQ
    • HTB
    • PRIO
    • hfsc

    2.CLASS(类)

    某些QDisc(排队规则)可以包含一些类别,不同的类别中可以包含更深入的QDisc(排队规则),通过这些细分的QDisc还可以为进入的队列的数据包排队。通过设置各种类别数据包的离队次序,QDisc可以为设置网络数据流量的优先级。

    3.FILTER(过滤器)

    Filter(过滤器)用于为数据包分类,决定它们按照何种QDisc进入队列。无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可以有多种,使用fileter(过滤器)就是其中之一。使用filter(过滤器)分类时,内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有判决返回,就作进一步的处理,而处理方式和QDISC有关。需要注意的是,filter(过滤器)是在QDisc内部,它们不能作为主体。

    二、TC控制命令

    tc可以使用以下命令对QDisc、类和过滤器进行操作:

    add

    在一个节点里加入一个QDisc、类或者过滤器。添加时,需要传递一个祖先作为参数,传递参数时既可以使用ID也可以直接传递设备的根。如果要建立一个QDisc或者过滤器,可以使用句柄(handle)来命名;如果要建立一个类,可以使用类识别符(classid)来命名。

    remove/del

    删除有某个句柄(handle)指定的QDisc,根QDisc(root)也可以删除。被删除QDisc上的所有子类以及附属于各个类的过滤器都会被自动删除。

    change

    以替代的方式修改某些条目。除了句柄(handle)和祖先不能修改以外,change命令的语法和add命令相同。换句话说,change命令不能一定节点的位置。

    replace

    对一个现有节点进行近于原子操作的删除/添加。如果节点不存在,这个命令就会建立节点。

    link

    只适用于DQisc,替代一个现有的节点。

    三、在线监听

    使用ls或则show都可以查看状态:

    tc qdisc ls dev eth1
    tc qdisc show dev eth1
    
    1.显示队列qdisc的状况

    执行命令:

    /usr/sbin/tc qdisc add dev eth1 root handle 1: prio bands 2 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    /usr/sbin/tc qdisc add dev eth1 parent 1:1 handle 10: pfifo limit 3000
    /usr/sbin/tc qdisc add dev eth1 parent 1:2 handle 20: htb default 1
    

    查看结果:

    root@zihome:/# tc qdisc ls dev eth1
    qdisc prio 1: root refcnt 2 bands 2 priomap  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    qdisc pfifo 10: parent 1:1 limit 3000p
    qdisc htb 20: parent 1:2 r2q 10 default 1 direct_packets_stat 137179 direct_qlen 2000
    

    -s显示具体

    root@zihome:/# tc -s qdisc ls dev eth1
    qdisc prio 1: root refcnt 2 bands 2 priomap  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     Sent 20900606 bytes 145877 pkt (dropped 0, overlimits 0 requeues 0) 
     backlog 0b 0p requeues 0 
    qdisc pfifo 10: parent 1:1 limit 3000p
     Sent 843953 bytes 8734 pkt (dropped 0, overlimits 0 requeues 0) 
     backlog 0b 0p requeues 0 
    qdisc htb 20: parent 1:2 r2q 10 default 1 direct_packets_stat 137143 direct_qlen 2000
     Sent 20056653 bytes 137143 pkt (dropped 0, overlimits 0 requeues 0) 
    
    2.显示分类class的状况

    设置上行流量,上行流量是WAN口,执行命令:

    /usr/sbin/tc class add dev eth1 parent 20: classid 20:1 htb quantum 96000 rate 1024000kbit ceil 1024000kbit burst 15000 cburst 15000
    /usr/sbin/tc class add dev eth1 parent 20:1 classid 20:17 htb quantum 1500 rate 2222kbit ceil 2222kbit burst 15000 cburst 15000
    

    查看结果:

    root@zihome:/# tc class ls dev eth1
    class prio 1:1 parent 1: leaf 10: 
    class prio 1:2 parent 1: leaf 20: 
    class htb 20:1 root rate 1024Mbit ceil 1024Mbit burst 14848b cburst 14848b 
    class htb 20:17 parent 20:1 prio 0 rate 2222Kbit ceil 2222Kbit burst 14999b cburst 14999b 
    

    设置下行流量,下行流量是LAN口,执行命令:

    /usr/sbin/tc class add dev br-lan parent 20:1 classid 20:17 htb quantum 1500 rate 1111kbit ceil 1111kbit
    

    查看结果:

    root@zihome:/# tc class ls dev br-lan
    class prio 1:1 parent 1: leaf 10: 
    class prio 1:2 parent 1: leaf 20: 
    class htb 20:1 root rate 1024Mbit ceil 1024Mbit burst 14848b cburst 14848b 
    class htb 20:17 parent 20:1 prio 0 rate 1111Kbit ceil 1111Kbit burst 1599b cburst 1599b
    
    3.显示过滤器的状况

    执行命令:

    /usr/sbin/tc filter add dev eth1 parent 1: protocol ip prio 1 handle 0xf/0xfffff fw flowid 1:1
    /usr/sbin/tc filter add dev eth1 parent 1: protocol ip prio 2 u32 match ip protocol 1 0xf/0xfffff flowid 1:1
    Illegal "match"
    /usr/sbin/tc filter add dev eth1 parent 1: protocol arp prio 3 handle 0xf/0xfffff fw classid 1:1
    /usr/sbin/tc filter add dev eth1 parent 1: protocol ip prio 4 u32 match u8 0x00 0x00 at 0 flowid 1:2
    /usr/sbin/tc filter add dev eth1 parent 20:0 protocol ip handle 0x1/0xfffff fw flowid 20:1
    

    查看结果:

    root@zihome:/# tc -s filter ls dev eth1
    filter parent 1: protocol ip pref 1 fw 
    filter parent 1: protocol ip pref 1 fw handle 0xf/0xfffff classid 1:1 
    filter parent 1: protocol arp pref 3 fw 
    filter parent 1: protocol arp pref 3 fw handle 0xf/0xfffff classid 1:1 
    filter parent 1: protocol ip pref 4 u32 
    filter parent 1: protocol ip pref 4 u32 fh 800: ht divisor 1 
    filter parent 1: protocol ip pref 4 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:2 
      match 00000000/00000000 at 0
    

    增添动作一般依照"队列->分类->过滤器->路由"的顺序进行;修改动作则没有什么要求;删除则依照"路由->过滤器->分类->队列"的顺序进行。

    mac=00:66:88:11:33:22,upload=1111,download=2222

    iptables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:22 -d 0.0.0.0/0 -j MARK --set-mark 17/0xfffff
    iptables: No chain/target/match by that name.
    ip6tables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:22 -d 0.0.0.0/0 -j MARK --set-mark 17/0xfffff
    /usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
    iptables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:22 -d 0.0.0.0/0 -j MARK --set-mark 17/0xfffff
    ip6tables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:22 -d 0.0.0.0/0 -j MARK --set-mark 17/0xfffff
    /usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
    /usr/sbin/tc class add dev eth1 parent 20:1 classid 20:17 htb quantum 1500 rate 2222kbit ceil 2222kbit burst 15000 cburst 15000
    /usr/sbin/tc filter add dev eth1 parent 20:0 protocol ip handle 17/0xfffff fw flowid 20:17
    /usr/sbin/tc class add dev br-lan parent 20:1 classid 20:17 htb quantum 1500 rate 1111kbit ceil 1111kbit
    /usr/sbin/tc filter add dev br-lan parent 20:0 protocol ip handle 17/0xfffff fw flowid 20:17
    
    iptables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 14:75:90:F7:97:7D -d 0.0.0.0/0 -j MARK --set-mark 257/0xfffff
    iptables: No chain/target/match by that name.
    ip6tables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 14:75:90:F7:97:7D -d 0.0.0.0/0 -j MARK --set-mark 257/0xfffff
    /usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
    iptables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 14:75:90:F7:97:7D -d 0.0.0.0/0 -j MARK --set-mark 257/0xfffff
    ip6tables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 14:75:90:F7:97:7D -d 0.0.0.0/0 -j MARK --set-mark 257/0xfffff
    /usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
    /usr/sbin/tc class add dev eth1 parent 20:1 classid 20:17 hfsc sc rate 204800kbit ul rate 204800kbit
    /usr/sbin/tc filter add dev eth1 parent 20:0 protocol ip handle 257/0xfffff fw flowid 20:17
    /usr/sbin/tc class add dev ifb4eth1 parent 20:1 classid 20:17 hfsc sc rate 102400kbit ul rate 102400kbit
    /usr/sbin/tc filter add dev ifb4eth1 parent 20:0 protocol ip handle 257/0xfffff fw flowid 20:17
    

    在设备eth1的父类parent 20:1下面添加子类classid 20:17,

    mac=00:66:88:11:33:33,upload=3333,download=4444

    iptables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:33 -d 0.0.0.0/0 -j MARK --set-mark 18/0xfffff
    iptables: No chain/target/match by that name.
    ip6tables -t mangle -D QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:33 -d 0.0.0.0/0 -j MARK --set-mark 18/0xfffff
    /usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
    iptables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:33 -d 0.0.0.0/0 -j MARK --set-mark 18/0xfffff
    ip6tables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 00:66:88:11:33:33 -d 0.0.0.0/0 -j MARK --set-mark 18/0xfffff
    /usr/lib/zqos/start-zqos: eval: line 1: ip6tables: not found
    /usr/sbin/tc class add dev eth1 parent 20:1 classid 20:18 htb quantum 1500 rate 4444kbit ceil 4444kbit
    /usr/sbin/tc filter add dev eth1 parent 20:0 protocol ip handle 18/0xfffff fw flowid 20:18
    /usr/sbin/tc class add dev br-lan parent 20:1 classid 20:18 htb quantum 1500 rate 3333kbit ceil 3333kbit
    /usr/sbin/tc filter add dev br-lan parent 20:0 protocol ip handle 18/0xfffff fw flowid 20:18
    
    

    net/sched/:
    https://www.cnblogs.com/flintlovesam/p/6840596.html
    https://wenku.baidu.com/view/2c99fafc910ef12d2af9e71b.html?sxts=1561714949625

    TC规则:
    https://www.cnblogs.com/endsock/archive/2011/12/09/2281519.html
    https://wenku.baidu.com/view/324fc91a964bcf84b9d57b01.html?sxts=1561974466327

    qdisc队列规则算法说明:
    https://blog.csdn.net/zhaobryant/article/details/38797739

    应用:
    https://www.cnblogs.com/flintlovesam/p/8858200.html

    iptables+tc命令实现ip组限速功能:
    https://blog.csdn.net/dxt1107/article/details/86019972

    相关文章

      网友评论

        本文标题:5-TC规则(traffic control)IP限速

        本文链接:https://www.haomeiwen.com/subject/vbxnghtx.html