zoukankan      html  css  js  c++  java
  • 使用iptables和tc对端口限速

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

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

    #查看现有的队列
    tc -s qdisc ls dev eth0
    
    #查看现有的分类
    tc -s class ls dev eth0

    #清理iptables Mangle规则
    iptables -t mangle -F

    #清理ens8上原有的队列类型
    tc qdisc del dev ens8 root #创建队列 tc qdisc add dev ens8 root handle
    1:0 htb default 1 #添加一个htb队列,绑定到eth0上,命名为1:0 ,默认归类为1 #handle:为队列命名或指定某队列 #创建分类 tc class add dev ens8 parent 1:0 classid 1:1 htb rate 10000Mbit #为ens8下的root队列1:0添加一个分类并命名为1:1,类型为htb,带宽为10000M #rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类. #创建一个子分类 tc class add dev ens8 parent 1:1 classid 1:10 htb rate 100Mbit ceil 100Mbit #为1:1类规则添加一个名为1:10的类,类型为htb,带宽为100M
    #ceil: ceil是一个类最大能得到的带宽值.
    #为了避免一个会话永占带宽,添加随即公平队列sfq. 
    tc qdisc add dev ens8 parent
    1:10 handle 10: sfq perturb 10
    #perturb:是多少秒后重新配置一次散列算法,默认为10秒
    #sfq,可以防止一个段内的一个ip占用整个带宽

    #使用u32创建过滤器
    tc filter add dev ens8 protocol ip parent
    1:0 prio 1 u32 match ip sport 46320 flowid 1:10
    #执行此步时总是报错(Illegal “match”) 注意flowid需要与classid相同

    #上步执行报错,采用iptables方式限速
    #创建过滤器并制定handle
    tc filter add dev ens8 parent 1:0 protocol ip prio 1 handle 10 fw classid 1:10

    #使用iptables对端口绑定tc队列
    iptables -A OUTPUT -t mangle -p tcp --sport 46320 -j MARK --set-mark 10
    #set-mark与classid相同

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

    Trans data for 1000 times, average time for every process:
    0.0513210330009
    average time 0.0513210330009
    bandwidth 11.1887605612 MB/s

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

    Trans datafor 1000 times, average time for every process:
    0.00130607795715
    average time 0.00130607795715
    bandwidth 439.651206771 MB/s

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

    参考博客

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

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

  • 相关阅读:
    Python是如何进行内存管理的?
    scrapy利用set()对数据进行去重
    python快速抓取新闻标题及内容
    python爬虫第三方库
    Spring使用@Scheduled定时调度
    redis启动失败
    视图系统
    路由系统
    Django框架 part 2
    Django框架
  • 原文地址:https://www.cnblogs.com/xingmuxin/p/10793272.html
Copyright © 2011-2022 走看看