菜单

[Network Design] 使用 50条路由条目来设计高冗余网络

2020年2月3日 - Cisco

这篇文章将以较长的篇幅来描述我曾经设计过的一张网络。

因年代久远且客户已经退租,故将其分享出来,敬请指点。

由于实验用模拟器不支持 LACP,所以去掉 LACP 与 VPC 功能,使用以下拓扑进行模拟。

模拟器使用拓扑图:

客户的需求:

本题的最大难点:

解决此问题需要用到的一些技术:

需要预先做好的准备工作:

做完准备工作后,我们来验证路由器工作状态。

检查路由表

NXOS-Left# show ip route
IP Route Table for VRF "default"
'*' denotes best ucast next-hop
'**' denotes best mcast next-hop
'[x/y]' denotes [preference/metric]
'%<string>' in via output denotes VRF <string>

0.0.0.0/0, ubest/mbest: 1/0
    *via 60.0.0.0, [20/0], 00:40:56, bgp-65535, external, tag 6939
8.8.8.8/32, ubest/mbest: 1/0
    *via 60.0.0.0, [20/0], 00:40:56, bgp-65535, external, tag 6939
60.0.0.0/31, ubest/mbest: 1/0, attached
    *via 60.0.0.1, Eth1/2, [0/0], 00:41:12, direct
60.0.0.1/32, ubest/mbest: 1/0, attached
    *via 60.0.0.1, Eth1/2, [0/0], 00:41:12, local
100.70.0.0/31, ubest/mbest: 1/0, attached
    *via 100.70.0.0, Vlan999, [0/0], 00:41:12, direct
100.70.0.0/32, ubest/mbest: 1/0, attached
    *via 100.70.0.0, Vlan999, [0/0], 00:41:12, local
192.0.2.0/24, ubest/mbest: 1/0, attached
    *via 192.0.2.2, Vlan100, [0/0], 00:41:12, direct
192.0.2.1/32, ubest/mbest: 1/0, attached
    *via 192.0.2.1, Vlan100, [0/0], 00:41:12, hsrp
192.0.2.2/32, ubest/mbest: 1/0, attached
    *via 192.0.2.2, Vlan100, [0/0], 00:41:12, local
NXOS-Right# show ip route
IP Route Table for VRF "default"
'*' denotes best ucast next-hop
'**' denotes best mcast next-hop
'[x/y]' denotes [preference/metric]
'%<string>' in via output denotes VRF <string>

0.0.0.0/0, ubest/mbest: 1/0
    *via 60.1.0.0, [20/0], 00:42:04, bgp-65535, external, tag 6939
8.8.8.8/32, ubest/mbest: 1/0
    *via 60.1.0.0, [20/0], 00:42:04, bgp-65535, external, tag 6939
60.1.0.0/31, ubest/mbest: 1/0, attached
    *via 60.1.0.1, Eth1/2, [0/0], 00:44:09, direct
60.1.0.1/32, ubest/mbest: 1/0, attached
    *via 60.1.0.1, Eth1/2, [0/0], 00:44:09, local
100.64.0.0/31, ubest/mbest: 1/0, attached
    *via 100.64.0.1, Eth1/3, [0/0], 00:44:09, direct
100.64.0.1/32, ubest/mbest: 1/0, attached
    *via 100.64.0.1, Eth1/3, [0/0], 00:44:09, local
100.70.0.0/31, ubest/mbest: 1/0, attached
    *via 100.70.0.1, Vlan999, [0/0], 00:44:07, direct
100.70.0.1/32, ubest/mbest: 1/0, attached
    *via 100.70.0.1, Vlan999, [0/0], 00:44:07, local
192.0.2.0/24, ubest/mbest: 1/0, attached
    *via 192.0.2.3, Vlan100, [0/0], 00:44:06, direct
192.0.2.3/32, ubest/mbest: 1/0, attached
    *via 192.0.2.3, Vlan100, [0/0], 00:44:06, local

