概述

1、linux tc工具限速是针对一个网卡的,主要分为三层:qdisc、filter、class;
qdisc: 队列,一个网卡一般只需要一个根队列(出向队列),如果有入向限速需求时,可以再创建一个入向队列;队列代表了所有经过这个网卡的流量;
filter: 过滤器,对qdisc中的数据流量进行匹配和操作,匹配符合规则的流量可以发送给对应的class进行操作;
class: 类别, 对filter符合的流量进行统一的带宽管理(多个filter过滤到的流量进行统一限速,类似共享带宽的实现),如果不需要统一限速,单独限速的场景中是不需要class的,filter可以直接对超过的带宽进行丢弃。

二、出向限速(egress)

1、对单一的IP进行限速

(1)添加根队列:
其中网卡是eth0, handle后的值是根队列的唯一编号,后续所有的filter都需要以这个编号为parent;

 tc qdisc add dev eth0 root handle 3: htb

(2)对单一的IP进行限速:
限速源ip为192.168.0.3的报文,限速为400mbit,突发值为200mbit,溢出的报文会丢弃;

 tc filter add dev eth0 parent 3: protocol ip prio 1  u32 match ip src 192.168.0.3 police rate 400mbit  burst 200mbit drop flowid :1

2、多个ip共享限速

(1)根队列添加和单一IP相同
(2)添加class
class也必须以qdisc id为parent,classid是它的编号,以冒号隔开,冒号前是qdisc id,冒号后是自己的id

tc class add dev eth0 parent 3: classid 3:2 htb  rate 100mbit ceil 100mbit

(3)添加filter
将两个ip发出的流量都指向这个class(3:2),filter的parent必须是qdisc 的id

 tc filter add dev qg-97d17332-6b parent 3:0  protocol ip prio 1 u32 match ip src 192.168.0.4 flowid 3:2tc filter add dev qg-97d17332-6b parent 3:0  protocol ip prio 1 u32 match ip src 192.168.0.3 flowid 3:2

三、入向限速(Ingress)

TC的入向限速是只支持filter,不支持class的,如果你只需要对单个ip或者网络限速,那和出向限速类似,但是如果需要共享限速或者其他的高级操作,需要创建class的时候,就不方便了。

大概是因为出向好做,入向不好实现。因为对于出向的流量,网络接口可以保存一时无法处理的数据包,再根据限速规则决定发送还是丢弃。但是对于入向流量,如果保存后再决定是否接受还是丢弃会有一些风险(接受流量如果过大,存不下之类的问题)。

因此入向的限速方法是将网卡的入向流量,导入到一个ifb类型的特殊虚拟网卡中,再由ifb网卡发出的时候对其进行出向限速。这个ifb网卡比较神奇,它就像嵌入到你的网卡中一样,可以只做限速不会影响原有的报文转发逻辑。
1、添加ifb0虚拟网卡(以下两个命令都会生成一个ifb0网卡,任选一个即可)

modprobe ifb numifbs=1
ip link add dev ifb0 type ifb

2、在eth0添加入向队列
入向队列,默认就是ffff编号,不用设置

tc qdisc add dev eth0  ingress

3、添加filter将流量转发到ifb0网卡
将目的地址(dst)为192.168.0.3的流量进行转发,mirred后面就是转发的目的和方式,redirect就是重定向。如果有多个流量可以多加filter。

tc filter add dev eth0 parent ffff:  protocol ip prio 1 u32 match ip dst 192.168.0.3  action mirred egress redirect dev ifb0

4、再ifb0网卡上进行出向限速,这个和eth0网卡出向限速的添加方式是一模一样的。唯一的区别是要注意,在filter中match里面匹配的要是dst。

四、IPV6限速

前面说的都是IPv4的限速,对于IPv6报文的限速就比较麻烦了,它不能直接匹配IPv6地址,只能匹配里面的具体字节,这就需要了解报文的结构了(实际上抓个包拿wireshark看看,也就知道ip对应的字节位置了)
以下命令匹配的报文时,ip地址地址是1211::338的报文。命令中at后面的值就是这个ip字节在报文中所处的相对位置

 tc filter add dev eth0  parent 3: protocol ipv6 prio 1 u32 \match u16 0x1211 0xffff at 8 \match u16 0x0000 0xffff at 10 \match u16 0x0000 0xffff at 12 \match u16 0x0000 0xffff at 14 \match u16 0x0000 0xffff at 16 \match u16 0x0000 0xffff at 18 \match u16 0x0000 0xffff at 20 \match u16 0x0338 0xffff at 22 classid 3:2

显然,命令里面是从8开始匹配的,但是实际报文如下图,对应的src_ip是在第22字节,大概是在tc匹配的时候,报文前面14字节的源目的mac和报文的eth.type已经被剥离了,需要注意。

五、IPV6和IPV4共同限速

