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

本文介绍如何使用IMQ中介队列设备配合Iptables实现精准的上传下载限速,包括网络环境搭建、数据包流程分析及具体配置步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 prio 100 u32 \
           match ip src 192.168.0.2 classid 1:10
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值