使用 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.各个模 ...
随机推荐
- QT笔记之不规则窗口的实现
QT实现的不规则窗口,是根据图片的形状显示 1.去标题栏 2.设置窗口背景为透明色 3.最后给窗口设置背景色 注:背景图为镂空的 格式为.png 图片资源下载:http://pan.baidu.com ...
- shell学习笔记1
知识点1.修改输出的颜色 echo -e "\e[1;31m This is red text \e[0m" 其中,\e[1;31m 表示将输出显示为红色: \e[0m 标识将颜色 ...
- AlarmManager 实现闹钟的基本功能
先上效果图 这是一个利用AlarmManager做的最简单的闹钟!迟点再把重复响铃(例如星期一,星期三,重复响铃) 1.MainActivity package com.example.domeref ...
- Oracle的不完全恢复
一.不完全恢复特性 1.不完全恢复 不完全恢复仅仅是将数据恢复到某一个特定的时间点或特定的SCN,而不是当前时间点.不完全恢复会影响整个数据库,需要在MOUNT状 态下进行.在不完全恢复成功之后,通 ...
- PHP 小方法之 显示 今天 昨天 上周 上月 近三月 的时间
if(!function_exists('get_date_array')){ function get_date_array(){ $_NOW = time(); $today_begin = st ...
- 查看rpm和war包内容
解压rpm包的内容:(没有安装,就像解压tgz包一样rpm包)rpm2cpio *.rpm | cpio -div 解压war包的内容: jar -xvf project.war 解压到当前目录
- CSS3中的Transition属性详解
w3c标准中对CSS3的transition这是样描述的:“CSS的transition允许CSS的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击.获得焦点.被点击或对元素任何改变中触发, ...
- ssm(spring,springmvc,mybatis)
1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...
- Android开发--ImageView的应用
1.简介 当要在屏幕上显示图片时,ImageView用于创建显示图片所需的对象.另外,通过设置ImageView可以改变图片的有关属性. 2.构建 使用Images & Media中的部件来实 ...
- C# 跨线程调用控件
在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应. 同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效 第一种办法:禁 ...