策略路由的乐趣与收益

作者:David Mandelstam

Sangoma 是一家 PCI 总线 WAN 接口卡制造商。为了演示和冗余,我们有两个独立的高速互联网连接:一条使用我们的 PCI S5148 T1/E1 调制解调器的全 T1 线路,承载帧中继;以及一条使用我们的 PCI S518 ADSL 调制解调器的 ADSL 连接,承载 ATM 上的 PPPoE。ADSL 线路与我们的传真机共用,这是唯一一条未连接到我们 PBX 的电话线。我们为这些服务使用了两家不同的 ISP。ADSL 和传真电话线由 Bell Canada 的 Sympatico 服务提供,T1 帧中继连接由 MCI 提供。

Policy Routing for Fun and Profit

图 1. 为了冗余和成本控制,策略路由服务器同时具有 T1 和 ADSL 连接。

带宽和成本

已安装的 T1 和 ADSL 互联网链路的组合提供了可靠的连接,但由此产生的带宽对于我们的需求来说是过度的。Sangoma 的网站由亚特兰大的 Earthlink 托管,因此我们的互联网访问需求与任何其他公司没有太大区别,主要是电子邮件和网络访问,以及一些 FTP 流量,主要作为上传到我们网站上的 FTP 服务器。我们可以无需固定 IP 地址进行管理,尽管我们确实发现 T1 链路配备了一系列固定地址很有价值。

我们所有的互联网服务器都是基于 Linux 的。尽管我们支持 Windows、FreeBSD、Solaris 和其他流行的操作系统,但 Linux 是我们最重要的平台,只有 Linux 拥有我们需要的丰富的流量管理例程工具集。布局如图 1 所示。

ADSL 线路价格低廉,尤其是在我们因使用自己的 ADSL 调制解调器而不是通常作为服务一部分提供的消费级外部 ADSL 调制解调器而获得的折扣之后。与美国相比,加拿大的 T1 价格昂贵;标准无限制 T1 互联网链路的成本可能超过每月 1,900 加元(1,450 美元)。

Sangoma 将互联网接入转售给我们在大楼中的另外两家租户,以在一定程度上抵消成本。其他与我们共享连接的方托管 Web 和 VPN 服务,因此他们既需要固定地址又需要高出站带宽,这就是他们对共享我们的 T1 线路感兴趣的原因。T1 线路的私有和公共部分如图 2 所示。

Policy Routing for Fun and Profit

图 2. 大楼中的两家租户从 Sangoma 购买互联网接入。

两台 Sangoma Linux 机器可以很容易地合并为一台。组合路由器将有另一个 NIC 来支持客户 A 和 B 的公共网络段。Sangoma 的防火墙将在 Sangoma 的私有 LAN 段和所有其他公共段之间运行,这些公共段包括帧中继 T1 链路、ADSL 链路和公共以太网链路。

来自客户 A 和 B 的经济贡献不足以支付加拿大价格的全 T1 费用。我们的解决方案是对 T1 采用基于使用量的服务。这是一种所谓的突发 T1 服务,价格约为全带宽 T1 线路的一半。T1 的使用量无限制,最高可达 1,536Mbps 全双工。计费基于使用的带宽的 95% 百分位数。流量以五分钟的间隔采样,并计算五分钟的平均带宽。在月底,这些五分钟的区间按带宽降序排列。丢弃最高的 5%,计费率取决于当月下一个最高的区间。在我们的案例中,触发吞吐量为 128kbps。如果我们的 95% 百分位数吞吐量超过 128kbps,则每月线路费用至少增加 300 美元。

这种复杂的计费结构对于用户来说很难理解。对于客户来说,这看起来是一笔划算的交易,但很难管理和衡量。计费率是在 5% 水平测量的,在该水平下,使用曲线的变化率接近最大值。因此,许多用户发现自己支付了高额账单,这些账单取决于每月测量的 8,500 多个区间中仅一到两个五分钟区间的带宽。除非一个人的流量始终很低,否则人们很快就会发现附加费是这样的,即使平均吞吐量远低于 128kbps,人们也可能干脆咬紧牙关接受全 T1。

