博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用iptables和tc对端口限速
阅读量:4543 次
发布时间:2019-06-08

本文共 1902 字,大约阅读时间需要 6 分钟。

    首先,我们来看一下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.0513210330009average time 0.0513210330009bandwidth 11.1887605612 MB/s

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

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

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

 

 

 

参考博客

转载于:https://www.cnblogs.com/xingmuxin/p/10793272.html

你可能感兴趣的文章
XXL-Job高可用集群搭建
查看>>
JDBC
查看>>
Python replace()方法
查看>>
Kestrel: System.Exception: Error -4092 EACCES permission denied
查看>>
mysql select
查看>>
Nginx学习——Nginx进程间的通信
查看>>
5.2 上午
查看>>
[LintCode] Sort Integers 整数排序
查看>>
71. Simplify Path
查看>>
CodeForces - 123E Maze
查看>>
ZOJ 1709 Oil Deposits(dfs,连通块个数)
查看>>
安卓开源项目周报0308
查看>>
记可敬可佩的老车同志
查看>>
Maven in 5 Minutes(Windows)
查看>>
常用前端开发工具合集
查看>>
T-SQL:SQL Server-数据开发(经典)
查看>>
IOS 截取字符串
查看>>
Apache 如何设置默认首页文档?
查看>>
NTP服务
查看>>
Hihocoder 二分图一·二分图判定
查看>>