使用 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网站.

转载于:https://www.cnblogs.com/CasonChan/p/5033965.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
小包优先+web优先+2千多条游戏服务器IP优先+游戏爆发+连接数限制 番茄概念QOS脚本 主要概念: 1.小包优先定义: 上传数据包中长度小于128Byte并且状态为ESTABLISHED的数据包 下载数据包中长度小于256Byte并且状态为ESTABLISHED的数据包 这个ESTABLISHED是什么东东呢? 解释:TCP数据包有INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED等状态。 具体解释:http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html#USERLANDSTATES 这个ESTABLISHED指连接已经完全建立的数据包了,而NEW指新建一个连接所使用的第一个数据包。 这样,就排除了那些状态为NEW的小包。 好处:有些人总是热衷于“修改XP最大连接数”来提高BT下载速率。其实这个所谓的“最大连接数”是指“最大并发连接数”, 也就是XP每秒能够发送状态为NEW的数据包,默认值是10。有些垃圾的BT软件将其修改为1000,这样庞大的连接数将会导致 瞬间上传速率非常大,如果将其优先级设置太高,将会导致网络延迟的震荡(一会高一会低)。 PS:“修改XP最大连接数”是无法提高BT下载的速率的,最多可以提高达到最大速率的时间。比如说不修改30秒达到最大速率,修改 后可能10秒就达到最大速率。但是会带来操作系统不稳定,路由器压力增大,蠕虫攻击,网络延迟震荡等不良后果。 微软在IT业混了几十年,从来就不提倡所谓的“修改最大连接数”。 2.正常的web浏览相对于下载BT数据包具有较高的优先级。 3.游戏爆发的定义: 当某个内网IP的速率小于50KB/S的时候,那么该IP的数据包进入“游戏爆发队列”。时间为10秒。 “游戏爆发队列”的优先级仅仅低于“游戏队列” 对于那些只玩游戏不下载的IP有帮助。 4.连接数限制。PS:tcp连接数在ROS各版本均可用,UDP连接数则需在5.X以上支持! 每IP限制TCP连接数100,UDP连接数150,并且对DNS,WEB,QQ等端口例外 不过在此我并未加入在脚本里,大家可以自行添加。 ex: TCP限线程 /ip firewall filter add chain=forward protocol=tcp tcp-flags=syn connection-limit=100,32 action=drop 创奇高手 QQ:550453843 Q群:500人总群 ROS总基地 群号:7217877(拥挤) 新群 创奇网络社区ROS总基地 群号:143322592(推荐) 新群 创奇网络社区ROS总基地 群号:139532314 (推荐) 创奇网络社区|ROS总基地 专注于ROS软路由技术!专注于互联网IT前沿技术!http://bbs.chanki.net 提倡互助分享精神!打造一个集IT资讯,网吧技术,网络技术,资源共享,硬件数码等的一体化交流社区!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值