Border Gateway Protocol (BGP) 边界网关协定

前言

BGP 的全写是 Border Gateway Protocol,最新的版本是 BGP-4,即是 Version 4,亦是最常学习和应用的版本。BGP 通常应用於比较大型的网络结构中,用作交换不同 AS 之间的路由资讯,例如 ISP 与 ISP 之间的路由交换。BGP 的复杂性在於建立 Peers 上的一些规限,以及有大量可以影响路由结果的 Attribute,要学好 BGP,必需知道微调这些 Attribute 的方法。

eBGP 与 iBGP

学习任何 Routing Protocol,第一步得先了解如何组成 Neighbors,在 BGP 中亦称作 Peers。Peers 利用 TCP 179 Port 沟通,分为 internal BGP (iBGP) peering 及 external BGP (eBGP) peering 两种。

如果两个 Router 於相同的 AS 之内组成 Peers,就会成为 iBGP Peers。 如果两个 Router 於不同的 AS 之内组成 Peers,就会成为 eBGP Peers。

现在让我们尝试设定一组简单的 BGP Peers。

bgp

图 1 的路由器设定如下:

hostname R1
!
interface Ethernet0/0
 ip address 192.168.12.1 255.255.255.0
!
router bgp 65500
 neighbor 192.168.12.2 remote-as 65501
hostname R2
!
interface Ethernet0/0
 ip address 192.168.12.2 255.255.255.0
!
interface Ethernet0/1
 ip address 192.168.23.2 255.255.255.0
!
router bgp 65501
 neighbor 192.168.12.1 remote-as 65500
 neighbor 192.168.23.3 remote-as 65501
hostname R3
!
interface Ethernet0/1
 ip address 192.168.23.3 255.255.255.0
!
router bgp 65501
 neighbor 192.168.23.2 remote-as 65501

要知道是否成功建立 Peers,可以使用 show ip bgp summary 指令。

R2#show ip bgp summary
BGP router identifier 192.168.23.2, local AS number 65501
BGP table version is 1, main routing table version 1

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.12.1    4 65500      21      21        1    0    0 00:18:57        0
192.168.23.3    4 65501      19      19        1    0    0 00:16:27        0

每一个栏位的意思如下:

Neighbor

就是 Peer Router 的 IP address。

V

是 BGP 的版本,正如前面所说,现今一般都使用 Version 4 这个版本。

AS

Peer Router 的 AS number。如果 AS 与第一行显示的 local AS number 相同,即代表建立了 iBGP,否则,建立的就是 eBGP 了。

MsgRcvd 及 MsgSent

MsgRcvd 是从 Peer 接收到的 BGP 封包,MsgSent 则是传送到 Peer 的封包,在 default 的环境下,BGP Router 会每分钟 (因为 default keepalive time=60 秒) 传送 keepalive message 给 Peer,所以这两个数是会不断上升。

TblVer

传送给这个 Peer 的最新的 BGP Database 版本,这个稍後会再说明。

InQ

显示收到而未被处理的 BGP 讯息,如果这个数字很大的话,即是很多讯息在排队等待处理,代表 Router 的 CPU 很忙,并未能够处理 Peer 传来 BGP 讯息。

OutQ

显示等待送出的 BGP 讯息,如果这个数字很大的话,可能是由於 CPU 很忙或都 Bandwidth 不足够而导致 BGP 讯息未能送出。

Up / Down

就是这个 Connection 的维持上线或下线时间有多久了。

State / PfxRcd

如果显示一个数字的话 (就算是 0 也好),代表从这个 Peer 收到的 BGP Route 的数量,即是 Peer 已成功建立。但如果是显示 Active 的话,很不幸,这代表 Peer 没有建立成功。

建立 Peers 的状态 (State)

一般来说,如果设定没有问题的话,BGP Peers 就会成为 Established 的状态。但实际上,Peers 在进入 Established 之前会经过几个状态 (State),了解这几个 State 对 troubleshooting 很有帮助。

BGP Peers 的 6 个 State 分别是:

IDLE

Router 正在搜寻 Routing Table,找一条能够连接 Neighbor 的路径。(注意:不会使用 Default Route。)

CONNECT

Router 已经找到连接 Neighbor 的路径了,并且完成了 TCP 3-way handshake。

OPEN SENT

已经传送了 BGP 的 OPEN 封包,告诉对方希望建立 Peers。

OPEN CONFIRM

收到了 Neighbor 回传封包,对方赞成建立 Peers。

ESTABLISHED

两个 Neighbor 已经成功建立了 Peers。

ACTIVE

这是最不想看到的 State,代表 Router 仍然处於主动传送封包的状态,收不到对方回传,如果持续见到此状态的话,代表 Peers 并未成功建立。

如果想了解 State 的变化,可以使用 debug ip bgp,然後执行 clear ip bgp * 来让 BGP Peers 从新建立起来。

R3#debug ip bgp
BGP debugging is on for address family: IPv4 Unicast
R3#clear ip bgp *
R3#
*Mar  1 02:11:24.015: BGPNSF state: 192.168.23.2 went from nsf_not_active to nsf_not_active
*Mar  1 02:11:24.019: BGP: 192.168.23.2 went from Established to Idle
*Mar  1 02:11:24.019: %BGP-5-ADJCHANGE: neighbor 192.168.23.2 Down User reset
*Mar  1 02:11:24.023: BGP: 192.168.23.2 closing
*Mar  1 02:11:24.027: BGP: 192.168.23.2 went from Idle to Active
*Mar  1 02:11:24.039: BGP: 192.168.23.2 open active, local address 192.168.23.3
*Mar  1 02:11:24.111: BGP: 192.168.23.2 went from Active to OpenSent
*Mar  1 02:11:24.111: BGP: 192.168.23.2 sending OPEN, version 4, my as: 65501, holdtime 180 seconds
*Mar  1 02:11:24.111: BGP: 192.168.23.2 send message type 1, length (incl. header) 45
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcv message type 1, length (excl. header) 26
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcv OPEN, version 4, holdtime 180 seconds
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcv OPEN w/ OPTION parameter len: 16
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcvd OPEN w/ optional parameter type 2 (Capability) len 6
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has CAPABILITY code: 1, length 4
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has MP_EXT CAP for afi/safi: 1/1
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcvd OPEN w/ optional parameter type 2 (Capability) len 2
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has CAPABILITY code: 128, length 0
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has ROUTE-REFRESH capability(old) for all address-families
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcvd OPEN w/ optional parameter type 2 (Capability) len 2
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has CAPABILITY code: 2, length 0
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has ROUTE-REFRESH capability(new) for all address-families
BGP: 192.168.23.2 rcvd OPEN w/ remote AS 65501
*Mar  1 02:11:24.167: BGP: 192.168.23.2 went from OpenSent to OpenConfirm
*Mar  1 02:11:24.167: BGP: 192.168.23.2 went from OpenConfirm to Established
*Mar  1 02:11:24.167: %BGP-5-ADJCHANGE: neighbor 192.168.23.2 Up

用 Loopback 来建立 iBGP Peers

在一个 AS 当中,除了 BGP 之外,一般会使用 IGP (例如:OSPF, EIGRP) 来作路由交换,在这个情况下,我们会使用 Loopback interface 作为 iBGP 的 neighbor address。因为 Loopback interface 永远是 UP 的,而且 Neighbor 之间可以自己透过 IGP 来寻找到达 Loopback 的路径,这比起使用 Interface IP 来作 neighbor address 来得灵活一点,也减少了因为 Interface down 而令 BGP Table 不稳定。请看以下例子。

bgp

在图 2 的例子中,假设 R2丶R3 及 R4 正运行 OSPF,如果 R2 连到 R3 的 iBGP connection 是使用 R3 e0/1 interface IP,那麽当 R3 e0/1 因为某些原因而 Down 的话,iBGP 便会断开,让我们做个实验吧。

hostname R2
!
interface Ethernet0/1
 ip address 192.168.23.2 255.255.255.0