检查 HSRP 热冗余协议:

NXOS-Left# show hsrp brief
*:IPv6 group   #:group belongs to a bundle
                     P indicates configured to preempt.
                     |
Interface   Grp Prio P State    Active addr      Standby addr     Group addr
  Vlan100     100  99   P Standby  192.0.2.3        local            192.0.2.1
     (conf)
NXOS-Right# show hsrp brief
*:IPv6 group   #:group belongs to a bundle
                     P indicates configured to preempt.
                     |
Interface   Grp Prio P State    Active addr      Standby addr     Group addr
  Vlan100     100  101  P Active   local            192.0.2.2        192.0.2.1
     (conf)

检查互通性:

[admin@Blade-server-device-bay] > ping 8.8.8.8
  SEQ HOST                                     SIZE TTL TIME  STATUS
    0 8.8.8.8                                    56 253 103ms
    1 8.8.8.8                                    56 253 36ms
    2 8.8.8.8                                    56 253 16ms
    3 8.8.8.8                                    56 253 16ms
    sent=4 received=4 packet-loss=0% min-rtt=16ms avg-rtt=42ms max-rtt=103ms

检查完成,设备工作正常。现在我们来做冗余。

配置 Littlewolf router:

littlewolf-backbone#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
littlewolf-backbone(config)#router ospf 1
littlewolf-backbone(config-router)#
littlewolf-backbone(config-router)#default-information originate // 这里不能写 always,要让 ospf 在 bgp 下发默认路由的时候才注入默认路由。 
littlewolf-backbone(config-router)#int g3
littlewolf-backbone(config-if)#ip os 1 a 0
littlewolf-backbone(config-if)#end

littlewolf-backbone#show run | sec bgp
router bgp 138667
 bgp log-neighbor-changes
 network 192.0.2.0 mask 255.255.255.0

配置好 littlewolf router 的 BGP 和 OSPF,现在开始配置两台 NXOS 的冗余。

首先配置右侧的默认路由引入

NXOS-Right(config-if)# int vlan 100
NXOS-Right(config-if)# ip router ospf cust area 0
NXOS-Right(config-if)# ip osp pa
NXOS-Right(config-if)# int vlan 999
NXOS-Right(config-if)# ip router ospf cust a 0
NXOS-Right(config)# route-map import-bgp permit 100
NXOS-Right(config-route-map)# match route-type external
NXOS-Right(config-route-map)# match metric 0
NXOS-Right(config-route-map)# exit
// 在机器上配置 route-map 过滤引入的默认路由,match route-type external 表示匹配 bgp & ospf OE1/2 路由,match metric 0 表示只匹配 BGP 过来的路由(eBGP 收到的路由 metric 默认为 0,不用 match source-protocol 的原因是因为该匹配方式有时候会出 bug,非常的不好用。

检查左侧收取重分发路由情况

NXOS-Left# show ip ospf database external
        OSPF Router with ID (192.0.2.2) (Process ID cust VRF default)

                Type-5 AS External Link States

Link ID         ADV Router      Age        Seq#       Checksum Tag
0.0.0.0         100.70.0.1      804        0x80000002 0x2bf9    0

左侧交换机已正确收取重分发进 OSPF 的路由。再在左侧交换机配置相同的配置,配置过程省略。

配置完成后,检查两台交换机的 OSPF DB:

NXOS-Left# show ip ospf database external
        OSPF Router with ID (192.0.2.2) (Process ID cust VRF default)

                Type-5 AS External Link States

Link ID         ADV Router      Age        Seq#       Checksum Tag
0.0.0.0         100.64.0.0      1837       0x80000005 0xa960    1
0.0.0.0         100.70.0.0      1331       0x80000003 0x2ff5    0
0.0.0.0         100.70.0.1      1444       0x80000005 0x25fc    0
NXOS-Right# show ip ospf database external
        OSPF Router with ID (192.0.2.3) (Process ID cust VRF default)

                Type-5 AS External Link States