如果一个网卡既有IPV4地址又有IPV6地址,都要进行限速,需要注意:
在创建filter时,同一优先级 prio下,只能有一种protocol(协议)类型,如果ipv4的filter创建选择了prio 1,则ipv6需要配置其他prio (比如prio 2)
否则会报错如下:

RTNETLINK answers: Invalid argument
We have an error talking to the kernel

使用Linux Tc实现入向和出向限速相关推荐

  1. Linux TC 流量控制与排队规则 qdisc 树型结构详解(以HTB和RED为例)

    1. 背景 Linux 操作系统中的流量控制器 TC (Traffic Control) 用于Linux内核的流量控制,它规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控 ...

  2. 弱网环境搭建之 Linux tc iptables 详解

    弱网环境搭建之 Linux tc 详解 0. 背景 1. 工具选择 2. 搭建流程 2.1 Linux tc 简介 2.2 弱网搭建思路 2.3 完整代码展示 0. 背景 笔者有一个需要搭建弱网环境来 ...

  3. 手贱随手在Linux敲了 as 命令,出不来了

    手贱随手在Linux敲了  as  命令,出不了命令,问问度娘吧,得到下列资料 as命令 GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器. 语法 as(选项)(参数) 选项 -ac:忽 ...

  4. linux系统入门学习Linux认证:linux系统学习方法入门体

    Linux认证考试:操作系统linux学习方法入门体 在学习linux的工程中,linux学习方法有很多种,这里是小编的学习,给大家拿出来分享一下, Linux!Linux只是个内核!这点很重要,你必 ...

  5. 剑指offer:面试题31. 栈的压入、弹出序列

    题目:栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 ...

  6. TFS命令tf:undo - 强制签入别人签出的文件

    TFS命令tf:undo - 强制签入别人签出的文件 转载于:https://www.cnblogs.com/skydau/archive/2012/10/09/2716601.html

  7. linux后台运行快捷键,Linux命令放入后台运行方法(和Ctrl+Z)详解版

    Linux 命令放入后台的方法有两种,分别介绍如下. "命令 &",把命令放入后台执行 第一种把命令放入后台的方法是在命令后面加入 空格 &.使用这种方法放入后台的 ...

  8. 【运筹学】单纯形法总结 ( 单纯形法原理 | 单纯形法流程 | 单纯形表 | 计算检验数 | 最优解判定 | 入基变量 | 出基变量 | 方程组同解变换 ) ★★★

    文章目录 一.单纯形法原理 二.单纯形法流程 三.单纯形法案例一 1.线性规划示例 2.转化标准形式 3.查找初始基可行解 4.初始基可行解的最优解判定 5.第一次迭代 : 入基与出基变量选择 6.第 ...

  9. 【数据结构】栈的压入、弹出序列

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等,例如序列1,2,3,4,5是某栈的压栈序列,序列,4,5,3,2,1是该压栈序列 ...

最新文章

  1. DDMMSS.SS转为DD
  2. 将MSRA-TD500标签转换成逆时针输出标签+labeleme json格式转四个点的txt
  3. windows Tracert命令
  4. 【转】Java 单例模式详解
  5. Windows Embedded Webcast 2008年1月预告
  6. 阿里云天池 学习赛汇总(教学赛,零基础入门,长期赛)
  7. linux wine 原理,wine的工作原理与自动运行PE程序
  8. 高速学英语- 大脑的不同学习机制
  9. 【Enhanced Time-Frequency Representation and Mode Decomposition】翻译1
  10. 关于python教学
  11. 好玩的centos代码简介()
  12. 使用chat-gpt 最新最快方法
  13. Windows下如何将文件打包压缩成 .tar.gz格式
  14. acm 2119 小火车嘟嘟
  15. Unity小游戏(二)——贪吃蛇
  16. 生物信息学与智能信息处理2021年学术会议(BIIP2021):会议总结
  17. 查找同一网络的计算机,win10系统查看同一个局域网内电脑ip的详细方法
  18. 在美国,你才是真的得不起病……
  19. excel删除工作空间恢复_在Excel 2007中有更多工作空间
  20. 如何解决react hook的闭包陷阱以及避开闭包陷阱做优化

热门文章

  1. 利用 Universal Transformer,翻译将无往不利!
  2. 澳大利亚公司称与中石油达成巨额售气协议
  3. 1亿美元成为超级富豪新基准,美国、中国、印度亿万富翁数量排全球前三位 | 美通社头条...
  4. IPFS节点对外入口
  5. 我是如何微信日涨四千粉的?
  6. linux 重启网卡命令
  7. 网络电视地址大全- -
  8. 学习微信小程序开发框架之脚本语言WXS
  9. django-ckeditor配置使用markdown语法
  10. oracle heavy swapping,WARNING: Heavy swapping observed on system in last 5 mins