主要的优点是,每月最高 5% 的带宽使用量是“免费”的。这相当于每月大约 36 小时的任意带宽无惩罚,因此几乎一个月中的整整一个工作周都可以以全线速使用。图 3 显示了在我们的突发 T1 服务上以最低成本实现最高吞吐量的理想流量模式。本质上,流量控制逻辑的目标是在给定的月份中消耗了最初的 36 小时无限制带宽后,将 T1 带宽限制为 128kbps。

Policy Routing for Fun and Profit

图 3. 为了实现最低可能的成本,理想的 T1 流量模式仅在 5% 的时间内使用全 T1 线路。

那么我们如何才能在不被套牢的情况下接受诱饵呢?通过一系列脚本和守护进程,结合策略路由、IP 记帐和流量整形,我们可以智能地管理网络,从而使我们和我们的共同用户都能以最低的成本获得最大的性能。

使用 iptables 和 iproute2 进行策略路由

第一步是将 T1 卸载所有可以通过 ADSL 线路路由而不会损失服务质量的流量。我们的 ADSL 线路的下游速率为 1,728kbps,上游速率为 800kbps。T1 标称速率为 1,536kbps,全双工。ADSL 线路的效率低于帧中继 T1 线路,因为 ATM 和纠错开销较高。因此,就有效吞吐量而言,T1 和 ADSL 线路的传入或下行速率是相似的。

我们很幸运,我们特定的 ADSL 连接似乎具有较低的超额订阅水平,因此我们的性能比许多类似的安装更稳定。通常,ADSL 链路在中心局端的超额订阅倍数高达 200 或 300 倍,这会导致高峰时段性能不佳。但是,即使使用我们近乎完美的 ADSL 线路,ADSL 线路的真实上行速率也不到 T1 的一半。因此,使用 ADSL 进行下行流量,并将 T1 保留用于上行流量是合理的。

除了速度差异外,我们的帧中继 T1 线路和 ADSL 线路之间的另一个主要区别是,T1 提供了一小范围固定 IP 地址,而 ADSL 线路是由 DHCP 服务器分配 IP 地址。至少,需要支持固定 IP 地址上的非请求传入流量的服务(例如 Web 服务器)需要位于 T1 线路。

下行流量大的流量主要包括 Web 浏览、电子邮件流量和传入 FTP 流量,ADSL 线路的高下行速率可以很好地处理这些流量。我们还有来自属于客户 A 的第三台服务器的相同类型的流量。因此,来自 Sangoma 和第三方客户服务器的几乎所有流量都通过 ADSL 线路路由。例外情况是传出的 SMTP 邮件流量,这得益于帧中继 T1 线路增加的上行带宽。

客户 A 和 B 之间共有三台服务器。其中,一台是 Web 服务器,需要固定 IP 地址,并且主要具有出站流量。另一台是 VPN 服务器,也需要固定 IP 地址;其流量较小。这两台服务器的所有流量都通过具有固定 IP 寻址结构的 T1 线路路由。

Sangoma 策略解决方案是一个分阶段的过程,其中传出数据包遍历一组规则和策略,以实现所需的流量分配。只有传出数据包在两个接口之间分配,因为我们无法控制传入流量的路径。但是,一旦数据包离开特定的接口(T1 或 ADSL),响应就会通过同一接口返回。

Linux 可用的高级路由工具和实用程序为我们提供了管理网络并实现我们期望目标的方法。Linux 内核支持多个路由表,允许每个物理连接都有自己的路由表。一旦我们为每个物理接口设置了单独的表,我们就使用 iptables 和 iproute2 将流量引导到任一路由表。从那里,数据包遵循默认路由到达相应的物理接口。

iproute2 套件包含一个配置文件,该文件用于将路由表分配给 Linux 路由堆栈。默认情况下,tr_tables 包含单个路由表定义,main。这是 Linux 路由堆栈使用的标准路由表。列表 1 显示了我们为 ADSL 线路添加的路由表条目 adsl。使用标准 Linux 命令将各个路由添加到这些路由表。传出数据包必须在路由器输入和输出之间遍历六个阶段。

列表 1. 多个路由表

cat /etc/iproute2rt_tables
#
# reserved values
#
#255    local
#254    main
#253    default
#0      unspec
# local
#1      inr.ruhep
200 adsl
以太网输入