Link ID         ADV Router      Age        Seq#       Checksum Tag
0.0.0.0         100.64.0.0      1826       0x80000005 0xa960    1
0.0.0.0         100.70.0.0      1321       0x80000003 0x2ff5    0
0.0.0.0         100.70.0.1      1433       0x80000005 0x25fc    0

可见 OSPF LSA-5 DB 正常。现在来实现客户的需求。

需求1:客户要求右侧交换机为主交换机,所有流量在链路正常时必须经过该交换机转发。

解决方案:调整 OSPF cost 实现调整选路,且将热冗余协议 Master 交给右侧交换机。

NXOS-Right(config)# int e1/3
NXOS-Right(config-if)# ip ospf cost 1000
NXOS-Right(config-if)# int vlan 999
NXOS-Right(config-if)# ip ospf cost 500

检查路由表:

NXOS-Left# show ip route 0.0.0.0/0
IP Route Table for VRF "default"
'*' denotes best ucast next-hop
'**' denotes best mcast next-hop
'[x/y]' denotes [preference/metric]
'%<string>' in via output denotes VRF <string>

0.0.0.0/0, ubest/mbest: 1/0
    *via 60.0.0.0, [20/0], 01:20:00, bgp-65535, external, tag 6939
     via 100.70.0.1, Vlan999, [110/1], 01:19:45, ospf-cust, type-2
NXOS-Right(config-if)# show ip route 0.0.0.0/0
IP Route Table for VRF "default"
'*' denotes best ucast next-hop
'**' denotes best mcast next-hop
'[x/y]' denotes [preference/metric]
'%<string>' in via output denotes VRF <string>

0.0.0.0/0, ubest/mbest: 1/0
    *via 60.1.0.0, [20/0], 01:09:29, bgp-65535, external, tag 6939
     via 100.70.0.0, Vlan999, [110/1], 00:01:15, ospf-cust, type-2

这么做的原因:

因为右侧交换机为 Master交换机且左侧交换机没有线路与小狼的路由器相连,所以左侧交换机无需更改 Cost,又因为 OSPF 接口 cost 修改会影响传入的路由,所以修改右侧交换机 cost 即可。

路由已经调整正确,接下来我们需要让右侧交换机接管热冗余协议主权限,这样才能保证不会出现次优转发路径 ( 数据包发送到左边 -> 左边通过 BGP 转发至上游产生额外流量费用,或者数据包发送到左边 -> 左边通过 OSPF 引入的默认将流量交给右边 -> 右边交换机通过 BGP 转发到上游 )。

配置热冗余协议以及 SLA Track:

NXOS-Right(config)# track 99 interface ethernet 1/2 line-protocol
NXOS-Right(config)# ip route 1.1.1.1/32 60.1.0.0 track 99
NXOS-Right(config)# ip route 1.1.1.1/32 null 0 100
NXOS-Right(config)# feature sla responder
NXOS-Right(config)# feature sla sender
NXOS-Right(config)# ip sla 100
NXOS-Right(config-ip-sla)# icmp-echo 1.1.1.1 source-interface e1/2
NXOS-Right(config-ip-sla-echo)# threshold 50 // 这里按照实际情况来配置,本文中仅为参考
NXOS-Right(config-ip-sla-echo)# timeout 100 // 一般是3倍时间,本文仅供参考
NXOS-Right(config-ip-sla-echo)# fre 1 // 发送间隔
NXOS-Right(config)# ip sla schedule 100 start-time now life forever

该配置的意义在于,定义一个跟踪接口状态的 Tracking object,然后写一条 /32 静态路由进行调用 ( 该 IP 地址必须是可 ping 通的 ),然后规定这个 IP 只从上游接口进行访问。如果接口挂了,那么该路由失效。再定义一个 SLA object 来 ping 这个 IP 地址( 由于静态路由规定了只能从这个接口出去,所以变相的监控了接口状态 ),该 object 再被 HSRP 调用。

