使用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 : htb default
#添加一个htb队列,绑定到eth0上,命名为1: ,默认归类为1
#handle:为队列命名或指定某队列 #创建分类
tc class add dev ens8 parent : classid : htb rate 10000Mbit
#为ens8下的root队列1:0添加一个分类并命名为1:,类型为htb,带宽为10000M
#rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类. #创建一个子分类
tc class add dev ens8 parent : classid : htb rate 100Mbit ceil 100Mbit
#为1:1类规则添加一个名为1:10的类,类型为htb,带宽为100M
#ceil: ceil是一个类最大能得到的带宽值.
#为了避免一个会话永占带宽,添加随即公平队列sfq.
tc qdisc add dev ens8 parent : handle : sfq perturb
#perturb:是多少秒后重新配置一次散列算法,默认为10秒
#sfq,可以防止一个段内的一个ip占用整个带宽 #使用u32创建过滤器
tc filter add dev ens8 protocol ip parent : prio u32 match ip sport 46320 flowid :
#执行此步时总是报错(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 times, average time for every process:
0.0513210330009
average time 0.0513210330009
bandwidth 11.1887605612 MB/s
带宽与设置的限速吻合,从其他端口发出去的包没有收到限制,带宽较大,如下:
Trans datafor 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
使用iptables和tc对端口限速的更多相关文章
- 【转】 LINUX中IPTABLES和TC对端口的带宽限制 端口限速
不管是iptables还是tc(traffic control)功能都很强大,都是与网络相关的工具,那么我们就利用这两个工具来对端口进行带宽的限制. 1.使用命令ifconfig查看服务器上的网卡信息 ...
- centos tc 端口限速
#http://www.fx114.net/qa-178-108967.aspx#http://professor.blog.51cto.com/996189/1569481/#http://blog ...
- 使用tc ingress来限速接收方向
Linux中的QoS分为入口(Ingress)部分和出口(Egress)部分,入口部分主要用于进行入口流量限速(policing),出口部分主要用于队列调度(queuing scheduling).大 ...
- tc令牌桶限速心得
一.实验拓扑与实验现象 实验拓扑如图所示,在①号机上发送数据,③号机上接受数据,同时在④号机的eth1与eth2网口限制速率为115200kbps,命令如下 tc qdisc add dev eth1 ...
- 关于nginx安装、iptables设置和查看端口指令netstat/ss
实验1: Nginx介绍 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP ...
- Cisco端口限速配置
作者:邓聪聪 Cisco端口限速的配置 配置案例如下: 定义策略组: access-list ID permit ip any any 模版关联策略组: class-map match-all nam ...
- CentOs7 使用iptables防火墙开启关闭端口
CentOs7 使用iptables防火墙开启关闭端口 # 0x01介绍 iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分iptables文件设置路径:命令:v ...
- CentOS 7 设置iptables防火墙开放proftpd端口
由于ftp的被动模式是这样的,客户端跟服务器端的21号端口交互信令,服务器端开启21号端口能够使客户端登录以及查看目录.但是ftp被动模式用于传输数据的端口却不是21,而是大于1024的随机或配置文件 ...
- 【转载】iptables、tc和ip命令
2.3 CommandListener中的命令 CL一共定义了11个命令,这些命令充分反映了Netd在Android系统中网络管理和控制方面的职责.本节首先介绍Linux系统中常用的三个网络管理工具, ...
随机推荐
- 设计模式入门,适配器模式,c++代码实现
// test07.cpp : Defines the entry point for the console application.// #include "stdafx.h" ...
- Linux-debian系统 /etc/network/interface 文件解读
原文 http://wiki.slimdevices.com/index.php/SqueezeOS_networking 话说Debian系的网卡配置跟Redhat系很不一样,Redhat是放在/e ...
- eclipse中实现文本换行
Eclipse 使用系统内置的“ Text Editor ”做为文本编辑器,这个文本编辑器有一个问题,就是文本无法换行. 扩展插件 WordWrap 可以实现文本换行 安装方法: ...
- DBUtils结果集处理器介绍
common-dbutils.jar是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能. 1.QueryRunner类 ① ...
- 简单Json序列化和反序列化
序列化是什么: 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得.序列化分为两大部分:序列化和反序列化.序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络 ...
- php备注
一.关于OOP 1.PHP目前不支持方法重载
- seacms 6.45 命令执行漏洞分析
前言 这是一个比较老的漏洞了,不过漏洞原理还是挺有意思的. 正文 漏洞位于 search.php 文件中. 首先包含了 common.php, 这个文件里面做了一些初始化工作,其中最重要的是对提交参数 ...
- PHP匿名函数(闭包)
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值.当然,也有其它应用的情况. ...
- Oracle 计算两个日期间隔的天数、月数和年数
在Oracle中计算两个日期间隔的天数.月数和年数: 一.天数: 在Oracle中,两个日期直接相减,便可以得到天数: select to_date('08/06/2015','mm/dd/yyyy' ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境
1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...