当前位置: 首页 > 科技观察

Linux下如何使用TC优雅实现网络限流

时间:2023-03-18 12:30:47 科技观察

一、Linux下流量控制原理通过对数据包进行排队,我们可以控制数据包的发送方式。这种控制称为数据整形,对数据进行整形,包括以下对数据的操作:增加延迟、丢包、重排、重复、损坏率控制。在qdisc-class-filter结构下,控制流量需要三步步骤:创建qdisc队列上面提到linux是通过packetqueueing来控制流量的,所以首先要有一个队列。创建类分类类其实就是流量策略的分类。例如,有两个级别的流量限速,10MBps和20MBbs。创建filter创建了class分类,但是没有给class绑定任何IP和Port,此时没有控制作用。还需要创建一个过滤器,将指定的IP和Port绑定到类上,这样流控类才能对资源生效。TC是Linux下提供的流量控制工具,是Cilium/eBPF等网络组件的核心基础设施之一。2.限制指定IP和Port对本机的访问速度2.1查看网卡ifconfigeth0:flags=4163mtu1500inet1.1.1.1netmask255.255.254.0broadcast1.1.1.1inet61::1:1:1:1prefixlen64scopeid0x20ether1:1:1:1:1:1txqueuelen1000(以太网)RX数据包2980910字节2662352343(2.4GiB)RX错误0丢弃0溢出0帧0TXpackets9147596122254809(116.5MiB)TXerrors0dropped0overruns0carrier0collisions02.2配置qdisc-class-filter创建qdiscrootqueuetcqdiscadddeveth0roothandle1:htbdefault1CreatethefirstlevelclassBindallbandwidthresources这里注意单位是6MBps,也就是48Mbps。tcclassadddeveth0parent1:0classid1:1htbrate6MBpsburst15k创建子类一个类可以创建多个子类来微调资源流量管理。tcclassadddeveth0parent1:1classid1:10htbrate6MBpsceil10MBpsburst15k在这里,ceil设置上限。正常情况下,限速为6MBps,但在网络空闲时,可以达到10MBps。创建过滤器限制IPtcfilteradddeveth0protocolipparent1:0prio1u32matchipdst1.2.3.3flowid1:10这里将1.2.3.4的带宽限制为1:10,即6MBps。当然你也可以直接在1.2.0.0/16网段添加类策略。2.3查看和清理配置查看类配置tcclassshowdeveth0classhtb1:10parent1:1leaf10:prio0rate48Mbitceil80Mbitburst15Kbcburst1600bclasshtb1:1rootrate48Mbitceil48Mbitburst15Kbcburst查看过滤器159configuretcfiltershowdeveth0filterparent1:protocolippref1u32chain0filterparent1:protocolippref1u32chain0fh800:htdivisor1filterparent1:protocolippref1u32chain0fh800::800order2048keyht800bkt0flowid1:10not_in_hwmatch01020303/ffffffffat16清除所有配置tcqdiscdeldeveth0root3.限制本机对指定IP和端口的访问速度由于排队规则主要是根据在出口方向上,它们无法对入口流量(Ingress)进行限制。因此,我们需要将流量重定向到ifb设备,然后限制ifb的出口,达到控制的目的。3.1启用虚拟网卡将启用ifb0虚拟设备iplinksetdevifb0uponifbdevicemodprobeifbnumifbs=13.2配置qdisc-class-filteraddqdisctcqdiscadddeveth0handleffff:ingress将网卡流量重定向到ifb0tcfilteradddeveth0父ffff:协议ipu32匹配u3200操作镜像出口重定向devifb0添加类和filtertcqdisc添加devifb0根句柄1:htb默认10tc类添加devifb0父1:0classid1:1htadd速率6Mbpsdev类ifb0parent1:1classid1:10htbrate6Mbpsfilteradddevifb0parent1:0protocolipprio16u32matchipdst1.2.3.4flowid1:103.3查看清除配置下面是本机对本机的限速指定IP访问监控图的入站流量限制在6MBps以下,而出站流量不受限制。查看类配置tc类显示devifb0classhtb1:10parent1:1prio0rate48Mbitceil48Mbitburst1590bcburst1590bclasshtb1:1rootrate48Mbitceil48Mbitburst1590bcburst1590b查看过滤器配置b0shtc过滤器如果:协议ippref16u32chain0filterparent1:protocolippref16u32chain0fh800:htdivisor1filterparent1:protocolippref16u32chain0fh800::800order2048keyht800bidkt10flow:10not_in_hw匹配01020304/ffffffff在16清除所有配置tcqdiscdeldeveth0ingrestcqdiscdeldevifb0rootmodprobe-rifb