我们在前一篇教程中演示了如何使用Quagga,将一个CentOS设备变成边界网关协议(BGP)路由器。我们当时还探讨了基本的BGP对等和前缀交换设置。我们在本教程中将着重介绍如何使用prefix-list(前缀列表)和route-map(路由映射表),控制入站和出站BGP前缀。
正如在之前的教程中描述的那样,BGP路由决策是根据接收/通告的前缀做出的。为了确保路由没有错误,建议你使用某种过滤机制,以控制这些入站和出站前缀。比如说,如果你的其中一个BGP邻居开始通告并不属于它们的前缀,你又错误地接收了这类虚假的前缀,你的流量就会被发送到那个错误的邻居,最后不知其行踪(这就是所谓的“进入黑洞”)。为了确保没有接收这类前缀,也没有通告给任何邻居,你可以使用前缀列表和路由映射表。前者是一种基于前缀的过滤机制,而后者是一种较为一般的基于前缀的策略机制,用来对动作进行微调。
我们将演示如何在Quagga中使用前缀列表和路由映射表。
拓扑结构和需求
我们在本教程中假设采用下列拓扑结构。
服务提供者A已经与服务提供者B建立了eBGP对等关系,它们在彼此之间交换路由信息。AS和前缀细节如下所述。
•对等块:192.168.1.0/24
•服务提供者A:AS 100,前缀10.10.0.0/16
•服务提供者B:AS 200,前缀10.20.0.0/16
在这个场景下,服务提供者B只想接收来自提供者A的10.10.10.0/23、10.10.10.0/24和10.10.11.0/24这三个前缀。
Quagga安装和BGP对等
我们在前一篇教程中已经探讨了安装Quagga和设置BGP对等的方法。所以我们在此不会重复具体细节。不过,我提供了BGP配置和前缀通告方面的总结:
上述输出结果表明,BPG对等已建立起来。路由器A在向路由器B通告多个前缀。另一方面,路由器B向路由器A通告单单一个前缀10.20.0.0/16。这两个路由器都可以正常接收前缀,没有任何问题。
创建前缀列表
在路由器中,可以用访问控制列表(ACL)或前缀列表来阻止前缀。人们常常更喜欢使用前缀列表,而不是ACL,因为前缀列表不像ALC那样大量占用处理器资源。另外,前缀列表创建和维护起来也更容易。
ip prefix-list DEMO-PRFX permit 192.168.0.0/23
上述命令创建了一个名为“DEMO-FRFX”的前缀列表,它只允许192.168.0.0/23。
前缀列表的另一个出色的特性是,我们可以指定子网掩码范围。不妨看一看下面这个例子:
ip prefix-list DEMO-PRFX permit 192.168.0.0/23 le 24
上述命令创建了一个名为“DEMO-PRFX”的前缀列表,允许192.168.0.0/23到/24之间的前缀,具体包括192.168.0.0/23、192.168.0.0/24和192.168.1.0/24. “le”运算符意味着小于或等于。你还可以使用“ge”运算符来表示大于或等于。
一个前缀列表语句可能有多个允许/拒绝动作。每个语句被赋予可以自动确定或人工指定的序号。
多个前缀列表语句以序号的递增次序逐个加以分析。配置前缀列表时,我们应该牢记一点:在所有前缀列表语句末尾处总是有隐式拒绝(implicit deny)。这意味着,没有显式允许的任何前缀都将被拒绝。
为了允许一切,我们可以使用下列前缀列表语句,该语句允许任何前缀:从0.0.0.0/0开始,直到使用子网掩网/32的任何地址。
ip prefix-list DEMO-PRFX permit 0.0.0.0/0 le 32
现在我们已知道了如何创建前缀列表语句,接下来我们将创建名为“PRFX-LST”的前缀列表,允许我们场景下所需要的前缀。
router-b# conf t
router-b(config)# ip prefix-list PRFX-LST permit 10.10.10.0/23 le 24
创建路由映射表
除了前缀列表和ACL外,还有另一种名为路由映射表的机制,它可以控制BGP路由器中的前缀。实际上,路由映射表可以针对用ACL或前缀列表匹配的前缀,对可能适合的动作进行更灵活的微调。
类似前缀列表,路由映射表语句指定了允许或拒绝动作,后面跟着序号。每个路由映射表语句可能带有多个允许/拒绝动作,比如:
route-map DEMO-RMAP permit 10
上述语句创建了名为“DEMO-RMAP”的路由映射表,并为允许动作增添了顺序10。现在,我们将在顺序10下使用match命令。
router-a(config-route-map)# match (press ? in the keyboard)
as-path 匹配BGP AS路径列表
community 匹配BGP团体属性列表
extcommunity 匹配BGP/VPN扩展团体属性列表
interface 匹配路由的首段接口
ip IP信息
ipv6 IPv6信息
metric 匹配路由度量标准
origin BGP源编码
peer 匹配对等体地址
probability 匹配百分比值定义的路由部分
tag 匹配路由标记
正如我们所见,路由映射表可以匹配许多属性。我们将在该教程中匹配前缀。
route-map DEMO-RMAP permit 10
match ip address prefix-list DEMO-PRFX
match命令将匹配之前创建的前缀列表“DEMO-PRFX”所允许的IP地址(即192.168.0.0/23、192.168.0.0/24和192.168.1.0/24这三个前缀)。
下一步,我们可以使用set命令,改动属性。下面这个例子显示了set可能存在的使用场合。
route-map DEMO-RMAP permit 10
match ip address prefix-list DEMO-PRFX
set (press ? in keyboard)
aggregator BGP聚合器属性
as-path 转变BGP AS路径属性
atomic-aggregate BGP原子聚合属性
comm-list 设置BGP团体属性列表(用于删除)
community BGP团体属性
extcommunity BGP扩展团体属性
forwarding-address 转发地址
ip IP信息
ipv6 IPv6信息
local-preference BGP本地偏好路径属性
metric 用于目的地路由协议的度量标准值
metric-type 度量标准类型
origin BGP源编码
originator-id BGP始发器ID属性
src 路由的src地址
tag 路由协议的标记值
vpnv4 VPNv4信息
weight 路由表的BGP权重
正如我们所见,set命令可以用来更改许多属性。为了演示,我们将设置BGP本地偏好。
route-map DEMO-RMAP permit 10
match ip address prefix-list DEMO-PRFX
set local-preference 500
就像前缀列表一样,所有路由映射表语句的末尾也都有隐式拒绝。所以,我们将在序号20添加另一个允许语句,允许一切前缀。
route-map DEMO-RMAP permit 10
match ip address prefix-list DEMO-PRFX
set local-preference 500
!
route-map DEMO-RMAP permit 20
序号20没有特定的match命令,所以它在默认情况下会匹配一切。由于决策是允许,该路由映射表语句将允许一切。
如果你还记得,我们的要求是只允许/拒绝一些前缀。于是在我们的场景下,set命令没有必要。我们将只使用一个允许语句,如下所示。
router-b# conf t
router-b(config)# route-map RMAP permit 10
router-b(config-route-map)# match ip address prefix-list PRFX-LST
这个路由映射表语句应该能够能取得想要的结果。
运用路由映射表