首先,我们来看一下tc,TC(Traffic Control)命令,是linux自带的告警流控命令。Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。一般只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以可以通过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。

限速场景,需要对当前设备的发包做限制。(其实本来想在接收包时做限制,但是tc只能对发包限制,收包限制不住)当前ens8端口为10GE光口,带宽可以达到1250MB/s。我们先限制总的网络流速为10000Mbit/s,然后再创建子类,将子类限制流速为100Mbit/s,最后再使用iptables命令将发包的端口与子类关联,达到对端口限速的目的。具体操作如下:

  1. #查看现有的队列
  2. tc -s qdisc ls dev eth0
  3.  
  4. #查看现有的分类
  5. tc -s class ls dev eth0
  6.  
  7. #清理iptables Mangle规则
    iptables -t mangle -F
  8.  
  9. #清理ens8上原有的队列类型
    tc qdisc del dev ens8 root
  10.  
  11. #创建队列
  12. tc qdisc add dev ens8 root handle : htb default
  13. #添加一个htb队列,绑定到eth0上,命名为1: ,默认归类为1
  14. #handle:为队列命名或指定某队列
  15.  
  16. #创建分类
  17. tc class add dev ens8 parent : classid : htb rate 10000Mbit
  18. #为ens8下的root队列1:0添加一个分类并命名为1:,类型为htb,带宽为10000M
  19. #rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类.
  20.  
  21. #创建一个子分类
  22. tc class add dev ens8 parent : classid : htb rate 100Mbit ceil 100Mbit
  23. #为1:1类规则添加一个名为1:10的类,类型为htb,带宽为100M
    #ceil: ceil是一个类最大能得到的带宽值.
  1. #为了避免一个会话永占带宽,添加随即公平队列sfq.
    tc qdisc add dev ens8 parent : handle : sfq perturb
    #perturb:是多少秒后重新配置一次散列算法,默认为10秒
    #sfq,可以防止一个段内的一个ip占用整个带宽
  2.  
  3. #使用u32创建过滤器
    tc filter add dev ens8 protocol ip parent : prio u32 match ip sport 46320 flowid :
    #执行此步时总是报错(Illegal “match”) 注意flowid需要与classid相同
  4.  
  5. #上步执行报错,采用iptables方式限速
    #创建过滤器并制定handle
    tc filter add dev ens8 parent 1:0 protocol ip prio 1 handle 10 fw classid 1:10
  6.  
  7. #使用iptables对端口绑定tc队列
    iptables -A OUTPUT -t mangle -p tcp --sport 46320 -j MARK --set-mark 10
    #set-mark与classid相同

完成上述配置后,当从端口46320发出去的包得到了限速,通过包大小以及包个数,传输包的时间大概统计出带宽值如下:

  1. Trans data for times, average time for every process:
  2. 0.0513210330009
  3. average time 0.0513210330009
  4. bandwidth 11.1887605612 MB/s

带宽与设置的限速吻合,从其他端口发出去的包没有收到限制,带宽较大,如下:

  1. Trans datafor times, average time for every process:
  2. 0.00130607795715
  3. average time 0.00130607795715
  4. bandwidth 439.651206771 MB/s

原理后续分析,未完待续。。。

参考博客

https://my.oschina.net/adailinux/blog/1631371

https://www.diannaobos.com/post/609.html