这样断网的话,就会出现三种情况:

如果是前两种的话,只跟踪接口状态显然不可行,因为接口还是 UP 的,不会触发 Tracking object 预定义好的规则,无法暂时禁用静态路由使其匹配到 null route 导致 SLA object ping 不通上游而降低 HSRP group 优先级,从而将转发权交给 Standby 来无缝转发。

因为有这种情况的存在,所以单纯的 Tracking object 需要和 IP SLA 结合进行互相配合工作。这样就算是主 NXOS 交换机上游链路挂了,也能通过 Track object 跟踪到异常状态后将 HSRP Master 交给副交换机,从而实现高速收敛的效果。将 HSRP Master 交给副交换机后,副交换机接管转发后就会匹配到 BGP 发过来的默认路由,继续正常转发。

左侧交换机也如此配置。配置完成后,检查热冗余协议与 SLA Track 运作情况

NXOS-Left# show track
Track 99
  Interface Ethernet1/2 Line Protocol
  Line Protocol is UP
  1 changes, last change 00:10:07

Track 100
  IP SLA 100 Reachability
  Reachability is UP
  2 changes, last change 00:02:53
  Latest operation return code: OK
  Latest RTT (millisecs): 46
NXOS-Right# show track
Track 99
  Interface Ethernet1/2 Line Protocol
  Line Protocol is UP
  1 changes, last change 00:19:22

Track 100
  IP SLA 100 Reachability
  Reachability is UP
  2 changes, last change 00:05:38
  Latest operation return code: OK
  Latest RTT (millisecs): 7
NXOS-Left# show hsrp bri
*:IPv6 group   #:group belongs to a bundle
                     P indicates configured to preempt.
                     |
Interface   Grp Prio P State    Active addr      Standby addr     Group addr
  Vlan100     100  99   P Standby  192.0.2.3       local            192.0.2.1
NXOS-Right# show hsrp bri
*:IPv6 group   #:group belongs to a bundle
                     P indicates configured to preempt.
                     |
Interface   Grp Prio P State    Active addr      Standby addr     Group addr
  Vlan100     100  101  P Active   local            192.0.2.2       192.0.2.1

检查完毕,没有问题。现在把 Track object 在 HSRP 上调用吧!

NXOS-Left(config)# int vlan 100
NXOS-Left(config-if)# hsrp 100
NXOS-Left(config-if-hsrp)# track 100 decrement 10
NXOS-Left(config-if-hsrp)# end
NXOS-Right(config)# int vlan 100
NXOS-Right(config-if)# hsrp 100
NXOS-Right(config-if-hsrp)# track 100 decrement 10
NXOS-Right(config-if-hsrp)# end

看起来似乎没有问题了,我们来模拟一下遇到问题的情况吧!

首先,依次关闭 HE RS1/2 的接口,看看交换机有何反应。

关闭 RS2 接口:

NXOS-Right# show ip route 0.0.0.0/0

0.0.0.0/0, ubest/mbest: 1/0
    *via 100.70.0.0, Vlan999, [110/1], 07:15:59, ospf-cust, type-2

NXOS-Right# show hsrp bri
*:IPv6 group   #:group belongs to a bundle
                     P indicates configured to preempt.
                     |
Interface   Grp Prio P State    Active addr      Standby addr     Group addr
  Vlan100     100  91   P Standby  192.0.2.2       local            192.0.2.1

可见 Master Switch 已经将转发权利交给 Standby switch 了,自己成为了 standby,测试从服务器来的数据是通的。

关闭 RS1 接口:

NXOS-Left# show ip ro 0.0.0.0/0

0.0.0.0/0, ubest/mbest: 1/0
    *via 100.70.0.1, Vlan999, [110/1], 00:00:04, ospf-cust, type-2, tag 1
