没玩过单臂,不知道 ifconfig 输出是什么。一般的说法是 qos 是作用在上行方向才有机会控制包,单臂应该也是存在上行的接口。但是它是处在路由的下级,一般也就起一个限速的作用。所以还是尽可能的直接在出口路由实现 qos ,出口的路由一般不能用 mac 地址但是还能用各个 vlan 的 ip 地址来区分。如果用基于访问目的端口的 qos ,而不是源 ip 就没这些问题。
ifb 这种并未应用在真实环境,好多年了,都不知道验证的是什么问题。。。
----------------
这几天在 google 关键字 linux imq ifb 。IFB ( Intermediate Functional Block )是 IMQ ( InterMediate Queuing )的替代者。linux 中的流量控制都是针对输出方向的,而输入方向的流量限制只有一个队列规则 ingress qdisc 。系统通过 ingress qdisc 把输入方向的数据包重定向到虚拟设备 IFB ,在 IFB 的输出方向配置多种 qdisc ,就可以达到对输入方向的流量做队列调度的目的。IFB 和 IMQ 最显著的差别就是不再和 netfilter 产生联动关系。有利也有蔽,今天想在 wan 做 ingress 控制本地 lan 接口流量,就因为 DNAT 问题无果。注意 openwrt 下的 ifb 打过补丁支持 conntrack 状态。
On 7/19/06, Andy Furniss <lists at
andyfurniss.entadsl.com> wrote:
> Rajesh Mahajan wrote:
> > Is IFB realy replacement of IMQ
>
> Mostly - it hooks before/after netfilter though, so if you really need
> IMQ to hook "in" netfilter (eg. to get denatted addresses on ingress so
> you can seperate INPUT and FORWARD traffic), you still need IMQ.
>
> Andy.
IFB 还有一个比较神奇的特性,它可以只在虚拟 ifb 接口做 tc 流量控制,而将其它接口的流量都重定向到虚拟 ifb 接口统一做流量控制。
以前在一个路由上做了 1LAN+3VLAN 接口,其中有个 VLAN 有 9 个使用静态路由实现的网段,总计 13 个 IP 段。为了实现动态限速,用脚本对 13 个网段的 ip 进行 interface 接口判断处理,然后插值到特定 interface 接口实现动态限速过程。而下面的实例实现 2 个 interface 接口变为 1 个虚拟的 ifb 接口,而且可以真正的用一个统一的 ifb 虚拟接口通过 prio 对不同接口的流量实现优先级控制。这个实例的延伸第一次将应用于家用环境的强调延迟效果的 QOS 脚本和应用于公司环境基于 IP 管理的 QOS 实现通过 ifb 揉和在一起。高优先级的流量永远保持高优先级,其它流量基于 IP 实现动态限速,HOHO 。。。开心。
在 wan ingress 接口,由于它在 DNAT 之前,只能获得 wan ip 而不能获得本地 lan ip ,不能实现基于本地接口的统一限速。可以通过重定向每个本地接口的流量到虚拟接口 ifb ,实现针对不同接口的流量限制。
#!/bin/sh -x
TC=$(which tc)
DOWNLINK=570
DDEV=ifb0
#rmmod ifb
insmod ifb numifbs=1
ip link set dev $DDEV txqueuelen 128 up
$TC qdisc del dev $DDEV root 2>/dev/null
$TC qdisc add dev $DDEV root handle 1: htb default 10 r2q 10
$TC class add dev $DDEV parent 1: classid 1:1 htb rate 1000mbit burst 1000k
$TC class add dev $DDEV parent 1:1 classid 1:100 htb rate 1000mbit ceil 1000mbit burst 1000k prio 0
$TC class add dev $DDEV parent 1: classid 1:2 htb rate $((DOWNLINK))kbps ceil $((DOWNLINK))kbps
$TC class add dev $DDEV parent 1:2 classid 1:10 htb rate $((DOWNLINK*25/100))kbps ceil $((DOWNLINK*95/100))kbps prio 1
$TC class add dev $DDEV parent 1:2 classid 1:30 htb rate $((DOWNLINK*25/100))kbps ceil $((DOWNLINK*25/100))kbps prio 1
$TC qdisc add dev $DDEV parent 1:100 handle 100: sfq perturb 10
$TC qdisc add dev $DDEV parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev $DDEV parent 1:30 handle 30: sfq perturb 10
tc qdisc del dev tun0 root
ip link set dev tun0 txqueuelen 32
tc qdisc add dev tun0 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
tc filter add dev tun0 parent 1:0 protocol ip priority 10 u32 match u32 0 0 flowid 1: action mirred egress redirect dev $DDEV
tc filter add dev ifb0 parent 1:0 prio 9 protocol ip u32 match ip src 192.168.8.0/24 match ip dst 10.1.0.0/24 flowid 1:100
tc filter add dev ifb0 parent 1:0 prio 10 protocol ip u32 match ip dst 10.1.0.0/24 flowid 1:10
#tc filter add dev ifb0 parent 1:0 prio 10 protocol ip u32 match ip dst 10.1.0.7/32 flowid 1:10
tc qdisc del dev eth0.1 root
ip link set dev eth0.1 txqueuelen 32
tc qdisc add dev eth0.1 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
tc filter add dev eth0.1 parent 1:0 protocol ip priority 10 u32 match u32 0 0 flowid 1: action mirred egress redirect dev $DDEV
tc filter add dev ifb0 parent 1:0 prio 29 protocol ip u32 match ip src 192.168.8.0/24 match ip dst 192.168.8.0/24 flowid 1:100
tc filter add dev ifb0 parent 1:0 prio 30 protocol ip u32 match ip dst 192.168.8.0/24 flowid 1:30
参考文档
https://github.com/westnetz/qos-script/blob/master/qos-htb-sfq.shifb
By Linux Foundatio... - November 19, 2009 - 10:23am
http://www.linuxfoundation.org/collaborate/workgroups/networking/ifb* 2015 年 07 月 31 日星期五
- 增加 1000mbit 环境的实例,避免当路由做为服务器时流量被限制的问题。
- 注意 ifb0 接口 filter 时的 prio 优先级控制。
* 2015 年 07 月 09 日星期四
- 生成文档