第一步是 iptables mangle 规则,其中流量被标记为 Tag 1(用于 ADSL)或 Tag 2(用于 T1)。例如,要为所有 Sangoma 邮件分配 Tag 2,我们应用以下规则

iptables -t mangle -A PREROUTING -i eth0 \
-p tcp -s xxx.xxx.xxx.82 --dport smtp -j t1_line

然后,我们在 t1_line 链中使用 iptables --set-mark 选项

iptables -t mangle -N t1_line
iptables -t mangle -A t1_line -j MARK --set-mark 2
iptables -t mangle -A t1_line -j ACCEPT

我们有类似的规则用于去往 ADSL 线路的流量。

iproute2 策略将 Tag 1 指向 ADSL 路由表,将 Tag 2 指向主路由表,该路由表去往 T1 线路

ip rule del fwmark 1 table adsl
ip rule add fwmark 1 table adsl

ip rule del fwmark 2 table main
ip rule add fwmark 2 table main
路由表

ADSL 路由表的默认路由是 ppp0,表示以太网上的 PPP (PPPoE) 链路。然后,以太网被封装到 ATM (EoA) 中,并且是 ATM 信元遍历 ADSL 链路到达电信 DSLAM。

如果 ppp0 接口关闭,ADSL 默认路由将由内核自动删除,并替换为主路由表。因此,如果 ADSL 线路发生故障,则所有目标为 ADSL 路由表的流量都将转移到可能更可靠的主路由表。我们确实会遇到偶尔的 ADSL 中断,这在 ADSL 等低成本、非托管宽带服务中很常见。这些中断持续时间从几秒钟到几个小时不等,但由于流量透明地切换到 T1 线路,因此不会损失用户功能。T1 接口是 ADSL 线路的良好备份,但反之则不然。大多数使用 T1 链路的主机这样做是因为他们需要使用固定 IP 地址;他们无法通过具有非固定 IP 地址的 ADSL 线路得到充分的服务。

主路由表的默认路由是 wan0 (T1)。进入此路由表的所有流量都将转发到 T1 线路。

伪装传出流量

通过 ADSL 连接的传出互联网流量来自具有可路由 IP 地址的服务器。这些地址类型需要进行 NAT;否则,路由到真实 IP 地址的流量将通过 T1 线路返回

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

我们的标记和策略路由如图 4 所示。

Policy Routing for Fun and Profit

图 4. 标记和策略路由允许在 ADSL 线路发生故障时故障转移到 T1 线路。

IP 记帐

一旦我们将适当的流量定向到 ADSL 线路,我们就需要管理剩余的 T1 流量,以使使用边界永远不会被超过。神奇的 95% 百分位点始终必须小于或等于 128kbps。我们首先使用 IP 记帐来测量流量,这使我们能够衡量指定时间间隔内的平均吞吐量。

T1 线路上的所有传入和传出数据包都通过 IP 记帐规则。每个客户的流量都根据 IP 地址和流量方向进行测量。

已编写自定义守护进程来检查每个五分钟期间或区间的 T1 带宽使用情况。每次 T1 吞吐量在五分钟期间内的平均值大于 128kbps 时,计数器就会递增。128kbps 的阈值对应于五分钟期间内约 4.5MB。

如果计数器达到 432,则表示每月免费 36 小时。反过来,这等于一个月中 5% 的时间,并且执行 TC(流量控制)脚本以将 T1 线路限制为 128kbps,直到下个月初。IP 记帐配置文件如列表 2 所示,可从Linux Journal FTP 站点 [ftp.linuxjournal.com/pub/lj/listings/issue121/7134.tgz] 获取。

流量控制

我们通常在无需限制 T1 线路的情况下度过一个月。但是,有时,免费的 36 小时会被消耗完。在这种情况下,使用流量控制 (TC) 来限制带宽。有关流量控制和 tc 命令的文档,请访问 lartc.org/manpages

我们对 T1 线路 wan0 和本地以太网 eth0 都使用基于类的队列 (CBQ) 规则。这样做是为了在两个连接上实现两个流量方向的流控制

tc qdisc add dev wan0 root handle 10: \
cbq bandwidth 1500Kbit avpkt 1000
tc qdisc add dev eth0 root handle 20: \
cbq bandwidth 1500Kbit avpkt 1000