NXOS-Right# show ip route 0.0.0.0/0

0.0.0.0/0, ubest/mbest: 1/0
    *via 100.64.0.0, Eth1/3, [110/1], 00:00:14, ospf-cust, type-2, tag 1

可见两台交换机,左侧交换机已经将默认路由指向右侧交换机,右侧交换机将默认路由指向 Littlewolf router,再测试一下服务器的数据是否能通:

[admin@Blade-server-device-bay] > ping 8.8.8.8
  SEQ HOST                                     SIZE TTL TIME  STATUS
    0 8.8.8.8                                    56 252 19ms
    1 8.8.8.8                                    56 252 50ms
    2 8.8.8.8                                    56 252 28ms
    sent=3 received=3 packet-loss=0% min-rtt=19ms avg-rtt=32ms max-rtt=50ms

可见去往目的地的路由依旧是通的。

我们换一种模拟 DOWN 的情况,如果上游与我们的接口是 UP 的,但是上游内部出现了点问题,自动切换是否能正常工作?是不是当前的配置就没问题了呢?

模拟 RS2 的上联链接出现了问题:

NXOS-Right# show ip ro 0.0.0.0/0
IP Route Table for VRF "default"
'*' denotes best ucast next-hop
'**' denotes best mcast next-hop
'[x/y]' denotes [preference/metric]
'%<string>' in via output denotes VRF <string>

0.0.0.0/0, ubest/mbest: 1/0
    *via 60.1.0.0, [20/0], 00:00:33, bgp-65535, external, tag 6939
     via 100.70.0.0, Vlan999, [110/1], 00:00:04, ospf-cust, type-2

NXOS-Right# show hsrp bri
*:IPv6 group   #:group belongs to a bundle
                     P indicates configured to preempt.
                     |
Interface   Grp Prio P State    Active addr      Standby addr     Group addr
  Vlan100     100  91   P Standby  192.0.2.2       local            192.0.2.1

NXOS-Right# show track 100
Track 100
  IP SLA 100 Reachability
  Reachability is DOWN
  7 changes, last change 00:24:10
  Latest operation return code: Timeout
  Tracked by:
    HSRP Vlan100 100

可以看到,我们上联 ISP 内部链路出现了一点问题,Track object 100 首先反应过来并将转发权交给了左边的 Standby switch,这样做是正确的。但是交换机的路由表并没有很好的反应过来。因为接口并不是 DOWN 的且直连能通,所以 BGP 路由并不会消失。现在服务器侧数据能通只是因为 HSRP Track object 检测到上游出现了点问题所以将转发权交给了 Standby 而已。

模拟 RS1 和 RS2 的上联同时出现了问题:

NXOS-Left# show ip ro 0.0.0.0/0

0.0.0.0/0, ubest/mbest: 1/0
    *via 60.0.0.0, [20/0], 00:00:14, bgp-65535, external, tag 6939
     via 100.70.0.1, Vlan999, [110/1], 00:00:17, ospf-cust, type-2

NXOS-Left# show hsrp bri
*:IPv6 group   #:group belongs to a bundle
                     P indicates configured to preempt.
                     |
Interface   Grp Prio P State    Active addr      Standby addr     Group addr
  Vlan100     100  89   P Standby  192.0.2.3       local            192.0.2.1

如图所示,Tracking object 也检测到上联出现了很大的问题,将转发权交给了右侧交换机,可是因为两个上联都出现了问题,又因为 BGP 路由不会消失且比 OSPF 优先,所以不管 HSRP Master 交给谁,数据是肯定无法发送出去的。

测试服务器的数据连通性:

[admin@Blade-server-device-bay] > ping 8.8.8.8
  SEQ HOST                                     SIZE TTL TIME  STATUS
    0 8.8.8.8                                                 timeout
    1 8.8.8.8                                                 timeout
    2 8.8.8.8                                                 timeout
    sent=3 received=0 packet-loss=100%