!
interface Ethernet0/2
 ip address 192.168.24.2 255.255.255.0
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0
!
router bgp 65501
 neighbor 192.168.23.3 remote-as 65501
hostname R3
!
interface Ethernet0/1
 ip address 192.168.23.3 255.255.255.0
!
interface Ethernet0/2
 ip address 192.168.34.3 255.255.255.0
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0
!
router bgp 65501
 neighbor 192.168.23.2 remote-as 65501
hostname R4
!
interface Ethernet0/0
 ip address 192.168.24.4 255.255.255.0
!
interface Ethernet0/1
 ip address 192.168.34.4 255.255.255.0
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0

正常情况下,R3 与 R2 能够建立 iBGP Peers:

R3#show ip bgp summary
BGP router identifier 192.168.23.3, local AS number 65501
BGP table version is 1, main routing table version 1


Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.23.2    4 65501      11      15        1    0    0 00:05:22        0

但若果我们把 R3 的 e0/1 shutdown,iBGP connection 立刻断开。过了 3 分钟之後,状态变成 Active,因为 BGP default 的 holdtime 是 180 秒,如果过了 180 秒对方也没有反应,则进入 Active 状态,表示已经无法成功连接。

R3#show ip bgp summary
BGP router identifier 192.168.23.3, local AS number 65501
BGP table version is 1, main routing table version 1


Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.23.2    4 65501      12      20        0    0    0 00:00:06 Active

看!这就是用 Interface IP 做 Neighbor 的坏处。今次我们试试更改设定,把 R2 和 R3 都改成用 Loopback 做 Neighbor IP。步骤如下:

  1. 首先在 R2 和 R3 加入 Loopback Interface,并设定 IP address
  2. 在 bgp config 里,把 neighbor 的 IP 改成对方的 Loopback address
  3. 还要加入一句 neighbor <ip> update-source <interface> 的 command
hostname R2
!
interface Loopback0
 ip address 2.2.2.2 255.255.255.255
!
router bgp 65501
 neighbor 3.3.3.3 remote-as 65501
 neighbor 3.3.3.3 update-source Loopback0
hostname R3
!
interface Loopback0
 ip address 3.3.3.3 255.255.255.255
!
router bgp 65501
 neighbor 2.2.2.2 remote-as 65501
 neighbor 2.2.2.2 update-source Loopback0

这样子,就算把 R3 的 e0/1 shutdown,iBGP 都不会有中断的情况,因为 R2 和 R3 会跟据 OSPF 提供的路由使用 R2-R4-R3 的路径来连接对方的 Loopback Interface IP。而且在 show ip bgp summary 中也看到 Neighbor IP 变成对方 Loopback 的 IP 了。

R3#sh ip bgp summary
BGP router identifier 192.168.23.3, local AS number 65501
BGP table version is 1, main routing table version 1

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
2.2.2.2         4 65501      13      13        1    0    0 00:09:12        0

请留意,Loopback 这个技巧通常只用在 iBGP 的 connection,甚少用於 eBGP,因为我们不会用 IGP 把两个不同的 AS 连起来。

eBGP Multihop 指令

有时候,两个 Router 中间可能有其他网络设备使到两个 BGP Neighors 不能直接连接,很大机会是防火墙,因为连接其他 AS 的位置一般是 Network 的边缘 (Edge),企业或组织通常会安装防火墙以策安全。遇到这些情况,我们需要用 ebgp multihop 来使两个 Router 连接起来。请看以下例子。

bgp

设定好图 3 中 R1 和 R2 的 IP Address 之後,各加入一条 Static Route 把路径指向 Firewall,我们用一只 Router 来模拟成 Firewall,它能够做 Routing。

hostname R1
!
interface Ethernet0/0
 ip address 10.1.1.1 255.255.255.0
!
router bgp 65500
 neighbor 10.2.2.1 remote-as 65501
!
ip route 10.2.2.0 255.255.255.0 Ethernet0/0
hostname R2
!
interface Ethernet0/1
 ip address 10.2.2.1 255.255.255.0
!
router bgp 65501
 neighbor 10.1.1.1 remote-as 65500
!
ip route 10.1.1.0 255.255.255.0 Ethernet0/1
hostname Firewall
!
interface Ethernet0/0
 ip address 10.1.1.2 255.255.255.0
!
interface Ethernet0/1
 ip address 10.2.2.2 255.255.255.0

在 R1 测试一下,明明可以 PING 到 10.2.2.1,就是没法建立 BGP Peers!

R1#ping 10.2.2.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.2.2.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 40/50/72 ms
R1#show ip bgp summary
BGP router identifier 10.1.1.1, local AS number 65500
BGP table version is 1, main routing table version 1

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.2.2.1        4 65501      31      32        0    0    0 00:02:05 Idle

这时候在两个 Router 的 BGP config 里加入 neighbor <ip> ebgp-multihop <max hop count>,<max hop count> 是两只 Router 中间相隔的 hop 数目。设定好之後,问题迎刃而解!

R1(config-router)#neighbor 10.2.2.1 ebgp-multihop 2
R2(config-router)#neighbor 10.1.1.1 ebgp-multihop 2
*Mar  1 00:48:31.035: %BGP-5-ADJCHANGE: neighbor 10.1.1.1 Up

Password

为了认证 Peer Router,我们可以加入 Password,方法如下:

router bgp 65000
 neighbor 2.2.2.2 remote-as 65000
 neighbor 2.2.2.2 password cisco

只要两边都加入了 password 指令,即可以透过密码认证。

Peer Group

若果要为各个 Neighbor 做相同的设定,可以使用 Peer Group 来简化,既方便又快捷。用以下的一套设定为例:

router bgp 65000
 neighbor 2.2.2.2 remote-as 65000
 neighbor 2.2.2.2 password cisco
 neighbor 2.2.2.2 update-source Loopback0
 neighbor 3.3.3.3 remote-as 65000
 neighbor 3.3.3.3 password cisco
 neighbor 3.3.3.3 update-source Loopback0
 neighbor 4.4.4.4 remote-as 65000
 neighbor 4.4.4.4 password cisco
 neighbor 4.4.4.4 update-source Loopback0

如果使用 Peer Group 将会变成这样:

router bgp 65000
 neighbor iBGPNei peer-group         //为 Peer Group 设个名称  
 neighbor iBGPNei remote-as 65000    //开始为 Peer Group 做设定  
 neighbor iBGPNei password cisco
 neighbor iBGPNei update-source Loopback0
 neighbor 2.2.2.2 peer-group iBGPNei //把 2.2.2.2 放进 Peer Group  
 neighbor 3.3.3.3 peer-group iBGPNei
 neighbor 4.4.4.4 peer-group iBGPNei

Network 指令

学好了建立 Peers 之後,终於可以开始尝试在 Neighbor 之间交换 Route 了。最基本的方法就是使用 Network 这个指令,不过在 BGP 中执行 Network 指令,其功能与 OSPF丶EIGRP 等的 Routing Protocol 有所不同。在 BGP 中,Network 指令只会宣告发布一个网段,而不会让任何 Interface 加入成为 BGP 的发布点。原因其实很理所当然,因为 BGP 的 Neighbor 指令已经让 BGP 知道那些 Interface 加入 BGP,而且完成了 Peers 的建立,而 Network 指令只需处理发布网段的事情便可以了。还有一件事情需要紧记,就是:

要用 BGP 发布一个网段,Router 本身的 Route Table 必需有该网段的Route,否则不能发布。

请看看以下的例子:

bgp

假设所有 IP 和 Neighbor 已经设置好,现在我们尝试在 R1 加一个 Loopback,然後把 Loopback 这个网段发布出去:

hostname R1
interface Loopback0
 ip address 1.1.1.1 255.255.255.0
!
router bgp 65100
 network 1.1.1.0 mask 255.255.255.0

先在 R1 用 show ip route 确认一下 1.1.1.0/24 出现在 Routeing table 之中。

R1#show ip route

< Output Omitted>

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
C       1.1.1.0 is directly connected, Loopback0

