QoS和流量整形为VoIP用户使用iproute2和星号
当我下载或上传任何东西时,我的VoIP电话的质量受到影响。 这是令人烦恼的,特别是对于那些打电话给我的人(我听到他们比他们听到的更好听)。 所以我在Iproute2和其他howtos,特别是关于VoIP流量,但我找不到任何有效的工作。 经过一些玩耍之后,我找到了适合我的设置:一致的VoIP质量,不管电线上是否有任何活动。
关于我的VoIP系统的注意事项:我在备用笔记本电脑(IBM T20)上使用Asterisk,我的VoIP提供商是加拿大优秀的Unlimitel。 因为我主持我自己的星号框,我几乎可以配置它做任何我想要的。 我也买了一个驻在我的内联网上的IAX硬盘。
建立
我假设你已经有了你的Linux防火墙。 VoIP数据包横跨您的防火墙,您的NAT已经设置并工作。 我们甚至不会用此设置Touch防火墙。 所有您需要做的是创建正确的qdisc,类和过滤器来优先处理您的VoIP数据包。 Iproute2的tc
命令是这里的。
让我们假装你的网络是这样的:
Internet <------> Cable modem <-------> Linux Firewall <-----> Intranet <-----> VoIP phone
由于我使用的是Asterisk和IAX,所以感兴趣的端口是4569端口。如果您使用的是SIP,请修改以下行中的端口。
一些背景信息
IP数据包有一个可以预设QoS(服务质量)的区域。 虽然您的ISP可能会忽略它们,但您可以在本地网络中使用它们进行流量整形。 4个QoS位是:
0x02
:最小化货币成本
0x04
:最大化可靠性
0x08
:最大化吞吐量
0x10
:最小化延迟
正式地,您最多可以打开其中一个位。 您的防火墙可以随时查看数据包,并确定哪些数据包首先转发,通常最小化延迟
。
非官方地,你可以立即打开这些位。 所以你可以拥有最小化延迟
和最大化吞吐量
的数据包。 考虑到这一点,让我们看看Iproute2的一些功能。
Iproute2和tc
默认情况下,数据包先发先出。 用tc
,你可以大大改变。 我们使用一个非常简单的排队系统:让我们有3个“管道”(或队列),并将其分配给优先级。 也就是说,只要队列1中有某些东西,我们不会将队列2清空(或出队),只要队列2中有某些东西,我们不会将队列3排队。
这是通过以下命令完成的(注意: eth1
是外部接口):
tc qdisc add dev eth1 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0
priomap的16个值很重要。 它基本上表示大多数数据包在第三个队列中(因为我们从零开始,被称为“2”),除了具有QoS Minimize-Delay的数据包,它们放在第二个队列中,除了具有每个QoS位的数据包上,放在第一个队列。 (prio排队纪律默认设置3队列)
16个值是为了满足以下QoS要求:
1: 0x00
:没有设置QoS - >到第3个队列(2)
2: 0x02
:Mimimize货币成本(MMC)(2)
3: 0x04
:最大化可靠性(MR)(2)
4: 0x06
:MMC + MR(2)
5: 0x08
:最大化吞吐量(MT)(2)
6: 0x0a
:MT + MMC(2)
7: 0x0c
:MT + MR(2)
8: 0x0e
:MT + MR + MMC(2)
9: 0x10
:最小化延迟(MD)(1)
10: 0x12
:MD + MMC(1)
11: 0x14
:MD + MR(1)
12: 0x16
:MD + MMC + MR(1)
13: 0x18
:MD + MT(1)
14: 0x1a
:MD + MT + MMC(1)
15: 0x1c
:MD + MT + MR(1)
16:0x1e:MD + MT + MR + MMC(0)
那是我们的第一步。
接下来,我们将调整每个队列,使他们自己有一些排队纪律:
tc qdisc add dev eth1 parent 1:1 handle 10: sfq limit 3000
tc qdisc add dev eth1 parent 1:2 handle 20: sfq
tc qdisc add dev eth1 parent 1:3 handle 30: sfq
这使得第一个队列的容量为3000个数据包。 实际上,大小将是128个数据包,因为它在tc
程序中被硬编码为可能的最大大小。
此时,绝大多数数据包将通过第三个队列,除了具有最小化 - 延迟
QoS位的设置。
如果您调整您的星号框上的iax.conf说如下,一些数据包可能会在第一个队列中结束:
tos = 0x1e
但是,由于这不是一个保证,我们将迫使他们使用tc
的袖子中的另一个技巧来排队1。
记住,IAX使用端口4569,因此我们将强制任何数据包到这个端口通过第一个队列:
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dport 4569 0xffff flowid 1:1
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip sport 4569 0xffff flowid 1:1
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip tos 0x10 0xff flowid 1:2
从技术上讲,最后一行是不需要的,但不要伤害它。
现在,你已经完成了! 您的所有VoIP数据包首先出队。 即使在沉重的下载或上传过程中,您也不会失去电话的互动性。
要查看一些统计信息,请运行以下命令:
tc -s qdisc ls dev eth1
要删除队列并恢复正常状态,请运行:
tc qdisc del dev eth1 root
现在由您自动在引导时运行相应的命令。