接下来,为 wan0 和 eth0 添加最大带宽的全局类。两条线路的最大带宽均为 1,500kbps (T1)

tc class add dev wan0 parent 10:0 classid 10:1 \
cbq bandwidth 1500Kbit avpkt 1000 rate 1500Kbit \
allot 1514 weight 150Kbit prio 8 maxburst 0
tc class add dev wan0 parent 20:0 classid 20:1 \
cbq bandwidth 1500Kbit avpkt 1000 rate 1500Kbit \
allot 1514 weight 150Kbit prio 8 maxburst 0

为 wan0 和 eth0 添加带宽受限的用户类。我们使用的带宽限制为 100kbps,而不是 128kbps。Linux TC 并非完全准确,我们通过反复试验确定,如果我们将带宽限制设置为高于 100kbps,有时突发流量可能会超过 128kbps

tc class add dev wan0 parent 10:1 classid 10:100 \
cbq bandwidth 1500Kbit avpkt 1000 rate 100Kbit \
allot 1514 weight 10Kbit prio 8 maxburst 0 bounded
tc class add dev eth0 parent 20:1 classid 20:100 \
cbq bandwidth 1500Kbit avpkt 1000 rate 100Kbit \
allot 1514 weight 10Kbit prio 8 maxburst 0 bounded

为 wan0 和 eth0 上的用户类添加 SFQ 排队规则。已选择默认排队规则随机公平队列 (SFQ)。也可以使用许多其他规则

tc qdisc add dev wan0 parent 10:100 \
sfq quantum 1514b perturb 15
tc qdisc add dev eth0 parent 20:100 \
sfq quantum 1514b perturb 15

将标记为数字 2 的流量绑定到 wan0 和 eth0 的用户类队列。所有目标为 T1 线路的流量都已标记为数字 2。流量控制仅限制 T1 流量,同时允许 ADSL 流量以其全物理速率流动

tc filter add dev wan0 parent 10:0 protocol ip \
prio 25 handle 2 fw flowid 10:100
tc filter add dev eth0 parent 20:0 protocol ip \
prio 25 handle 2 fw flowid 20:100

结果

策略路由按程序完美运行,将流量适当地定向到 T1 和 ADSL 链路,并在 ADSL 链路发生故障时提供冗余。T1 上的流量管理令人满意,我们通常能够为用户提供体面的透明服务。当然,单个月内流量吞吐量的一致性取决于免费带宽消耗的速度。

作为我们 T1 流量管理的示例,请参见图 5,该图显示了 2003 年 5 月的帧中继 T1 带宽使用情况。图表上的红线表示 128kbps,这是我们的计费阈值限制。吞吐量限制发生在 5 月 23 日之后。我们的一位客户的服务器感染了病毒,该病毒在该月产生了大量流量,消耗了我们宝贵的免费带宽。结果,这些客户被要求在 T1 线路以 128kbps 的速度运行超过一周的时间。当然,ADSL 流量未受到影响。

Policy Routing for Fun and Profit

图 5. 2003 年 5 月按五分钟区间划分的带宽使用情况

以带宽列出的五分钟区间呈现的相同数据如图 6 所示。可以将此图与图 3 中显示的理想使用情况进行比较。请注意此图中指示的 122.07kbps 的计费率。这反映了流量控制程序在确保计费率保持在 128kbps 以下方面的成功。

Policy Routing for Fun and Profit

图 6. 2003 年 5 月按带宽排名划分的五分钟区间带宽使用情况

结论

尽管这只是策略路由、IP 记帐和流量整形的一个非常简单的实现,但它确实说明了 Linux 高级路由工具如何提供管理复杂流量策略所需的控制类型。

David Mandelstam 是 Sangoma Technologies Corp. 的总裁。Sangoma 成立于 1984 年,致力于开发和制造广域网 (WAN) 通信硬件和软件产品,重点是 PC 平台。通信解决方案和路由产品支持所有流行的 WAN 网络、线路协议和所有标准的 PC 操作系统和平台。

Nenad Corbic 是 Sangoma Technologies Corp. (www.sangoma.com) 的高级 Linux 开发人员。

加载 Disqus 评论