使用 IMQ+HTB+iptable 统一流量控制心得

王朝other·作者佚名  2008-05-21
宽屏版  字体: |||超大  

IMQ 是中介队列设备的简称,是一个虚拟的网卡设备,与物理网卡不同的是,通过它可以进行全局的流量整形,不需要一个网卡一个网卡地限速。这对有多个ISP接入的情况特别方便。配合 Iptables,可以非常方便地进行上传和下载限速。

一、网络环境简介

目的站点 (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 pr

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有