linux下使用命令TC进行网络限流 —— 筑梦之路

news2024/11/17 20:25:50

Linux 下的流量控制原理

通过对包的排队,我们可以控制数据包的发送方式。这种控制,称之为数据整形,shape the data,包括对数据的以下操作:

  • 增加延时

  • 丢包

  • 重新排列

  • 重复、损坏

  • 速率控制 在 qdisc-class-filter 结构下,对流量进行控制需要进行三个步骤:

  • 创建 qdisc 队列 上面提到 Linux 是通过包的排队进行流量的控制,那么首先得有一个队列。

  • 创建 class 分类 class 实际上,就是划分流量策略分类。比如划分两档流量限速 10MBps、20MBbs。

  • 创建 filter 过滤 虽然创建了 class 分类,但是并没有将任何的 IP、Port 绑定到 class 上,此时并不会有控制作用。还需要创建 filter 将指定的 IP、Port 绑定到 class 上,才能使流量控制 class 生效于资源。

TC 是 Linux 下提供的流量控制工具,也是 Cilium/eBPF 等网络组件的核心基础设施之一

限制指定 IP、Port 对本机的访问速度

# 查看网卡

ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 1.1.1.1  netmask 255.255.254.0  broadcast 1.1.1.1
        inet6 1::1:1:1:1  prefixlen 64  scopeid 0x20<link>
        ether 1:1:1:1:1:1  txqueuelen 1000  (Ethernet)
        RX packets 2980910  bytes 2662352343 (2.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1475969  bytes 122254809 (116.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 配置 qdisc-class-filter

## 创建 qdisc 根队列

tc qdisc add dev eth0 root handle 1: htb default 1

## 创建第一级 class 绑定所有带宽资源 注意这里的单位是 6 MBps,也就是 48 Mbps

tc class add dev eth0 parent 1:0 classid 1:1 htb rate 6MBps burst 15k

## 创建子分类 class 可以创建多个子分类,对资源的流量进行精细化管理

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 6MBps ceil 10MBps burst 15k

这里 ceil 设置的是上限,正常情况下限速为 6MBps,但网络空闲时,可以达到 10 MBps

## 创建过滤器 filter,限制 IP

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 1.2.3.3 flowid 1:10

这里对 1.2.3.4 进行限制带宽为 1:10,也就是 6MBps。当然,你也可以直接给网段 1.2.0.0/16 加 class 策略。

# 查看并清理配置

## 查看 class 配置

tc class show dev eth0

class htb 1:10 parent 1:1 leaf 10: prio 0 rate 48Mbit ceil 80Mbit burst 15Kb cburst 1600b 
class htb 1:1 root rate 48Mbit ceil 48Mbit burst 15Kb cburst 1590b

## 查看 filter 配置

tc filter show dev eth0

filter parent 1: protocol ip pref 1 u32 chain 0 
filter parent 1: protocol ip pref 1 u32 chain 0 fh 800: ht divisor 1 
filter parent 1: protocol ip pref 1 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:10 not_in_hw 
  match 01020303/ffffffff at 16

## 清理全部配置

tc qdisc del dev eth0 root

限制本机对指定 IP、Port 的访问速度

由于排队规则主要是基于出口方向,不能对入口方向的流量(Ingress)进行限制。因此,我们需要将流量重定向到 ifb 设备上,再对 ifb 的出口流量(Egress)进行限制,以最终达到控制的目的

## 启用虚拟网卡

modprobe ifb numifbs=1

## 启用 ifb0 虚拟设备

ip link set dev ifb0 up

## 配置 qdisc-class-filter

### 添加 qdisc

tc qdisc add dev eth0 handle ffff: ingress

### 重定向网卡流量到 ifb0

tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

### 添加 class 和 filter

tc qdisc add dev ifb0 root handle 1: htb default 10
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 6Mbps
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 6Mbps
tc filter add dev ifb0 parent 1:0 protocol ip prio 16 u32 match ip dst 1.2.3.4  flowid 1:10


-------------------------------------------------------------
查看并清理配置

## 查看 class 配置

tc class show dev ifb0

class htb 1:10 parent 1:1 prio 0 rate 48Mbit ceil 48Mbit burst 1590b cburst 1590b 
class htb 1:1 root rate 48Mbit ceil 48Mbit burst 1590b cburst 1590b

## 查看 filter 配置

tc filter show dev ifb0

filter parent 1: protocol ip pref 16 u32 chain 0 
filter parent 1: protocol ip pref 16 u32 chain 0 fh 800: ht divisor 1 
filter parent 1: protocol ip pref 16 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:10 not_in_hw 
  match 01020304/ffffffff at 16

## 清理全部配置

tc qdisc del dev eth0 ingress
tc qdisc del dev ifb0 root
modprobe -r ifb

限速本机对指定IP访问,进入的流量被限制在 6 MBps 以下,而出去的流量不被限制

 参考资料:

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

Linux 端口限流(tc + iptables)_大泽上的扶桑树的博客-CSDN博客_tc限流将所有端口都限流了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ADI Blackfin DSP处理器-BF533的开发详解64:电子相册的设计(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了将 SD 卡根目录下的所有文件进行文件列表&#xff0c;然后将 480*272 尺寸的 JPEG 文件进行 JPEG 解码&#xff0c;将解…

校园跳蚤市场平台/校园二手交易系统

摘 要 本文论述了校园跳蚤市场平台的设计和实现&#xff0c;该网站从实际运用的角度出发&#xff0c;运用了计算机网站设计、数据库等相关知识&#xff0c;网络和Mysql数据库设计来实现的&#xff0c;网站主要包括学生注册、学生登录、浏览商品、搜索商品、查看商品并进行购买…

Blender——“苹果”建模

效果图 1.调出点线面面板&#xff0c;衰减编辑 1.1打开blender&#xff0c;点击常规&#xff0c;按A全选物体&#xff08;摄像头、光源、正方体&#xff09;&#xff0c;按delete删除。 1.2 在3D视图中添加一个经纬球。点击添加&#xff0c;选择网格—>经纬球。 1.3 点击下…

前端JS也可以连点成线(Vue中运用 AntVG6)

前言 什么是 G6&#xff1f;G6 是一个图可视化引擎。它提供了图的绘制、布局、分析、交互、动画等图可视化的基础能力。旨在让关系变得透明&#xff0c;简单。让用户获得关系数据的 Insight。其实说白了就是我们前端中的绘图工具&#xff1b;基于 G6&#xff0c;用户可以快速搭…

Linux基础知识-文件目录结构及基本属性

1、前言 上一篇我们讲到了Linux 文件类型7种类型&#xff0c;本篇我们说说Linux文件目录结构。 2、Linux 目录树 所有可操作的计算机资源都存在于目录树这个结构中&#xff0c;对计算资源的访问&#xff0c;可以看做是对这棵目录树的访问。Linux 的目录结构如下&#xff1a;…

常见日志框架使用及日志打印规范设计

文章目录一、slf4j 简介二、常用日志框架1&#xff09;log4jpom 依赖log4j.properties 文件配置测试参考2&#xff09;logbackpom 依赖logback.xml 配置测试参考3&#xff09; java.util.logging4&#xff09;commons loggingpom 依赖配置测试参考5&#xff09;slf4j-simplepom…

MFC UI控件相关

文章目录UI控件相关CDialog::OnInitDialog() 对话框初始化手动添加UpdateData() 刷新窗口数据DoDataExchange()数据与控件动态绑定afx_msg: 声明一个消息响应函数void AFXAPI DDX_Control( CDataExchange* pDX, int nIDC, CWnd& rControl );DDV_MaxChars()UI控件相关 CDia…

20天学会Rust第一天之Helloword

阿sir今天开始学习Rust了&#xff0c;至于为什么学习呢&#xff1f; 以后再说 我们都知道&#xff0c;程序设计 数据结构 算法。 因此&#xff0c;我们依次学习Rust中数据结构的定义&算法的实现&#xff0c;然后用它们实现一个简单的“hello world” 数据结构 Rust提供…

什么是IoC和AOP

IoC是什么&#xff1f; 控制反转&#xff1a;面向对象的设计的理念。上层建筑依赖下层建筑 理解&#xff1a;行李箱设计 轮子 --> 底盘 --> 箱体 --> 行李箱 如果改动轮子&#xff0c;则底盘、箱体、行李箱都需要进行调整。 依赖注入&#xff1a;将底层类作为参数…

Spring之底层架构核心概念-BeanFactory 与ApplicationContext

目录1.BeanFactory2.ApplicationContext3.关系4.总结1.BeanFactory BeanFactory是一个接口 public interface BeanFactory {xxx... }2.ApplicationContext ApplicationContext 也是一个接口&#xff0c;继承自ListableBeanFactory, HierarchicalBeanFactory public interfa…

非零基础自学Golang 第15章 Go命令行工具 15.2 代码获取(get) 15.3 格式化代码(fmt)

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.2 代码获取(get)15.3 格式化代码(fmt)第15章 Go命令行工具 15.2 代码获取(get) go get命令用于从远程仓库中下载安装远程代码包&#xff0c;这是我们常用且非常重要的指令。 我们在开发程序时往往需要引…

Gateway网关-网关作用介绍

为什么需要网关&#xff1f; 如果允许任何人访问微服务&#xff0c;查看我们的敏感业务&#xff0c;这样数据是不是不安全。如果是我们的工作人员并且有相应的查看权限&#xff0c;我们才提供访问权限。那谁来做这件事呢&#xff1f;就是我们的网关。 网关的功能作用 1&#xf…

鼎镁科技冲刺上交所:年营收18亿 拟募资13亿

雷递网 雷建平 12月21日鼎镁新材料科技股份有限公司&#xff08;简称&#xff1a;“鼎镁科技”&#xff09;日前递交招股书&#xff0c;准备在上交所主板上市。鼎镁科技计划募资12.86亿元。其中&#xff0c;8.84亿元用于轻量化新材料生产、研发建设项目&#xff0c;2.53亿元用于…

消息号F5155处理办法

消息号F5155&#xff08;没有公司代码XDJT中买卖双方的资金权限&#xff09;处理办法 OBA4先检查用户的FI容差组 OB57查看分配用户给容差组&#xff0c;确认是否书写正确的容差组。

《疫情下的编程岁月》序言导读目录

导读 《疫情下的编程岁月》是一部为初学者编写的编程指南&#xff0c;作者是一名 13 岁的编程学习者和优质技术博主。在这部指南中&#xff0c;作者分享了自己在过去 5 年里学习编程技术的经历&#xff0c;并提供了宝贵的建议和技巧&#xff0c;帮助初学者更好地了解编程学习的…

math@间断点@微积分基本定理@变限积分求导公式

文章目录间断点第一类间断点跳跃间断点可去间断点例第二类间断点微积分定理第一基本定理变上限积分函数的导数定积分的角度原函数存在定理&#x1f60a;应用例例微积分第二基本定理变限积分求导公式例math间断点微积分基本定理变限积分的求导公式 间断点 第一类间断点 跳跃间…

SwiftUI开源库之 什么是 Lottie?Airbnb 的跨平台开源库,用于渲染矢量运动图形

什么是 Lottie Lottie是 Airbnb 的跨平台开源库,用于渲染矢量运动图形。我们在 Airbnb 广泛使用 Lottie,它还为整个行业的数千个其他应用程序中的动画提供支持。 发布了适用于 iOS 的Lottie 4.0 。这个主要的新版本通过由 Core Animation 提供支持的全新渲染引擎,为所有 L…

Flutter开发:仿iOS侧滑删除效果的实现

前言 在Flutter开发中&#xff0c;基于原生移动端开发的思想也会运用到混合开发中&#xff0c;尤其是原生移动的的好的特性和交互效果更是如此。在现在的发展情况下&#xff0c;Flutter下的混合开发已经越来越替代原生移动的开发&#xff0c;同时也会继承原生开发的优点&#x…

5年Java经验,定级阿里P7,所有经验全在这份Java核心知识笔记里了

前言 今年的大环境非常差&#xff0c;互联网企业裁员的现象比往年更严重了&#xff0c;可今年刚好是我的第一个“五年计划”截止的时间点&#xff0c;说什么也不能够耽搁了&#xff0c;所以早早准备的跳槽也在疫情好转之后开始进行了。但是&#xff0c;不得不说&#xff0c;这次…