使用 IMQ+HTB+iptable 统一流量控制心得
IMQ 是中介队列设备的简称,是一个虚拟的网卡设备,与物理网卡不同的是,通过它可以进行全局的流量整形,不需要一个网卡一个网卡地限速。这对有多个ISP接入的情况特别方便。配合 Iptables,可以非常方便地进行上传和下载限速。
IMQ(Intermediate queueing device,中介队列
设备)
中介队列设备不是一个队列规定,但它的使用与队列规定是紧密相连的.就Linux
而言,队列规定是附带在网卡上的,所有在这个网卡上排队的数据都排进这个队
列规定.根据这个概念,出现了两个局限:
1. 只能进行出口整形(虽然也存在入口队列规定,但在上面实现分类的队列规定
的可能性非常小).
2. 一个队列规定只能处理一块网卡的流量,无法设置全局的限速.
IMQ就是用来解决上述两个局限的.简单地说,你可以往一个队列规定中放任
何东西.被打了特定标记的数据包在netfilter的NF_IP_PRE_ROUTING 和
NF_IP_POST_ROUTING两个钩子函数处被拦截,并被送到一个队列规定中,该
队列规定附加到一个IMQ设备上.对数据包打标记要用到iptables的一种处理方
法.
这样你就可以对刚刚进入网卡的数据包打上标记进行入口整形,或者把网卡们当
成一个个的类来看待而进行全局整形设置.你还可以做很多事情,比如:把http
流量放到一个队列规定中去,把新的连接请求放到一个队列规定中去,……
一、网络环境简介
目的站点 (Internet)
IP: 218.x.x.x (用 TARGET_IP 表示)
路由器 (Router)
eth1_外网IP: 221.x.x.x (用INET_IP表示)
eth0_内网IP: 192.168.0.1 (用 GW_IP 表示)
内网客户机 (PC)
IP: 192.168.0.2 (用 LAN_IP 表示)
二、数据包流程分析
要明白怎么控制流量,在什么地方控制,首先得弄清楚数据包从进网卡到出网卡这个过程中,内核对数据包做了哪些操作,具体可以看这里的图示:
http://www.docum.org/docum.org/kptd/
下面就客户机上传下载时,数据包的流程走向进行一些分析
下载流程
========
PC 向 Internet 发起数据下载请求
Internet 回应相应数据
数据包通过 eth1 流入 Router [src: TARGET_IP, dst: INET_IP]
Router 重写目的地址(DNAT) [src:TARGET_IP, dst: LAN_IP]
转发到局域网网卡 eth0
通过 eth0 流出 Router, 进入局域网
PC 接收到数据
显然,要控制 PC 的下载速率,在 DNAT 之后可以做到
小结: 下载控制, 控制外网向客户机发送数据的速率
(在 DNAT之后, iptables 的 POSTROUTING 链)
上传流程
========
Internet 向 PC 发起数据上传请求
PC 回应相应数据
数据包通过 eth0 流入 Router [src: LAN_IP, dst: TARGET_IP]
Router 重写源标地址(SNAT) [src:INET_IP, dst: TARGET_IP]
转发到广域网网卡 eth1
通过 eth1 流出 Router, 进入 Internet
Internet 接收到数据
显然,要控制 PC 的上传速率,在 SNAT 之前可以做到
小结: 上传控制, 控制客户机向外网发送数据的速率
(在 SNAT之前, iptables 的 PREROUTING 链)
三、让Linux支持 IMQ
Linux 内核以及 Iptables 并不直接支持 IMQ, 需要打补丁才行.
我用的是 linux-2.6.18, iptables-1.3.6,可以从 http://www.linuximq.net/
或 http://www.digriz.org.uk/jdg-qos-script/ 下载到
打补丁的过程就不多说了....
内核支持 IMQ 后,通过 ip link show 可以看到有 imq0 这样的设备
(有多少个取决于你编译内核时的配置,默认有2个)
四、配合 Iptables 限速
假设 imq0 用于下载限速,imq1 用于上传限速, 先设置好 imq 设备的队列规定、过滤器之类的,如同真实网卡一样
IMQ 规则定义好后,只需在 iptables 的 mangle 链中加入2条规则即可:
#### 下载限速, 出口 eth0
iptables -t mangle -A POSTROUTING -o eth0 -j IMQ --todev 0
#### 上传限速,入口 eth0
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 1
五、单机限速
下载限速: 判断数据包的目的 IP
上传限速: 判断数据包的来源 IP
提示: 由于上传限速流控点是在 SNAT 之前,那是数据包里面还含有局域网IP的信息,故可以直接根据IP源信息来定位,无需再通过 iptables 做 MARK.
TC 例子:
### 限制 192.168.0.2 下载 100K,最大 120K
tc class add dev imq0 parent 1:1 classid 1:10 htb \
rate 100kbps ceil 120kbps burst 10kb prio 2
tc qdisc add dev imq0 parent 1:10 handle 10 sfq perturb 10
tc filter add dev imq0 protocol ip parent 1:0 prio 100 u32 \
match ip dst 192.168.0.2 classid 1:10
### 限制 192.168.0.2 上传 40K,最大 50K
tc class add dev imq1 parent 1:1 classid 1:10 htb \
rate 40kbps ceil 50kbps burst 10kb prio 2
tc qdisc add dev imq1 parent 1:10 handle 10 sfq perturb 10
tc filter add dev imq1 protocol ip parent 1:0 prio 100 u32 \
match ip src 192.168.0.2 classid 1:10
9.7.1. 配置范例
我们首先想到的是进行入口整形,以便让你自己得到高保证的带宽 .就象配置
其它网卡一样:
tc qdisc add dev imq0 root handle 1: htb default 20
tc class add dev imq0 parent 1: classid 1:1 htb rate 2mbit burst 15k
tc class add dev imq0 parent 1:1 classid 1:10 htb rate 1mbit
tc class add dev imq0 parent 1:1 classid 1:20 htb rate 1mbit
tc qdisc add dev imq0 parent 1:10 handle 10: pfifo
tc qdisc add dev imq0 parent 1:20 handle 20: sfq
tc filter add dev imq0 parent 10:0 protocol ip prio 1 u32 match ip dst 10.0.0.230/32 flowid 1:10
在这个例子中,使用了u32进行分类.其它的分类器应该也能实现.然后,被打
上标记的包被送到imq0排队.
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0
ip link set imq0 up
iptables的IMQ处理方法只能用在PREROUTING和POSTROUTING链的mangle
表中.语法是:
IMQ [ --todev n ]
n: imq设备的编号
注:ip6tables也提供了这种处理方法.
请注意,如果数据流是事后才匹配到IMQ处理方法上的,数据就不会入队.数
据流进入imq的确切位置取决于这个数据流究竟是流进的还是流出的.下面是
netfilter(也就是iptables)在内核中预先定义优先级:
enum nf_ip_hook_priorities {
NF_IP_PRI_FIRST = INT_MIN,
NF_IP_PRI_CONNTRACK = -200,
NF_IP_PRI_MANGLE = -150,
NF_IP_PRI_NAT_DST = -100,
NF_IP_PRI_FILTER = 0,
NF_IP_PRI_NAT_SRC = 100,
NF_IP_PRI_LAST = INT_MAX,
};
对于流入的包,imq把自己注册为优先权等于NF_IP_PRI_MANGLE+1,也就是
说数据包在经过了PREROUTING链的mangle表之后才进入imq设备.
对于流出的包,imq使用优先权等于NF_IP_PRI_LAST,也就是说不会白白处理
本应该被filter表丢弃的数据包.
关于补丁和更多的文档请参阅imq网站.
使用 IMQ+HTB+iptable 统一流量控制心得的更多相关文章
- NET Core微服务之路:简单谈谈对ELK,Splunk,Exceptionless统一日志收集中心的心得体会
前言 日志,一直以来都是开发人员和运维人员最关心的问题.开发人员可通过日志记录来协助问题定位,运维人员可通过日志发现系统隐患,故障等定位问题.如果你的系统中没有日志,就像一个断了线的风筝,你永远不知道 ...
- 架构实战项目心得(十):基于spring-ladp的统一用户中心结构设计以及代码结构设计
一.目录设计 1 公司 2 部门 3 注册人员 4 层级人员 二.规则 1 注册 自行注册人员放到模拟公司的目录下,等所属公司组织结构建立完毕,将此人员迁移到所属公司(或者删除此人员,所属公司新建此人 ...
- 架构实战项目心得(九):后台服务工具ldap:统一用户中心ldap工具使用以及安装
一.安装OpenLDAP 1.安装 yum -y install openldapopenldap-servers openldap-clients openldap-devel compat-ope ...
- Linux TC流量控制HOWTO中文版
<本文摘自Linux的高级路由和流量控制HOWTO中文版 第9章节>网人郭工进行再次编译: 利用队列,我们可以控制数据发送的方式.记住我们只能对发送数据进行控制(或称为整形).其实,我们无 ...
- linux下使用tc(Traffic Control) 流量控制命令模拟网络延迟和丢包
目录 TC案例 TC常用命令 TC安装 TC原理介绍 TC规则 TC操作原理 TC命名规则 TC单位 TC命令 TC案例 如何使用tc模拟网络延迟和丢包 修改网络延时: sudo tc qdisc ...
- Linux TC 流量控制介绍
前段时间在做一些测试的时候接触到了Linux tc,因为需要对数据包添加延迟,用到了tc中的netem.添加简单的延迟非常简单,像这样一条命令就搞定了:$ tc qdisc add dev eth0 ...
- Mysql数据库主从心得整理
管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行,希望对 ...
- asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...
- web.py学习心得
1.注意判断数字时,如果是get传递的参数,一定要用int转换.不然出错. 2.$var 定义时,冒号后的内容不是python内容,需加上$符号.如$var naviId:$naviId. 3.各个模 ...
随机推荐
- Bootstrap_标签
一.标签 在一些Web页面中常常会添加一个标签用来告诉用户一些额外的信息,比如说在导航上添加了一个新导航项,可能就会加一个“new”标签,来告诉用户. 那么在Bootstrap框架中特意将这样的效果提 ...
- Reapter合并行
html文件: <asp:Repeater ID="rptEmployee" runat="server"> <HeaderTemplate& ...
- 深入浅出设计模式——享元模式(Flyweight Pattern)
模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...
- 阿里云对象存储OSS————跨域资源共享(CORS)(m3u8 无法加载m3u8:跨域访问被拒绝)
今天在做视频直播录像的时候,添加一个录制APP的.M3U8文件到OSS的一个test文件中存储,结果是访问不到了: 提示:无法加载m3u8:跨域访问被拒绝!!!!! 项目代码测试地址:https:// ...
- Java面向对象三大特点之封装
封装 含义:将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体是类,类通常对客户隐藏其实现细节,这就是封装的思想.封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的 ...
- angular directive scope
angular directive scope 1.当directive 中不指定scope属性,则该directive 直接使用 app 的scope: 2.当directive 中指定scope属 ...
- KindEditor4.1.10,支持粘贴图片(转载!)
本人扩展了KindEditor4.1.10,使得他能够在Chrome和IE11中直接粘贴复制的图片(比如通过截图工具把图片直接保存在剪切板中),然后调用上传URL上传图片 方法,修改kindedito ...
- python内置函数 1
常用函数 abs(x) abs()返回一个数字的绝对值.如果给出复数,返回值就是该复数的模. >>>print abs(-100) 100 >>>print abs ...
- canvas滤镜6种效果吗
昨天写了一个canvas滤镜的取反色效果,今天加一点效果,主要思路都是一样的,改变getImageData.data[]的值,并返回 代码如下: <!DOCTYPE html> <h ...
- 查看Msi文件内容
1通过msiexec命令解压msi包 msiexec.exe /a c:\msi\installer.msi /qb targetdir=d:\msi\installer 2 使用Orca查看. Or ...