然後使用 show ip bgp,可以看到 1.1.1.0/24 已经加入 BGP Table 了。

R1#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       0.0.0.0                  0         32768 i

再来看看 R2 的 show ip bgp,有收到 1.1.1.0/24 !而且 show ip route 也看到这网段已成功加入在 Route Table 之中!

R2#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.12.1             0             0 65100 i
R2#show ip route

< Output Omitted>

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [20/0] via 192.168.12.1, 00:08:35 
C    192.168.23.0/24 is directly connected, Ethernet0/1

R3 的情况又怎样呢?

R3#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.23.2                           0 65200 65100 i
R3#show ip route

< Output Omitted>

     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [20/0] via 192.168.23.2, 00:16:04 
C    192.168.23.0/24 is directly connected, Ethernet0/1

就是一个 Network 指令,便完成了这个简单的 BGP 网络路由交换了。在此我们先解释一下在 show ip bgp 中看到的栏位够竟有什麽意思?

Network

网段的 Network ID 与及 Prefix Length。

Next Hop

要到达这个网段的 Next Hop IP address。如果显示为 0.0.0.0,即是说此网段是由本地 Router 发布的。另外有一个重要的地方要注意,就是此栏位所显示的 Next Hop IP 必需有路由可到达,此网段才会放入 Routing Table 之中,暂时请稍稍记一下,稍後的例子会加以说明。

Metric

这是其中一个用来选择最佳路径的属性。在路径选择的部份会详细说明。

LocPrf

也是其中一个用来选择最佳路径的属性。

Weight

特别注意这是 Cisco 独有的栏位,如果这条 Route 是由本机 Network 指令产生的话,就会设定成 32768。这也是其中一个用来选择最佳路径的属性。

Path

到达这个网段所经过的 AS Number,如果该网段是在本机的 AS Number 之中,此值便会变成空白,请留意是空白,并非 i ,i 是下一个栏位 Origin。

Origin

Origin 并没有在栏位名显示出来,Origin 的值就显示在 Path 属性後面,只有三个值:i , e 或是 ?

  • i – 此 Route 的来源是 IGP 或者是用 Network 指令
  • e – 此 Route 的来源是 EGP,不过 EGP 已经是历史的产物,可以不用理会了。
  • ? – 此 Route 是通过 redistribute 得来的

Origin 也是选择最佳路径的一个方法,在稍後会详细说明。

Next-hop-self 指令

现在我们试试另一个例子:

bgp

R1 与 R2 是 eBGP,R2 与 R3 是 iBGP,R3 与 R4 是 eBGP。假设全部 IP 及 Peers 已经设定好,我们在 R1 设定 Loopback Interface 然後把它发布出去。看看 R2 的 BGP database,有 “>” 标记表示 BGP 选好了用 Next Hop IP 192.168.12.1 来到达 1.1.1.0/24,Route Table 也似乎没问题。

R2#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.12.1             0             0 65100 i
R2#show ip route

< Output Omitted>

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [20/0] via 192.168.12.1, 00:07:37
C    192.168.23.0/24 is directly connected, Ethernet0/1

再看看 R3 的 BGP Table,天啊!为什麽没有选到 best path,Route table 也没有加入 1.1.1.0 这条 Route,为什麽?

R3#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i1.1.1.0/24       192.168.12.1             0    100      0 65100 i
R3#show ip route

< Output Omitted>

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
C    192.168.23.0/24 is directly connected, Ethernet0/1

大家还记得吗?在上一部份介绍 Next Hop 这个栏位时,我们说过 Next Hop IP 必需要「可以到达」的才能把该条 Route 加入 Route Table,由於对 R3 来说,192.168.12.1 并没有路径可以到达 (即 Route Table 里找不到 192.168.12.1 的 Route) ,所以 R3 不会把这条 Route 加入 Route Table。至於为什麽 Next Hop IP 会是 192.168.12.1 而不是 R2 的 192.168.23.2 呢?这是因为当 BGP 把一条 Route 用 iBGP 发布给 Neighbor 时,Default 是不会更改其 Next Hop 的 IP ,这点我们需要紧记!怎麽解决呢?有两个办法:

第一个方法是加入一条 Static Route (或用其他 IGP) 让 R3 学懂怎样去 192.168.12.1。加了之後便发现 BGP Route 成功得到了:

R3(config)#ip route 192.168.12.1 255.255.255.255 ethernet 0/1
R3(config)#do sh ip route

< Output Omitted>

     192.168.12.0/32 is subnetted, 1 subnets
S       192.168.12.1 is directly connected, Ethernet0/1      
     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [200/0] via 192.168.12.1, 00:00:04 
C    192.168.23.0/24 is directly connected, Ethernet0/1
C    192.168.34.0/24 is directly connected, Ethernet0/0

另一个方法是使用 Next-hop-self 指令,迫使 R2 在发布 Route 给 R3 时使用自己的 IP 作为 Next Hop IP。只要在 BGP config 中加入一句 neighbor <IP> next-hop-self  便可以。

router bgp 65200
 neighbor 192.168.12.1 remote-as 65100
 neighbor 192.168.23.3 remote-as 65200
 neighbor 192.168.23.3 next-hop-self

现在我们再看看 R3 的 BGP Table,Next Hop 变成 192.168.23.2 了,有 “>” 标记,证明 BGP 接受了这条为 Best Path,Route Table 亦成功加入这条 Route。

R3#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i1.1.1.0/24       192.168.23.2             0    100      0 65100 i
R3#show ip route

< Output Omitted>

     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [200/0] via 192.168.23.2, 00:02:47 
C    192.168.23.0/24 is directly connected, Ethernet0/1
C    192.168.34.0/24 is directly connected, Ethernet0/0

Synchronization (同步)

有些情况,我们需要透过 IGP 作媒介来让两个或多个 iBGP Neighbor 连接,如图 6 这个例子,AS65200 的 R2 和 R5 成为 iBGP Peers,然後我们想把 AS65100 的 Route 透过 AS65200 发布到 AS65300,这时候我们需要注意同步的问题。我们试把着眼点放於 R5 上,当 BGP 的 Route,到达 R5 之後,由於 R5 开啓了 IGP,所以 R5 把 Route 发布去 AS65300 之前会先检查同步的条件有没有达成,如果条件达成就发出去,相反就不会发出去。

所谓达到同步,就是说从 iBGP 收回来的 Route,在 Routing Table 中必需要有相同的 IGP Route 能够到达。

例如:在 AS65100 发布 1.1.1.0/24 到 R2,R2 收到後发布到 R5,R5 会检查 Route Table 中有没有 IGP Route 能够去到 1.1.1.0/24,如果有就是同步了。

bgp

就图 6 的例子,我们可以看看 R2 和 R5 的设定。

hostname R2
!
interface Loopback0
 ip address 2.2.2.2 255.255.255.0
!
router ospf 1
 network 2.2.2.0 0.0.0.255 area 0
 network 192.168.23.0 0.0.0.255 area 0
 network 192.168.24.0 0.0.0.255 area 0
!
router bgp 65200
 neighbor 5.5.5.5 remote-as 65200
 neighbor 5.5.5.5 update-source Loopback0
 neighbor 5.5.5.5 next-hop-self
 neighbor 192.168.12.1 remote-as 65100
hostname R5
!
interface Loopback0
 ip address 5.5.5.5 255.255.255.0
!
router ospf 1
 network 5.5.5.0 0.0.0.255 area 0
 network 192.168.35.0 0.0.0.255 area 0
 network 192.168.45.0 0.0.0.255 area 0
!
router bgp 65200
 neighbor 2.2.2.2 remote-as 65200
 neighbor 2.2.2.2 update-source Loopback0
 neighbor 192.168.56.6 remote-as 65300

在 R2 确认有收到 1.1.1.0/24:

R2#show ip bgp 
<Output Omitted>
   Network          Next Hop            Metric LocPrf Weight Path 
*> 1.1.1.0/24       192.168.12.1             0             0 65100 i

R5 收到但没有 “>” 标记,所以没有发布出去:

