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

流量控制器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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值