当前位置:操作系统 > Unix/Linux >>

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

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

本文来自:http://www.xiaoyaxiao.com/72206.html
发表您的高见!
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,