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,可以从
或 下载到
打补丁的过程就不多说了....
内核支持 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
阅读(8422) | 评论(0) | 转发(0) |