我们在前一篇教程中演示了如何使用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
#p#创建路由映射表
除了前缀列表和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
这个路由映射表语句应该能够能取得想要的结果。
运用路由映射表
牢记一点:除非运用于某个接口或BGP邻居,否则ACL、前缀列表和路由映射表不管用。就像ACL或前缀列表那样,单单一个路由映射表语句可以与任何数量的接口或邻居结合使用。然而,任何一个接口或邻居只能支持一个路由映射表语句用于入站流量,只能支持一个路由映射表语句用于出站流量。
我们将为邻居192.168.1.1把刚创建的路由映射表运用到路由器B的BGP配置,使用入站前缀通告。
router-b# conf terminal
router-b(config)# router bgp 200
router-b(config-router)# neighbor 192.168.1.1 route-map RMAP in
现在,我们使用下列命令,检查通告和接收的路由。
针对通告的路由:
show ip bgp neighbor-IP advertised-routes
针对收到的路由:
show ip bgp neighbor-IP routes
你可以发现,虽然路由器A向路由器B通告了四个前缀,但路由器只接收了三个前缀。如果我们检查一下范围,就能发现,只有路由映射表允许的前缀才在路由器B上看得见。其他所有前缀被丢弃了。
提示:要是接收到的前缀没有任何变化,试着使用命令:“clear ip bgp neighbor-IP”,重新设置BGP会话。在我们的例子中:
clear ip bgp 192.168.1.1
正如我们所见,已满足了要求。我们可以在路由器A和B中创建类似的前缀列表和路由映射表语句,以便进一步控制入站和出站前缀。
我在一个地方总结了配置,那样你一眼就能看清。
router bgp 200
network 10.20.0.0/16
neighbor 192.168.1.1 remote-as 100
neighbor 192.168.1.1 route-map RMAP in
!
ip prefix-list PRFX-LST seq 5 permit 10.10.10.0/23 le 24
!
route-map RMAP permit 10
match ip address prefix-list PRFX-LST
结束语
我们在该教程中演示了如何定义前缀列表和路由映射表,从而在Quagga中过滤BPG路由。我们还演示了如何结合前缀列表和路由映射表,以便对入站前缀进行精细控制。你可以以一种类似的方式来创建自己的前缀列表和路由映射表,从而与你的网络要求相匹配。这些工具是保护生产网络避免虚假路由的路由破坏和通告的最有效方式之一。
但愿本文有所帮助。