R5#show ip bgp 
<Output Omitted>
   Network          Next Hop            Metric LocPrf Weight Path 
* i1.1.1.0/24       2.2.2.2                  0    100      0 65100 i

为什麽没有发布呢?因为 IGP 不懂 1.1.1.0/24

R5#show ip route

<--Output Omitted-->

     2.0.0.0/32 is subnetted, 1 subnets
O       2.2.2.2 [110/21] via 192.168.45.4, 00:37:38, Ethernet0/1
                [110/21] via 192.168.35.3, 00:37:38, Ethernet0/0
C    192.168.45.0/24 is directly connected, Ethernet0/1
O    192.168.24.0/24 [110/20] via 192.168.45.4, 00:37:38, Ethernet0/1
     5.0.0.0/24 is subnetted, 1 subnets
C       5.5.5.0 is directly connected, Loopback0
C    192.168.56.0/24 is directly connected, Ethernet0/2
O    192.168.23.0/24 [110/20] via 192.168.35.3, 00:37:38, Ethernet0/0
C    192.168.35.0/24 is directly connected, Ethernet0/0

所以 R6 什麽也没有:

R6#show ip bgp

R6#

有两个办法可以解决,第一个方法当然是把 IGP 同步,例如在 R2 把 BGP Route redistribute 到 OSPF 之中。

R2(config)#router ospf 1
R2(config-router)#redistribute bgp 65200 subnets