使用iptables和tc对端口限速的更多相关文章

  1. 【转】 LINUX中IPTABLES和TC对端口的带宽限制 端口限速

    不管是iptables还是tc(traffic control)功能都很强大,都是与网络相关的工具,那么我们就利用这两个工具来对端口进行带宽的限制. 1.使用命令ifconfig查看服务器上的网卡信息 ...

  2. centos tc 端口限速

    #http://www.fx114.net/qa-178-108967.aspx#http://professor.blog.51cto.com/996189/1569481/#http://blog ...

  3. 使用tc ingress来限速接收方向

    Linux中的QoS分为入口(Ingress)部分和出口(Egress)部分,入口部分主要用于进行入口流量限速(policing),出口部分主要用于队列调度(queuing scheduling).大 ...

  4. tc令牌桶限速心得

    一.实验拓扑与实验现象 实验拓扑如图所示,在①号机上发送数据,③号机上接受数据,同时在④号机的eth1与eth2网口限制速率为115200kbps,命令如下 tc qdisc add dev eth1 ...

  5. 关于nginx安装、iptables设置和查看端口指令netstat/ss

    实验1: Nginx介绍 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP ...

  6. Cisco端口限速配置

    作者:邓聪聪 Cisco端口限速的配置 配置案例如下: 定义策略组: access-list ID permit ip any any 模版关联策略组: class-map match-all nam ...

  7. CentOs7 使用iptables防火墙开启关闭端口

    CentOs7 使用iptables防火墙开启关闭端口   # 0x01介绍 iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分iptables文件设置路径:命令:v ...

  8. CentOS 7 设置iptables防火墙开放proftpd端口

    由于ftp的被动模式是这样的,客户端跟服务器端的21号端口交互信令,服务器端开启21号端口能够使客户端登录以及查看目录.但是ftp被动模式用于传输数据的端口却不是21,而是大于1024的随机或配置文件 ...

  9. 【转载】iptables、tc和ip命令

    2.3 CommandListener中的命令 CL一共定义了11个命令,这些命令充分反映了Netd在Android系统中网络管理和控制方面的职责.本节首先介绍Linux系统中常用的三个网络管理工具, ...

随机推荐

  1. 令人头疼的Connection Reset

    背景: 要爬取某网站的数据,数据每页10条,有很多页(形式如同table表格).使用HttpClient 逐行逐页爬取数据,但在循环爬取多次时,总会在不确定的位置报错 在检查代码逻辑无果之后,开始疯狂 ...

  2. 解决:启动项目报错 java.lang.UnsatisfiedLinkError: D:\Java\apache-tomcat-8.0.17\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

    启动项目报错如下: java.lang.UnsatisfiedLinkError: D:\Java\apache-tomcat-8.0.17\bin\tcnative-1.dll: Can't loa ...

  3. kali 的端口扫描nmap

    输入“nmap+空格+“-O”+空格+IP地址或域名. 扫描所有TCP端口:输入“nmap+空格+“-sT”+空格+IP地址或域名” 扫描所有开放的UDP端口:输入“nmap+空格+”-sP”+空格+ ...

  4. PRINCE2认证与其他项目管理认证标准有何不同?

    国际项目管理协会 (IPMA)根据国际能力基线建立了一种国际公认的标准,并由其各国协会译成各国语言.这是IPMA四级证书的基础,现在已在全世界推广.可喜的是,PRINCE2与这个标准高度一致. 美国项 ...

  5. 如何去掉HTML代码来获取纯文本?

    public string TextNoHTML(string Htmlstring) { //删除脚本 Htmlstring = Regex.Replace(Htmlstring, @"& ...

  6. 沉淀,再出发:python爬虫的再次思考

    沉淀,再出发:python爬虫的再次思考 一.前言    之前笔者就写过python爬虫的相关文档,不过当时因为知识所限,理解和掌握的东西都非常的少,并且使用更多的是python2.x的版本的功能,现 ...

  7. Samba文件共享服务器配置

    Samba起源: 早期网络想要在不同主机之间共享文件大多要用FTP协议来传输,但FTP协议仅能做到传输文件却不能直接修改对方主机的资料数据,这样确实不太方便,于是便出现了NFS开源文件共享程序:NFS ...

  8. Radix Sorts

    基数排序 Strings In Java Char Data Type C 语言中的字符数据类型占一个字节(8 比特),最多只能表示 256 个字符.支持 7 位的标准 ASCII(American ...

  9. 创建工程支持scala代码开发

    第一步:idea当中创建创建普通maven工程 File ==> New ==> Project 第二步:修改pom.xml添加scala的版本以及打包插件 <dependencie ...

  10. 用valgrind检测php扩展内存泄露

    原文:https://bugs.php.net/bugs-getting-valgrind-log.php 前提 1,编译php的时候,必须要带上--enable-debug选项. 2,禁用php的内 ...