可见因为路由没有收敛好所以传输失败。

针对路由不会自动收敛的问题,我们就需要借助 EEM 功能了 ( Cisco event manager ),写一个脚本,当上游出问题的时候,我们让路由器自动将 OSPF 路由优先级调高不就好了?话不多说,赶紧做:

NXOS-Left(config)# event manager applet shut-he-peer
NXOS-Left(config-applet)# event track 100 state down
NXOS-Left(config-applet)# action 0 cli enable
NXOS-Left(config-applet)# action 1 cli conf t
NXOS-Left(config-applet)# action 2 cli router ospf cust
NXOS-Left(config-applet)# action 3 cli distance 19
NXOS-Left(config-applet)# action 4 cli end

NXOS-Left(config)# event manager applet restore-he-peer
NXOS-Left(config-applet)# event track 100 state up
NXOS-Left(config-applet)# action 0 cli enable
NXOS-Left(config-applet)# action 1 cli conf t
NXOS-Left(config-applet)# action 2 cli router ospf cust
NXOS-Left(config-applet)# action 3 cli distance 110
NXOS-Left(config-applet)# action 4 cli end

编写完成,我们来检查下当 RS1/2 上联全部故障时候的状况

NXOS-Left# show ip route 0.0.0.0/0

0.0.0.0/0, ubest/mbest: 1/0
    *via 100.70.0.1, Vlan999, [19/1], 00:00:16, ospf-cust, type-2, tag 1
     via 60.0.0.0, [20/0], 00:00:15, bgp-65535, external, tag 6939
NXOS-Right# show ip route 0.0.0.0/0

0.0.0.0/0, ubest/mbest: 1/0
    *via 100.64.0.0, Eth1/3, [19/1], 00:02:21, ospf-cust, type-2, tag 1
     via 60.1.0.0, [20/0], 00:02:19, bgp-65535, external, tag 6939

可见 EEM 已经成功将 OSPF 优先级提升至比 BGP 路由更高一点( AD 比 BGP 更优先 ),这时候再来测试一下服务器数据连通性:

[admin@Blade-server-device-bay] > ping 8.8.8.8
  SEQ HOST                                     SIZE TTL TIME  STATUS
    0 8.8.8.8                                    56 252 42ms
    1 8.8.8.8                                    56 252 18ms
    2 8.8.8.8                                    56 252 20ms
    sent=3 received=3 packet-loss=0% min-rtt=18ms avg-rtt=26ms max-rtt=42ms

不错,成功将路由切换到 Littlewolf router 了。由于使用了 Track object 做监控,能更快速的提升收敛速度,降低闪断的时间。

过了一段时间后,对方工程师修好了,我们来模拟一下修好后的状况吧

NXOS-Left# show ip route 0.0.0.0/0

0.0.0.0/0, ubest/mbest: 1/0
    *via 60.0.0.0, [20/0], 00:05:45, bgp-65535, external, tag 6939
     via 100.70.0.1, Vlan999, [110/1], 00:00:08, ospf-cust, type-2
NXOS-Right# show ip route 0.0.0.0/0

0.0.0.0/0, ubest/mbest: 1/0
    *via 60.1.0.0, [20/0], 00:06:42, bgp-65535, external, tag 6939
     via 100.70.0.0, Vlan999, [110/1], 00:00:16, ospf-cust, type-2

可见 EEM 已经将 OSPF 优先级恢复至正常值了,快速冗余成功。怎么样,是不是很好用?

至此,具有三条链路冗余的网络搭建完成,且都符合用户需求,可以收工!

如果您对文章有什么建议或者意见,欢迎发邮件到 bGl1Y2hlbjk1ODYoYXQpZ21haWwuY29t

发表评论

电子邮件地址不会被公开。 必填项已用*标注