R5 有 best path 了。(留意 r 的意思是 RIB failure,不要担心,这是因 iBGP (AD=200) 的 AD 不够 OSPF (AD=110) 低,所以系统标了 r  (Route Table 不用这条 Route,但对 BGP 的发布没有影响)。

R5#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
r>i1.1.1.0/24       2.2.2.2                  0    100      0 65100 i

R6 收到 BGP Route 了。

R6#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.56.5                           0 65200 65100 i

那麽另一个解决办法是什麽呢?就是乾脆把 Synchronization 关掉。只要在 BGP 设定中用 no synchronization 这个指令便可以。不过有一点需要留意的是:在某些 IOS 版本中,Synchronization default 是关掉的。

R2(config)#router bgp 65200
R2(config-router)#no synchronization
R5(config)#router bgp 65200
R5(config-router)#no synchronization

Route Reflector

再讨论图 6 的网络,读者有没有想过为什麽要借助 OSPF 来当桥梁呢?如果把全部 Router 都用 iBGP 连起来不就可以了吗?答案是可以的!不过现在又要宣布 BGP 中一个重要的法则……

从 iBGP Peers 得到的 Route 不会发布到另一个 iBGP Peers。

如果 AS65200 全部使用 iBGP 的话,R2 从 R1 那里收到 1.1.1.0/24,并发布到 R3 ,但 R3 不会把 Route 发给 R5。同样地,R4 也不会发给 R5。解决方法之一是 R2 也和 R5 建立 iBGP 连线,除此之外,为了整个 AS 里 的 Route 可以互通,我们应该把所有 Router 对应其他 Router 都建立 iBGP 连线,即所谓的 Fully Mesh。但 Fully Mesh 随着 Router 的数量增加,连线数目也会几何级数上升,另一个较好的方法是使用 neighbor <ip> route-reflector-client。Route Reflector 指令可以让 BGP Router 把从 iBGP Peers 得到的 Route 发布到另一个 iBGP Peers。设定方法如下:

hostname R3
!
router bgp 65200
 neighbor 192.168.23.2 remote-as 65200
 neighbor 192.168.23.2 route-reflector-client
 neighbor 192.168.35.5 remote-as 65200
!

Confederation

有时遇到较复杂的网路,在同一个 AS 里面有很多只 BGP Router 的话,用 Route Reflector 来建 iBGP Peers 仍然令人相当头痛,这时候我们还有一杀着,就是使用 Confederation。Confederation 可以把一个 AS 分成多个 Sub-AS,只需要每一个 Sub-AS 里的 BGP Router 要 Fully Mesh,设定简单之馀又方便管理。而其他 AS 的 Router 亦不会看到这些 Sub-AS,试看以下例子,图中把 AS 65000 分成两个 Sub-AS 10 和 20,留意 AS 65100 的 R7 会和 AS 65000 的 R1 成 eBGP Peers,而不是 AS 10,同样地, AS 65200 的 R6 会和 AS 65000 的 R5 成 eBGP Peers,而不是 AS 20。

bgp

来看看 R1 的 BGP 设定,基本上分别不大,只是多了以下两个 Command:

  • bgp confederation identifier <AS Number> – 宣告这个 Sub-AS 包含在那一个主 AS 里
  • bgp confederation peers <AS Number> – 还有那些相邻的 Sub-AS 呢?
hostname R1
!
router bgp 10
 bgp confederation identifier 65000  
 bgp confederation peers 20  
 neighbor 192.168.12.2 remote-as 10
 neighbor 192.168.13.3 remote-as 10
 neighbor 192.168.14.4 remote-as 20
 neighbor 192.168.17.7 remote-as 65100

假设全部 Router 已经设定好 BGP Peers,我们试试在 R6 用 Network 指令去发布 6.6.6.0/24 的网段。到 R7 看看 BGP Table,AS Path 并没有显示 AS 10 和 20 喔!

R7#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 6.6.6.0/24       192.168.17.1                           0 65000 65200 i

Best Path (最佳路径) 的选择

说了这麽久,终於进入我们的主菜,就是 BGP Best Path 的选择。什麽时候需要选择呢?当一只 Router 收到很多条关於同一个 destination 的 Route 时,一般情况下 BGP 只会选择一条最好的来使用。而选择的方法就是透过比较每条 BGP Route 当中不同的 Attribute (属性),现在介绍这些属性和比较的顺序。

0. 基本条件

在正式比较之前,BGP 会先检查 Route 的 3 个属性,附合这 3 个条件的 Route 才可进入比较程序,不附合的 Route 在这刻已经被即时淘汰了。

  1. Next-hop Address 所在 Network 必需为可到达,即存在於 Route Table 之中。
  2. As-path 不存在 Router 自身的 AS Number,这是为了防止 Loop 发生。
  3. 如 BGP 有开启 Synchronization,则必需附合,详情请看本篇 Synchronization 部份。

1. Weight (选较大的)

第一个比较项目是比 Weight,Weight 是本地 Router 对自己的 Peers 的权重值,谁的 Weight 大就用它给我的那条 Route。请注意 Weight 是 Cisco 独有的 Attribute,其他牌子是没有的。用以下例子去测试一下,假设所有 IP address,BGP Peers 都设定好,R1 与 R2 和 R1 与 R3 之间的 iBGP Peers 用了 Next-hop-self 指令,R1 执行了 Route Reflector,R6 把 Loopback 0 的 6.6.6.0/24 用 Network 指令发布出来。

bgp

在 R1 看看 BGP Table,得知现时选择了 192.168.12.2 为 Best Path,两条 Route 的 Weight 是 0,因为在没有设定的情况下,Weight default 设定是 0 ,由於 Weight 相等,BGP 用了其他方法去决定 Next Hop 192.168.12.2 是 Best Path。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.13.3             0    100      0 65100 65300 i
*>i                 192.168.12.2             0    100      0 65200 65300 i

有几个方法可以更改 Weight 的设定,其中一个最简单的方法就是在 R1 使用 neighbor <ip> weight <default weight> 指令,然後用 clear ip bgp * 去 reset 所有 Peers:

R1(config)#router bgp 65000
R1(config-router)#neighbor 192.168.13.3 weight 1000 
R1(config-router)#end
R1#
*Mar  1 00:21:19.123: %SYS-5-CONFIG_I: Configured from console by console
R1#clear ip bgp *
R1#
*Mar  1 00:24:05.375: %BGP-5-ADJCHANGE: neighbor 192.168.12.2 Down User reset
*Mar  1 00:24:05.379: %BGP-5-ADJCHANGE: neighbor 192.168.13.3 Down User reset
*Mar  1 00:24:06.079: %BGP-5-ADJCHANGE: neighbor 192.168.12.2 Up
R1#
*Mar  1 00:24:06.587: %BGP-5-ADJCHANGE: neighbor 192.168.13.3 Up

这时再 show ip bgp,Next Hop 192.168.13.3 这条 Route 的 Weight 值变成 1000 了,基於这条 Route Weight 1000 比较大,所以选择了这条做 Best Path。亦只有这条 Route 会被 R1 发布到其他 Peers。

R1#show ip bgp

<Output Omitted>

Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.12.2          0    100      0 65200 65300 i
*>i                 192.168.13.3          0    100   1000 65100 65300 i

留意 Weight 只是一个用於 Local Router 的 Attribute,所以 Weight 值并不会跟随 Route 发布到另一个 Router。这时看看 R2 的 BGP Table,所有 Weight 仍然是 0,R2 选择自己的 Best Path。

R2#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.13.3             0    100      0 65100 65300 i
*>                  192.168.24.4                           0 65200 65300 i

2. Local Preference (选较大的)

如果因为 Weight 相同而没法选出 Best Path,BGP 会用 Local Preference 来判断,一条 Route 的Local Preference 较大的话,它就是整个 AS 对於该个 Destination 的出口。接着,我们再使用相同的例子,但先在 R1 把两条 Route 的 Weight 调至一样。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    100   1000 65200 65300 i
* i                 192.168.13.3             0    100   1000 65100 65300 i

这样第一条 Route 又比选为 Best Path 了。慢着!我们还未作 Local Preference 的调校工作,为什麽会是 100 呢?这是因为凡是透过 iBGP Peers 传来的 Route,Local Preference default 值都是 100。为了证明较大的被选中,我们尝试在 R3 把从 R5 传来 6.6.6.0/24 这条 Route 的 Local Preference 设定成 500,看看会有什麽变化。我们可以使用 Route Map 来完成。

R3(config)#router bgp 65000
R3(config-router)#neighbor 192.168.35.5 route-map TuningLocPrf in
R3(config-router)#exit
R3(config)#ip access-list extended RouteMatch
R3(config-ext-nacl)#permit ip 6.6.6.0 0.0.0.255 any
R3(config-ext-nacl)#route-map TuningLocPrf permit 10
R3(config-route-map)#match ip address RouteMatch
R3(config-route-map)#set local-preference 500
R3(config-route-map)#end
R3#clear ip bgp *

由於 Local Preference 是整个 AS 的事,所以这个 Attribute 会传送到 iBGP Peers。看看 R1 的 BGP Table,可以看到 Local Preference 已经变成 500 了,顺理成章地,R1 把这条选为 Best Path。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.13.3             0    500   1000 65100 65300 i
* i                 192.168.12.2             0    100   1000 65200 65300 i

3. Locally Originated (本机原生)

即由本机用指令 Network丶Aggregate-address 生成或由本机把 IGP Route Redistribute 到 BGP 的 Route,较从其他 Neighbor 收回来的 Route 好。

4. AS Path (选较短的)

AS Path 是到达目的地网段所要经过的 AS,BGP 认为 AS Path 越短越好,如果以上两点都无法分出胜负,BGP 就会选 AS Path 较短的那条 Route 为 Best Path。以同一例子来测试,不过我们先把 R1 的两条 Route Local Preference 值调整到一样。

R1#sh ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    500   1000 65200 65300 i
* i                 192.168.13.3             0    500   1000 65100 65300 i

现时使用了第一条 Route 为 Best Path,如果把第一条的 AS Path 增长,那麽第二条 Route 应该可以成为 Best Path。如果我们不想大费周章去改变网络的 Topology,那怎样可以简单地改动 AS Path 来测试呢?我们可以使用 Route Map 里面的 Prepend。Prepend 可以在 AS Path 很犯规地加入一些 AS Number,让它变得较长,不过此方法只可用於 eBGP Peers 传来的 Route,iBGP Peers 传出的是不能修改 AS Path 的。因此,为了延长第一条 Route 的 AS Path,我们可以走到 R4 改设定,实例如下:

R4(config)#router bgp 65200
R4(config-router)#neighbor 192.168.24.2 route-map TuningAsPath out
R4(config-router)#exit
R4(config)#ip prefix-list MatchNetwork seq 5 permit 6.6.6.0/24
R4(config)#route-map TuningAsPath
R4(config-route-map)#match ip address prefix-list MatchNetwork
R4(config-route-map)#set as-path prepend 65200
R4(config-route-map)#end
R4#clear ip bgp *

为什麽是 Prepend 65200 呢?我们目标只想把 AS Path 延长,AS Number 是什麽都没有关系,不过为了防止有 Routing Loop 出现,我们通常都会使用 AS Path 最前面的一个 AS Number 作为 Prepend 的 AS,所以就用了 65200。现在看看 R1 的 BGP Table,由於第二条 Route 的 AS Path 较短,所以被选定为 Best Path 了。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.12.2             0    500   1000 65200 65200 65300 i
*>i                 192.168.13.3             0    500   1000 65100 65300 i
R1#

5. Origin Type (选较小的)

之前曾经介绍过 Origin 有三个值,i , e 和 ? ,e 已经很少会用到了,因此只需学习 i 和 ?,i 表示该 Route 的来源是 IGP丶使用 Network 指令或 Aggregate-address 指令,? 表示该 Route 是通过 redistribute 得来的。要测试这个 Attribute ,首先我们得把 AS Path 长度调至一样,如下图:

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    500   1000 65200 65300 i
* i                 192.168.13.3             0    500   1000 65100 65300 i

现在尝试把第一条 Route 的 Origin 改成 ? ,看看能否把 Best Path 改变。要怎样改呢?我们可以在 R4 加入一条指向 6.6.6.0/24 的 Static Route,然後把它 Redistribute 到 BGP 中。

R4(config)#ip route 6.6.6.0 255.255.255.0 null 0
R4(config)#router bgp 65200
R4(config-router)#redistribute static

回到 R1 看 BGP Table,Origin 变成 ?,但由於 R4 的设定改变了 AS Path,我们必需 Prepend AS Path,来证明在 AS Path 长度相同的情况下,BGP 比较喜欢 i 多於 ? 。Prepend AS Path 的办法在上一部份已说明过,在此不重覆描述。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    500   1000 65200 ?
* i                 192.168.13.3             0    500   1000 65100 65300 i

Prepend 好 AS Path 之後,两条 Route AS Path 长度一样,BGP Table 果然选了 Origin i 的第二条作 Best Path。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.12.2             0    500   1000 65200 65200 ? *>i                 192.168.13.3             0    500   1000 65100 65300 i

6. MED (选较小的)

故事尚未完结,如果去到 Origin Type 也相同,下一个要比较的就是 MED (Metric)。MED 就像 IGP 里的 Metric,是一个可以传到另一个 AS 的 Attribute,Metric 较少的 Route 会被选为 Best Path。不过要注意的是,MED 必需要在 AS Path 中第一个 AS Number 相同的时候才会作出比较,除非使用了 bgp always compare MED,则不设此限。为了做这个测试,我们在图 7 的 Topology 中把 AS 65200 改成 65100。

bgp

另外还故意把 Weight, LocPrf, AS Path, Origin 都设定成相同的值,现时使用第一条 Route 作为 Best Path,如果把第一条 Route 的 Metric 增大,理论上它就会失去 Best Path 了。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    500   1000 65100 65300 i
* i                 192.168.13.3             0    500   1000 65100 65300 i

尝试在 R4 用 Route Map 把 Metric 增加至 100,看看 Best Path 是否会改变。

R4(config)#router bgp 65100
R4(config-router)#neighbor 192.168.24.2 route-map TuningMetric out
R4(config-router)#exit
R4(config)#ip prefix-list MatchNetwork seq 5 permit 6.6.6.0/24
R4(config)#route-map TuningAsPath permit 10
R4(config-route-map)#match ip address prefix-list MatchNetwork
R4(config-route-map)#set metric 100
R4(config-route-map)#end
R4#clear ip bgp *

由於第二条 Route Metric 比较小,现在成为了 Best Path。值得留意的是,这个 AS 当中的 R2 和 R3 的 Metric 同样改变了,因为 Metric 是传到整个 AS 当中的。

R1#sh ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.12.2           100    500   1000 65100 65300 i
*>i                 192.168.13.3             0    500   1000 65100 65300 i
R2#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 6.6.6.0/24       192.168.24.4           100    500      0 65100 65300 i
* i                 192.168.13.3             0    500      0 65100 65300 i
R3#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 6.6.6.0/24       192.168.35.5                           0 65100 65300 i
* i                 192.168.12.2           100    500      0 65100 65300 i

预设情况下,如 Route 没有提供 MED 值则设为 0,如使用 bgp bestpath med missing-as-worst 则预设值改为最大值,即 4,294,967,294。

7. eBGP vs iBGP

如果以上全部相同,eBGP 的路径会优於 iBGP。就算 Best Path 在这个阶段被选出,BGP 仍会跳到 9. Multipath 检查是否需要做 Load Sharing。由此可见,如希望做 Multipath 设定,之前所比较的 1-6 项 Attribute 必需全部相同。

8. Next-hop 的 IGP Metric (选较小的)

如此时未能选出 best path,则比较到达 Next-hop 的 IGP Metric,较小的胜出。就算 Best Path 在这个阶段被选出,BGP 仍会跳到 9. Multipath 检查是否需要做 Load Sharing。

9. Multipath

BGP 所支缓的是 Unbalanced Load Sharing,即可以参考 Interface 的 Bandwidth 设定去分配 Traffic。现在使用以下网络作例子,进行 Multipath 设定。

bgp

R5 一共有 3 条 Path 到达 172.16.4.0/24。在预设情况下,Multipath 设定值为 1,即不会进行 Load Balancing。

R5#show ip protocols 
*** IP Routing is NSF aware ***

Routing Protocol is "bgp 65125"
  Outgoing update filter list for all interfaces is not set
  Incoming update filter list for all interfaces is not set
  IGP synchronization is disabled
  Automatic route summarization is disabled
  Neighbor(s):
    Address          FiltIn FiltOut DistIn DistOut Weight RouteMap
    192.168.15.1                                         
    192.168.25.2                                         
    192.168.35.3                                         
  Maximum path: 1
  Routing Information Sources:
    Gateway         Distance      Last Update
    192.168.35.3          20      00:02:10
  Distance: external 20 internal 200 local 200

所以根据概定程序选了 Next-hop 192.168.25.2 为 Best Path。

R5#show ip bgp  
BGP table version is 5, local router ID is 192.168.35.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *   172.16.4.0/24    192.168.35.3                           0 65001 i
 *                    192.168.15.1                           0 65001 i
 *>                   192.168.25.2                           0 65001 i

现在把 Maximum Path 加至 3。

R5(config)#router bgp 65005
R5(config-router)#maximum-paths 3

於是所有 3 条 BGP Route 也入选成为 Multipath,留意 Best Path 仍然存在,Router 只会把 Best Path 发布给其他 Neighbor。

R5#show ip bgp 
BGP table version is 6, local router ID is 192.168.35.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *m  172.16.4.0/24    192.168.35.3                           0 65001 i
 *m                   192.168.15.1                           0 65001 i
 *>                   192.168.25.2                           0 65001 i

show ip route 可以查看现时的 Traffic 分布,可见现时分布是 1:1:1。

R5#show ip route 172.16.4.0
Routing entry for 172.16.4.0/24
  Known via "bgp 65005", distance 20, metric 0
  Tag 65001, type external
  Last update from 192.168.25.2 00:05:20 ago
  Routing Descriptor Blocks:
  * 192.168.35.3, from 192.168.35.3, 00:05:20 ago
      Route metric is 0, traffic share count is 1
      AS Hops 1
      Route tag 65001
      MPLS label: none
    192.168.25.2, from 192.168.25.2, 00:05:20 ago
      Route metric is 0, traffic share count is 1
      AS Hops 1
      Route tag 65001
      MPLS label: none
    192.168.15.1, from 192.168.15.1, 00:05:20 ago
      Route metric is 0, traffic share count is 1
      AS Hops 1
      Route tag 65001
      MPLS label: none

由於 R5 > R3 这条 Path 速度较慢,平均分布 Traffic 并非好办法。我们可以用 bgp dmzlink-bw 要求 BGP 按照 Interface 的 Bandwidth 去分配 Traffic。

R5(config-router)#bgp dmzlink-bw 
R5(config-router)#neighbor 192.168.15.1 dmzlink-bw 
R5(config-router)#neighbor 192.168.25.2 dmzlink-bw 
R5(config-router)#neighbor 192.168.35.3 dmzlink-bw

新的 Traffic 分布为 37:240:240。

R5#show ip route 172.16.4.0
Routing entry for 172.16.4.0/24
  Known via "bgp 65005", distance 20, metric 0
  Tag 65001, type external
  Last update from 192.168.25.2 00:00:19 ago
  Routing Descriptor Blocks:
  * 192.168.35.3, from 192.168.35.3, 00:00:19 ago
      Route metric is 0, traffic share count is 37
      AS Hops 1
      Route tag 65001
      MPLS label: none
    192.168.25.2, from 192.168.25.2, 00:00:19 ago
      Route metric is 0, traffic share count is 240
      AS Hops 1
      Route tag 65001
      MPLS label: none
    192.168.15.1, from 192.168.15.1, 00:00:19 ago
      Route metric is 0, traffic share count is 240
      AS Hops 1
      Route tag 65001
      MPLS label: none

以上只是部份比较常用的 Best Path 机制,如果希望了解更多,你可以到 这里 查看更详细的教学。

Community

Community 是一个 BGP 的 Attribute,作用就好像在发布的 Prefix 上加一个 Label,当其他 BGP Router 收到这条 Prefix 时,就可以检测这个 Label 的值来做某些动作,我们用以下的网络做一个实验:

bgp

假设所有 IP 和 BGP 都已经设定好,R1 把 1.1.1.0 / 24 发布出去,我们先看看 R2 的 BGP Table 里关於 1.1.1.0 Prefix 的资料:

R2#show ip bgp 1.1.1.0
BGP routing table entry for 1.1.1.0/24, version 2
Paths: (1 available, best #1, table Default-IP-Routing-Table)
  Not advertised to any peer
  65000
    192.168.12.1 from 192.168.12.1 (192.168.12.1)
      Origin IGP, metric 0, localpref 100, valid, external, best

现在我们尝试在 R1 发布 1.1.1.0 时贴上一个 Community,可以用 Route Map 简单完成,但要留意的是,BGP 预设是不会传送 Community 这个 Attribute,需要用 neighbor <IP> send-community 这个指令去启动。

hostname R1
!
router bgp 65000
 network 1.1.1.0 mask 255.255.255.0
 neighbor 192.168.12.2 remote-as 65001
 neighbor 192.168.12.2 send-community  
 neighbor 192.168.12.2 route-map SetComm out
!
access-list 1 permit 1.1.1.0 0.0.0.255
!
route-map SetComm permit 10
 match ip address 1
 set community 1000

现在看看 R2 的 Prefix 1.1.1.0,发现多了一行 Community 显示值为 1000。

R2#show ip bgp 1.1.1.0
BGP routing table entry for 1.1.1.0/24, version 2
Paths: (1 available, best #1, table Default-IP-Routing-Table)
Flag: 0x820
  Not advertised to any peer
  65000
    192.168.12.1 from 192.168.12.1 (192.168.12.1)
      Origin IGP, metric 0, localpref 100, valid, external, best
      Community: 1000

於是,我们就可以在 R2 使用 Community List 和 Route Map 配合一起做些事情。例如我们想把 Community 是 1000 的 prefix 的 Local Preference 改成 500。

hostname R2
!
router bgp 65001
 neighbor 192.168.12.1 remote-as 65000
 neighbor 192.168.12.1 route-map SetLocal in
 no auto-summary
!
ip community-list 1 permit 1000 
!
route-map SetLocal permit 10
 match community 1
 set local-preference 500
R2#show ip bgp
BGP table version is 2, local router ID is 192.168.12.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.12.1             0    500      0 65000 i

另外,利用 Community 也能做一些 Route Filtering 的动作。Community 的值除了可以自己设定外,其实系统有 4 个预设值可以使用,分别是:no-advertise,local-AS,no-export 和 internet,4 个预设值的作用如下:

Keywords 功能
no-advertise 告诉收到这条 Prefix 的 Router 不要将这条 Prefix 发布出去
local-AS 告诉收到这条 Prefix 的 Router 这条 Prefix 只能发布给 Confederation 中的同一个 AS
no-export 告诉收到这条 Prefix 的 Router 不要将这条 Router 发布给其他 AS
internet 告诉收到这条 Prefix 的 Router 这条 Prefix 可以自由发布

现在用以下网络来测试不同的 Community。

bgp

首先在 R1 用 Route Map 设定好不同 Prefix 的 Community。

hostname R1
!
router bgp 10
 bgp confederation identifier 65000
 bgp confederation peers 20
 network 1.1.1.0 mask 255.255.255.0
 network 2.2.2.0 mask 255.255.255.0
 network 3.3.3.0 mask 255.255.255.0
 network 4.4.4.0 mask 255.255.255.0
 neighbor 192.168.12.2 remote-as 10
 neighbor 192.168.12.2 send-community
 neighbor 192.168.12.2 route-map TuneComm out
!
access-list 1 permit 1.1.1.0 0.0.0.255
access-list 2 permit 2.2.2.0 0.0.0.255
access-list 3 permit 3.3.3.0 0.0.0.255
access-list 4 permit 4.4.4.0 0.0.0.255
!
route-map TuneComm permit 10
 match ip address 1
 set community no-advertise 
!
route-map TuneComm permit 20
 match ip address 2
 set community local-AS 
!
route-map TuneComm permit 30
 match ip address 3
 set community no-export 
!
route-map TuneComm permit 40
 match ip address 4
 set community internet

到 R2 看看各 Prefix 的 Community:

R2#show ip bgp 1.1.1.0
BGP routing table entry for 1.1.1.0/24, version 2
Paths: (1 available, best #1, table Default-IP-Routing-Table, not advertised to any peer)
  Not advertised to any peer
  Local, (Received from a RR-client)
    192.168.12.1 from 192.168.12.1 (4.4.4.4)
      Origin IGP, metric 0, localpref 100, valid, confed-internal, best
      Community: no-advertise 
R2#show ip bgp 2.2.2.0
BGP routing table entry for 2.2.2.0/24, version 3
Paths: (1 available, best #1, table Default-IP-Routing-Table, not advertised outside local AS)
  Advertised to update-groups:
     1
  Local, (Received from a RR-client)
    192.168.12.1 from 192.168.12.1 (4.4.4.4)
      Origin IGP, metric 0, localpref 100, valid, confed-internal, best
      Community: local-AS 
R2#show ip bgp 3.3.3.0
BGP routing table entry for 3.3.3.0/24, version 4
Paths: (1 available, best #1, table Default-IP-Routing-Table, not advertised to EBGP peer)
  Advertised to update-groups:
     1
  Local, (Received from a RR-client)
    192.168.12.1 from 192.168.12.1 (4.4.4.4)
      Origin IGP, metric 0, localpref 100, valid, confed-internal, best
      Community: no-export 
R2#show ip bgp 4.4.4.0
BGP routing table entry for 4.4.4.0/24, version 5
Paths: (1 available, best #1, table Default-IP-Routing-Table)
  Advertised to update-groups:
     1
  Local, (Received from a RR-client)
    192.168.12.1 from 192.168.12.1 (4.4.4.4)
      Origin IGP, metric 0, localpref 100, valid, confed-internal, best
      Community: internet

在 R3 查看 BGP Table,发现没有收到 1.1.1.0 / 24,因为 R2 看见这条 Prefix 是 no-advertise 因此不发给 R3。

R3#show ip bgp
BGP table version is 4, local router ID is 192.168.34.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*>i2.2.2.0/24       192.168.12.1             0    100      0 i
*>i3.3.3.0/24       192.168.12.1             0    100      0 i
*>i4.4.4.0/24       192.168.12.1             0    100      0 i

在 R4 查看 BGP Table,发现没有收到 2.2.2.0 / 24,因为 R3 看见 Prefix 的 Community 是 local-AS,这条 Prefix 只能存在於 Confederation 的 Local AS 之中,R4 位於另一个 AS,因此 R3 不把这条 Prefix 发出去。

R4#show ip bgp
BGP table version is 3, local router ID is 192.168.45.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 3.3.3.0/24       192.168.34.3             0    100      0 (10) i
*> 4.4.4.0/24       192.168.34.3             0    100      0 (10) i

最後,在 R5 不会看到 3.3.3.0 / 24,因为这条 Prefix 的 Community 是 no-export,因此 R4 不会发给位於其他 AS 之内的 R5。至於 4.4.4.0 / 24 的 Community 是 internet 则没有此限制。

R5#show ip bgp
BGP table version is 2, local router ID is 192.168.45.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 4.4.4.0/24       192.168.45.4                           0 65000 i

Aggregate-address

所有Routing Protocol 都提供 Summary 功能。在 BGP 里面称为 Aggregate Address,意思就是把多条 Route 组合成一条来发布。由於每条 BGP Route 都涉及不同 Attribute 值,令 BGP 的 Summery Address 发布变得复杂。

现在使用以下网络作例子,R3 发布 10.0.0.0/24 及 10.0.1.0/24,R1 及 R2 都收到这两条 Route。

bgp

Aggregate-address 指令可以发布 Summary,大前题是负责发布的 Router 的 BGP Table 必需拥有此 Summary 内的最少一个 Subnet,不能无中生有。如在 R2 执行 Aggregate-address,R1 就会收到 Summary Route。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0
R1#show ip bgp              
BGP table version is 8, local router ID is 192.168.12.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i 10.0.0.0/24      192.168.12.2             0    100      0 65023 1000 2000 i
 *>i 10.0.0.0/23      192.168.12.2             0    100      0 i
 *>i 10.0.1.0/24      192.168.12.2             0    100      0 65023 2000 4000 i

在 R1 的 BGP Table 中,除了 /23 Summary Route 外,仍然收到 /24 Route,如想 R1 只收 /23 Summary Route,可在 Aggregate-address 加上 Summary-only 选项。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 summary-only
R1#show ip bgp              
BGP table version is 8, local router ID is 192.168.12.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i 10.0.0.0/23      192.168.12.2             0    100      0 i

如想保留部份 Route,可用 Suppress-map,使用方法如下。

R2(config-router)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 as-set summary-only suppress-map SUPP
R2(config-router)#exit
R2(config)#ip prefix-list P1 seq 5 permit 10.0.0.0/24
R2(config)#route-map SUPP permit 10
R2(config-route-map)#match ip address prefix-list P1
R1#show ip bgp              
BGP table version is 8, local router ID is 192.168.12.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i 10.0.0.0/23      192.168.12.2             0    100      0 i
 *>i 10.0.1.0/24      192.168.12.2             0    100      0

留意 Summary Route 失去了 AS Path 资讯,AS Path 是防止 Route Loop 的机制,建议在 Aggregate-address 增加 As-set 选项保留 AS Path 资讯。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 summary-only as-set
R1#show ip bgp      
BGP table version is 15, local router ID is 192.168.12.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i 10.0.0.0/23      192.168.12.2             0    100      0 {65023,1000,3000,2000,4000} i

留意 As-set 除了保留 AS Path 资讯,也帮 Summary Route 继承所有 Community 属性。

R1#show ip bgp 10.0.0.0/23  
BGP routing table entry for 10.0.0.0/23, version 25
Paths: (1 available, best #1, table default, not advertised to EBGP peer)
  Not advertised to any peer
  Refresh Epoch 2
  {65023,1000,3000,2000,4000}, (aggregated by 65012 192.168.23.2)
    192.168.12.2 from 192.168.12.2 (192.168.23.2)
      Origin IGP, metric 0, localpref 100, valid, internal, best
      Community: no-export local-AS
      rx pathid: 0, tx pathid: 0x0

如不想继承所有 Community 属性,可以使用 Advertise-map 去帮 Summary Route 选择继承那一条 Route 的属性。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 as-set advertise-map ADV
R2(config-router)#exit
R2(config)#ip prefix-list P1 seq 5 permit 10.0.0.0/24
R2(config)#route-map ADV permit 10
R2(config-route-map)#match ip address prefix-list P1

也可以使用 Attribute-map 直接去改变 Summary Route 的属性。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 as-set attribute-map ATTR
R2(config-router)#exit
R2(config)#route-map ATTR permit 10
R2(config-route-map)#set metric 9999
R2(config-route-map)#set local-preference 999
R2(config-route-map)#set community internet
R1#show ip bgp 10.0.0.0/23
BGP routing table entry for 10.0.0.0/23, version 10
Paths: (1 available, best #1, table default)
  Not advertised to any peer
  Refresh Epoch 1
  {65023,1000,3000,2000,4000}, (aggregated by 65012 192.168.23.2)
    192.168.12.2 from 192.168.12.2 (192.168.23.2)
      Origin IGP, metric 9999, localpref 999, valid, internal, best
      Community: internet
      rx pathid: 0, tx pathid: 0x0

笔者用 GNS3 测试 Advertise-map 和 Attribute-map 时需要 clear ip bgp * 才能生效,未知是否 bug。

Route Injection

Aggregate address 可以把 Route 组合成 Summary Route,Route Injection 刚好相反,可把 Summary 拆散成不同的 Route。但 Route Injection 设定比较严谨,必需用 Exist-map 确定 Summary Route 存在而且来自附合的 Source Address。以下例子把 10.0.0.0/24 拆成 10.0.0.0/25 和 10.0.0.128/25。

router bgp 60512
 bgp inject-map INJECT exist-map EXIST
!
ip prefix-list P24 permit 10.0.0.0/24
!
ip prefix-list P25 permit 10.0.0.0/25
ip prefix-list P25 permit 10.0.0.128/25
!
ip prefix-list PSOURCE permit 192.168.23.3/32
!
route-map EXTIST permit 10 // Exist-map 必需包含以下两个 Match
 match ip address prefix-list P24 // 要分拆解的 Summary Route
 match ip route-source prefix-list PSOURCE // 由谁发布这 Summary Route
!         
route-map INJECT permit 10
 set ip address prefix-list P25 // 要分拆成这些 Route,紧记这里是 Set 不是 Match

Backdoor

Backdoor 的概念其实十分容易理解,请看以下这个网络。网络同时存在 EIGRP 和 BGP,假设 R2 把 2.2.2.0 / 24 透过 EIGRP 和 BGP 发布。

bgp

由於 R1 同时执行了 EIGRP 和 BGP,它会分别收到 BGP 传来的 2.2.2.0 / 24 和 EIGRP 传来的 2.2.2.0 / 24,由於 EGIRP 的 AD 是 90,而 BGP 的 AD 是 20 (这是 EBGP),因此 R1 会选择 R1>R3>R2 的路径到达 R2,这显然不是最好的路径。

R1#show ip bgp
BGP table version is 6, local router ID is 1.1.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
r> 2.2.2.0/24       192.168.13.3                           0 65001 i
R1#
R1#show ip eigrp topology
IP-EIGRP Topology Table for AS(1)/ID(1.1.1.1)

Codes: P - Passive, A - Active, U - Update, Q - Query, R - Reply,
       r - reply Status, s - sia Status

P 2.2.2.0/24, 1 successors, FD is 409600
        via 192.168.12.2 (409600/128256), Ethernet0/0
P 192.168.12.0/24, 1 successors, FD is 281600
        via Connected, Ethernet0/0
R1#
R1#show ip route | begin Gateway
Gateway of last resort is not set

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
C       1.1.1.0 is directly connected, Loopback0
C    192.168.13.0/24 is directly connected, Ethernet0/1
     2.0.0.0/24 is subnetted, 1 subnets
B       2.2.2.0 [20/0] via 192.168.13.3, 00:00:02

要解决这个问题,除了改 AD 之外,我们还可以在 R1 的 BGP 设定 backdoor,告诉 R1 BGP 只用作「後备路径」,这样 R1 便会优先使用 EIGRP 的 Route,设定方法如下。

R1(config)#router bgp 65000
R1(config-router)#network 2.2.2.0 mask 255.255.255.0 backdoor 
R1(config-router)#end
R1#show ip route | begin Gateway
Gateway of last resort is not set

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
C       1.1.1.0 is directly connected, Loopback0
C    192.168.13.0/24 is directly connected, Ethernet0/1
     2.0.0.0/24 is subnetted, 1 subnets
D       2.2.2.0 [90/409600] via 192.168.12.2, 00:00:22, Ethernet0/0

Dampening

我们都知道一个 BGP Update 可以改变世界!由於 Route 不稳定而产生的 Update 可能会影响地球上其他 BGP Router 的路径选择。Dampening 设定可以容忍 Route 在短时间内的迅速改变从而减少不必要的 BGP Update,要了解 Dampening,请先用 bgp dampeing 启动 Dampering,然後用 show ip bgp dampening parameters 看看预设的参数。

R1(config)#router bgp 65001
R1(config-router)#bgp dampening 
R1(config-router)#exit
R1#show ip bgp dampening parameters 

 dampening 15 750 2000 60 (DEFAULT)
  Half-life time      : 15 mins       Decay Time       : 2320 secs
  Max suppress penalty: 12000         Max suppress time: 60 mins
  Suppress penalty    :  2000         Reuse penalty    : 750

现在解释每一个参数的意思。

Suppress Penalty

话说 Dampening 设定一旦被启动後,Route 的状态改变会让该 Route 的 Penalty 值提升,Update/Withdraw 会让 Penalty 值增加 1000,而 Attribute 改变则会增加 500。如 Route 的 Penalty 值大於 Suppress Penalty 值则会触发 Suppress,即 BGP Router 认为此 Route 不稳定暂时不会发布给其他 Router。

Max Suppress Penalty

然而 Penalty 值并不会无限量增加下去,Max Suppress Penalty 为 Penalty 的最大值,预设为 12000。

Half-life Time

Route 的 Penalty 值又会随着时间慢慢下调,预设每 15 分钟就会减去一半。由此可见,如 Route 开始稳定而没有再发生状态改变,Penalty 值必然慢慢减少。

Reuse Penalty

当 Penalty 值减至小於 Reuse Penalty,BGP Router 觉得这条 Route 终於稳定下来了,又会开始向外发布这条 Route。

Max Suppress Time

Max Suppress Time 是一条 Route 被 Suppress 的最长时间,预设为 60 分钟。即是说 Route 由被 Suppress 开始算起如果过了 60 分钟,无论 Penalty 是多少都必需被释放。

我们可以使用以下指令改变 Dampening 的几个参数,bgp dampening <Half-life> <Reuse Penalty> <Suppress Penalty> <Max Suppress Time>,Max Suppress Penalty 会被自动计算出来。

R1(config)#router bgp 65001
R1(config-router)#bgp dampening 10 1000 2000 30
R1(config-router)#exit
R1#show ip bgp dampening parameters 

 dampening 10 1000 2000 30
  Half-life time      : 10 mins       Decay Time       : 1200 secs
  Max suppress penalty:  8000         Max suppress time: 30 mins
  Suppress penalty    :  2000         Reuse penalty    : 1000

相關主題

发表回复

2021-07-22

Posted In: Layer 3 网络技术, menu-tall-3-zh-hans

Leave a Comment