QoS和流量整形为VoIP用户使用iproute2和星号

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

现在由您自动在引导时运行相应的命令。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