随着信息化办公越来越普及,人们办公对互联网的依赖越来越大,IT、网络在企业中的影响也越来越大。因此,企业网络的可靠性变得十分重要。对于一个互联网公司或者使用需要使用网络才能正常办公的公司来说,断网意味着员工不能正常办公,公司大把的金钱损失。在这样一种背景下,大型公司和金融行业早已实现了双线或多线冗余,而一些中心型企业由于预算等问题还忍受着这样的苦恼。本文将为中小型企业提供一套完美的解决方案,通过已有设备或较低的预算即实现双线冗余、负载均衡与自动切换。
网络出口拓扑图:
笔者通过以上的拓扑图进行一个综合案例讲解。拓扑1和拓扑2不同之处在于拓扑1比拓扑2多了一个路由器的设备冗余,并且PBR和SLA等策略是做在核心交换机上的;而拓扑2路由器则承担了PBR、SLA等功能。
拓扑1讲解:两台路由器分别接入联通和电信网络,路由器需要指一条默认路由到运营商,内部可以使用静态路由或动态路由,路由器执行NAT功能,将内网的私服网IP地址转换成公网IP地址。在三层交换机上使用默认路由指向R2,使用PBR将一部分流量指向R1,实现负载均衡;当R1故障后,PBR自动失效,所有流量去往R2,在交换机上使用浮动路由指向R1,来实现当R2故障后所有流量都切换到R1。
注意:一般情况推荐链路大、稳定的链路使用默认路由。这里需要注意的是,如果内部有服务器需要对外提供服务的话,最好将服务器放在默认路由的链路上,当然也可以在两台路由器都做NAT,通过DNS来控制外部流量访问;在做PBR的时候也要排除本地服务器的地址;如果有VPN流量的话,还要注意VPN流量的控制。
使用PBR实现基于VLAN的负载均衡
PBR(Policy-Based Routing) 基于策略的路由。我们都知道路由是基本目的IP地址进行转发,当一个数据包到达路由器以后,路由器默认并不查看该数据包的源IP地址,只看目的IP地址,然后查路由表,进行与运算,最后封装新的二层头部将其转发出去。而PBR则是根据IP包的源IP地址进行转发,我们可以手工定义匹配到的哪些源IP地址发往哪个接口。例如源是1.1.X.X的IP包下一跳从S0接口发出,而源地址是1.2.X.X的包从S1接口发出。PBR要优先于路由表,当PBR失效后,所匹配的数据包仍然会执行默认的路由转发规则。思科、华为、华为等企业级路由器和三层交换机一般都支持PBR的功能,只是具体操作上可能有所不同,原理大同小意。
我们通过使用PBR来实现基于VLAN的负载均衡,例如公司有600人,每100人划分一个VLAN,共6个VLAN。这样我们让前VLAN 1 2 3通过默认路由走电信链路,让VLAN 4 5 6通过PBR走联通链路。
PBR的失效:当PBR失效后,所有流量都会通过路由表进行转发。PBR通过ARP刷新来判断失效,如图1所求,当R1整台路由器失效或接口down后,SW能马上感知到,这时候PBR失效;如果R1仅仅是接口IP被删除,SW需要通过等待ARP老化来判断PBR失效,如果是R1连接的运营商链路失效,则SW无法判断出来(通过后面讲到的SLA来判断)
2. 使用静态浮动路由实现双线冗余
我们知道一般在路由器出口会写一条默认路由指向运营商,当双线接入的时候我们使用静态浮动路由来实现对默认路由的冗余。我们知道静态路由的管理距离默认为1,我们在SW上把默认路由指向R2,再写一条管理距离为5(只要大于1即可)的默认路由,当AD为1的路由存在的时候,AD为5的路由就不会出现在路由器,只有当AD为1的路由失效以后,AD为5的路由才出浮出路由表发挥作用。这样,当R2失效以后,AD为5的路由起作用,来实现对默认路由的备份。
3. 使用SLA实现双线冗余
尽管我们看起来已经通过PBR和浮动路由实现了冗余功能,但实际情况并不是这样。路由器坏的几率很小,接口坏或网络坏的几率就更小了,更多的情况是运营商的链路出现了问题。这样的话,SW是感知不到问题的发生的,还是需要人为干预。为此,我们引入了思科SLA技术(其他厂商也有类似技术,例如华为的NQA)。SLA可以通过发送ICMP包等信息来判断链路的好坏和质量。静态路由可以联合SLA,当一个IP地址失效以后,该静态路由失效。例如,通过SLA来ping 8.8.8.8这个IP地址,当10个包丢失以后,我们认为这个IP失效,track了这个SLA的静态路由失效。
4. 使用PBR结合SLA&EEM实现基于VLAN的负载和冗余
然而我们在使用了SLA后,当电信运营商故障后,默认路由能够很好地从路由器消失,浮动路由生效。但如果是联通故障,SLA能够感知到,却什么也做不了,PBR仍然在生效。这时候我们再引入一个技术,思科EEM。EEM联合SLA,能够在被检测的IP失效后,自动shutdown SW连接R1的端口,使PBP失效,流量被切换到R2。
重点:双线冗余可以通过多种技术在路由器上实现,这里使用PBR只是起到一个抛砖引玉的效果。引入了SLA和EEM是为了给大家介绍两种新的技术。SLA和EEM可以实现的功能很多,超强大,如果有需求的童鞋可以研究研究。
综合实验:
拓扑图如下:
我们用R1和R5来分别模拟两台连接不同运营商的路由器,用R6来模拟核心交换机,R7和R8来模拟PC1和PC2,充当不同的VLAN,图中的交换机是一个傻瓜交换机,仅仅起到一个连接作用。使用R2和R4来模拟联通和电信的路由器设备,最右面的R3来模拟互联网上的一台要被访问的设备。为了更为真实,我们在R1和R5进行NAT配置,将企业内部的私网IP转换成公网IP。
基本配置如下:
运营商路由器配置:
R2配置:
R2(config)#int s1/0
R2(config-if)#ip add 12.1.1.2 255.255.255.0
R2(config-if)#no shut
R2(config-if)#int s1/1
R2(config-if)#ip add 23.1.1.2 255.255.255.0
R2(config-if)#no shut
R2(config-if)#router rip
R2(config-router)#ver 2
R2(config-router)#no auto
R2(config-router)#net 23.0.0.0
R2(config-router)#net 12.0.0.0
//使用动态路由协议将R2、R3和R4之间的网络连通。
R3配置:
R3(config)#int s1/0
R3(config-if)#ip add 23.1.1.3 255.255.255.0
R3(config-if)#no shut
R3(config-if)#int s1/1
R3(config-if)#ip add 34.1.1.3 255.255.255.0
R3(config)#int lo0
R3(config-if)#ip add 3.3.3.3 255.255.255.0
R3(config-if)#router rip
R3(config-router)#ver 2
R3(config-router)#no auto
R3(config-router)#net 3.0.0.0
R3(config-router)#net 23.0.0.0
R3(config-router)#net 34.0.0.0
R4配置:
R4(config)#int s1/0
R4(config-if)#ip add 34.1.1.4 255.255.255.0
R4(config-if)#no shut
R4(config-if)#int s1/1
R4(config-if)#ip add 45.1.1.4 255.255.255.0
R4(config-if)#no shut
R4(config-if)#router rip
R4(config-router)#ver 2
R4(config-router)#no auto
R4(config-router)#net 34.0.0.0
R4(config-router)#net 45.0.0.0
出口网关路由器配置:
R1配置:
R1(config)#int s1/1
R1(config-if)#ip add 12.1.1.1 255.255.255.0
R1(config-if)#ip nat outside
R1(config-if)#no shut
R1(config-if)#int f0/0
R1(config-if)#ip add 172.16.1.1 255.255.255.0
R1(config-if)#ip nat inside
R1(config-if)#no shut
R1(config-if)#ip route 0.0.0.0 0.0.0.0 12.1.1.2
R1(config-if)#access-list 100 permit ip 172.16.0.0 0.0.255.255 any
R1(config)#ip nat inside source list 100 interface s1/1 overload
//在R1上做NAT配置,将企业内部的私服网IP转换成公网IP地址。
R1(config)#router rip
R1(config-router)#ver 2
R1(config-router)#no auto
R1(config-router)#net 172.16.0.0
//R1、R5、R6运行动态路由协议,或者在R1上使用静态路由指向R6.
R5配置:
R5(config)#int s1/0
R5(config-if)#ip add 45.1.1.5 255.255.255.0
R5(config-if)#ip nat outside
R5(config-if)#no shut
R5(config-if)#int f0/0
R5(config-if)#ip add 172.16.1.5 255.255.255.0
R5(config-if)#ip nat inside
R5(config-if)#no shut
R5(config-if)#ip route 0.0.0.0 0.0.0.0 45.1.1.4
R5(config)#access-list 100 permit ip 172.16.0.0 0.0.255.255 any
R5(config)#ip nat inside source list 100 interface s1/0 overload
R5(config)#router rip
R5(config-router)#ver 2
R5(config-router)#no auto
R5(config-router)#net 172.16.0.0
模拟交换机配置:
R6配置:
R6(config)#int f0/0
R6(config-if)#ip ad 172.16.1.6 255.255.255.0
R6(config-if)#no shut
R6(config-if)#int f2/0
R6(config-if)#ip add 172.16.2.1 255.255.255.0
R6(config-if)#no shut
R6(config-if)#router rip
R6(config-router)#ver 2
R6(config-router)#no auto
R6(config-router)#net 172.16.0.0
PC配置:
PC1(config)#no ip routing
//在路由器关掉路由功能,模拟PC
PC1(config)#int f2/0
PC1(config-if)#ip add 172.16.2.2 255.255.255.0
PC1(config-if)#no shut
PC1(config-if)#ip default-gateway 172.16.2.1
//PC需要配置网关
PC2(config)#no ip routing
PC2(config)#int f2/0
PC2(config-if)#ip add 172.16.2.3 255.255.255.0
PC2(config-if)#no shut
PC2(config-if)#ip default-gateway 172.16.2.1
静态路由与浮动浮动静态路由配置
R6(config)#ip route 0.0.0.0 0.0.0.0 172.16.1.5
R6(config)#ip route 0.0.0.0 0.0.0.0 172.16.1.1 5
//处此配置在后期需要删除重新配置,加入track,联合SLA.
查看路由器,只有第一条。
R6#show ip route
172.16.0.0/24 is subnetted, 2 subnets
C 172.16.1.0 is directly connected, FastEthernet0/0
C 172.16.2.0 is directly connected, FastEthernet2/0
S* 0.0.0.0/0 [1/0] via 172.16.1.5
R6(config)#ip access-list extended cnc
R6(config-ext-nacl)#permit ip host 172.16.2.2 any
//先写一个ACL,来匹配需要被PBR命中的IP,就是需要通过R1路由器走的主机。
R6(config)#route-map pbr-cnc permit 10
R6(config-route-map)#match ip address cnc
R6(config-route-map)#set ip next-hop 172.16.1.1
//写一个route-map,匹配刚刚写的ACL,设置下一跳为R1的IP地址。
R6(config)#int f2/0
R6(config-if)#ip policy route-map pbr-cnc
//在F2/0接口调用PBR,注意PBR是在入接口进行调用的。
注意:
如果是3560X-E交换机,在应用PBR在接口的时候可能会发生报错信息,这时候需要将SDM进行设置
sdm prefer routing //全局使用该命令
重启交换机
目前已经实现了基于源的负载均衡:
在R3上开启debug进行测试,如果源是12.1.1.1的,说明是走的R1;如果源是45.1.1.5,说明走的是R2
R3#debug ip icmp
ICMP packet debugging is on
R7 Ping 3.3.3.3来进行测试:
PC1#ping 3.3.3.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 24/40/56 ms
在R3上查看结果:
*Jun 11 15:07:00.091: ICMP: echo reply sent, src 3.3.3.3, dst 12.1.1.1
*Jun 11 15:07:00.131: ICMP: echo reply sent, src 3.3.3.3, dst 12.1.1.1
*Jun 11 15:07:00.155: ICMP: echo reply sent, src 3.3.3.3, dst 12.1.1.1
*Jun 11 15:07:00.171: ICMP: echo reply sent, src 3.3.3.3, dst 12.1.1.1
*Jun 11 15:07:00.223: ICMP: echo reply sent, src 3.3.3.3, dst 12.1.1.1
使用traceroute来验证:
PC1#traceroute 3.3.3.3
Type escape sequence to abort.
Tracing the route to 3.3.3.3
1 172.16.2.1 28 msec 16 msec 4 msec
2 172.16.1.1 4 msec 44 msec 20 msec
3 12.1.1.2 28 msec 12 msec 20 msec
4 23.1.1.3 16 msec 24 msec *
R8 Ping 3.3.3.3
PC2#ping 3.3.3.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/32/48 ms
在R3上查看结果
*Jun 11 15:07:02.375: ICMP: echo reply sent, src 3.3.3.3, dst 45.1.1.5
*Jun 11 15:07:02.403: ICMP: echo reply sent, src 3.3.3.3, dst 45.1.1.5
*Jun 11 15:07:02.455: ICMP: echo reply sent, src 3.3.3.3, dst 45.1.1.5
*Jun 11 15:07:02.471: ICMP: echo reply sent, src 3.3.3.3, dst 45.1.1.5
*Jun 11 15:07:02.527: ICMP: echo reply sent, src 3.3.3.3, dst 45.1.1.5
PC2#traceroute 3.3.3.3
Type escape sequence to abort.
Tracing the route to 3.3.3.3
1 172.16.2.1 8 msec 8 msec 4 msec
2 172.16.1.5 12 msec 8 msec 16 msec
3 45.1.1.4 20 msec 68 msec 16 msec
4 34.1.1.3 56 msec * 24 msec
配置SLA和EEM:
R6(config)#ip sla 2
R6(config-ip-sla)# icmp-echo 12.1.1.2 source-interface loopback0
R6(config-ip-sla-echo)# frequency 10
R6(config-ip-sla-echo)#ip sla schedule 2 life forever start-time now
//配置一个IP SLA 命名为2,用Loopback接口做为源IP地址,使用ICMP侦测12.1.1.2这个IP地址
R6(config)#ip sla 3
R6(config-ip-sla)# icmp-echo 45.1.1.4 source-interface loopback0
R6(config-ip-sla-echo)# frequency 10
R6(config-ip-sla-echo)#ip sla schedule 3 life forever start-time now
//配置一个IP SLA 命名为3,用Loopback接口做为源IP地址,使用ICMP侦测45.1.1.4这个IP地址
R6(config)#track 2 ip sla 2 reachability
//配置一个track,跟踪 ip sla 2 的可达性
R6(config)#track 3 ip sla 3 reachability
R6(config)#track 200 ip sla 2
//配置一个taack 200,跟踪 ip sla 2的状态
R6(config)#ip route 0.0.0.0 0.0.0.0 172.16.1.1 5 track 2
//删除刚刚写的默认路由和浮动路由,重新添加,并且在路由后面加一个track。当track2 失效后,则该路由失效,这一条路由加track其实意义并不大
R6(config)#ip route 0.0.0.0 0.0.0.0 172.16.1.5 track 3
//重新添加默认路由,并加track.当IP SLA3 所监测的IP地址不可达以后,触发track3,track3失效;当track3失效以后,该默认路由失效。这时,配置了AD为5的并一条浮动路由浮出路由表,生效,转发数据。就是说当默认路由指向的运营商链路(电信链路)失效后,使用SLA和浮动路由即可进行切换,不需要用到EEM。
R6(config)#ip route 23.1.1.2 255.255.255.255 172.16.1.1
R6(config)#ip route 34.1.1.4 255.255.255.255 172.16.1.5
//这两条路由很重要,由于PBR是调用在F2/0接口的,只有F2/0进来的流量才会执行PBR。而我们需要监测23.1.1.2(联通IP)的时候把数据包扔向R1,监测34.1.1.4(电信IP)的时候把数据包扔向R2。全默认路由都指向R2,不符合我们的需求。因此,需要添加这两条静态路由实现上述需求。
R6(config)#int lo 0
R6(config-if)#ip add 172.16.3.1 255.255.255.0
//为刚刚写的SLA添加Loopback接口IP地址,用于做为监测的源IP地址
R6(config)#event manager applet SP-down
R6(config-applet)# event track 200 state down
R6(config-applet)# action 1.1 cli command "en"
R6(config-applet)# action 2.1 cli command "conf t"
R6(config-applet)# action 3.1 cli command "int f2/0"
R6(config-applet)# action 4.1 cli command "no ip policy route-map pbr-cnc"
R6(config-applet)# action 5.1 cli command "end"
//写一个EEM,当track 200的状态是donw以后,执行下面的动作,即进入f2/0接口,删除掉接口下的PBR配置。
R6(config)#event manager applet SP-up
R6(config-applet)# event track 200 state up
R6(config-applet)# action 1.1 cli command "en"
R6(config-applet)# action 2.1 cli command "conf t"
R6(config-applet)# action 3.1 cli command "int f2/0"
R6(config-applet)# action 4.1 cli command "ip policy route-map pbr-cnc"
R6(config-applet)# action 5.1 cli command "end"
//写一个EEM,当track 200的状态是UP的以后,执行下面的动作,即进入F2/0接口,添加上PBR的配置。
所有配置完成,下面进行测试。
测试:
电信链路测试:
在R6上查看路由表:
R6#show ip route
S* 0.0.0.0/0 [5/0] via 172.16.1.5
23.0.0.0/32 is subnetted, 1 subnets
S 23.1.1.2 [1/0] via 172.16.1.1
34.0.0.0/32 is subnetted, 1 subnets
S 34.1.1.4 [1/0] via 172.16.1.5
注意默认路由指向的是172.16.1.5
在R6上查看SLA的状态,是OK的
IPSLAs Latest Operation Summary
Codes: * active, ^ inactive, ~ pending
ID Type Destination Stats Return Last (ms) Code Run
-----------------------------------------------------------------------
*2 icmp-echo 23.1.1.2 RTT=44 OK 7 seconds ago
*3 icmp-echo 34.1.1.4 RTT=19 OK 2 seconds ago
在PC2上ping3.3.3.3
PC2#ping 3.3.3.3 repeat 1000
模拟电信链路故障的时候,将R4的S1/0接口Shutdown
PC2#ping 3.3.3.3 repeat 1000
Type escape sequence to abort.
Sending 1000, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!U.U.U.U.U.U.U.U.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
查看SLA:
IPSLAs Latest Operation Summary
Codes: * active, ^ inactive, ~ pending
ID Type Destination Stats Return Last
(ms) Code Run
-----------------------------------------------------------------------
*2 icmp-echo 23.1.1.2 RTT=16 OK 7 seconds ago
*3 icmp-echo 34.1.1.4 - Timeout 2 seconds ago
可以看到34.1.1.4已经timeout了
查看路由表:
R6#show ip route
S* 0.0.0.0/0 [5/0] via 172.16.1.1
23.0.0.0/32 is subnetted, 1 subnets
S 23.1.1.2 [1/0] via 172.16.1.1
34.0.0.0/32 is subnetted, 1 subnets
S 34.1.1.4 [1/0] via 172.16.1.5
可以看到浮动静态生效了,所有流量已经切换过来了。
在R4上恢复S1/0接口
R4(config)#int s1/0
R4(config-if)#no shut
再次查看路由表
R6#show ip route
S* 0.0.0.0/0 [1/0] via 172.16.1.5
23.0.0.0/32 is subnetted, 1 subnets
S 23.1.1.2 [1/0] via 172.16.1.1
34.0.0.0/32 is subnetted, 1 subnets
S 34.1.1.4 [1/0] via 172.16.1.5
可以看到已经恢复了。
测试联通链路失效:
在R6查看F2/0的配置
interface FastEthernet2/0
ip address 172.16.2.1 255.255.255.0
ip policy route-map pbr-cnc
duplex half
end
在PC1上长ping3.3.3.3,然后shutdown R2的S1/1接口,模拟联通链路失效。
PC1#ping 3.3.3.3 re
PC1#ping 3.3.3.3 repeat 1000
Type escape sequence to abort.
Sending 1000, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!U.U.U..!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
在R6上观察,可以看到日志,EEM已经生效了
R6#
*Jun 11 17:39:48.215: %TRACKING-5-STATE: 200 ip sla 2 state Up->Down
*Jun 11 17:39:48.219: %TRACKING-5-STATE: 2 ip sla 2 reachability Up->Down
*Jun 11 17:39:48.387: %SYS-5-CONFIG_I: Configured from console by on vty0 (EEM:SP-down)
查看F0/2的配置:
R6#sh run int f2/0
Current configuration : 112 bytes
!
interface FastEthernet2/0
ip address 172.16.2.1 255.255.255.0
duplex half
end
在R2上恢复接口
R2(config)#int s1/1
R2(config-if)#no shut
在R6上观察日志:
*Jun 11 17:46:08.223: %TRACKING-5-STATE: 200 ip sla 2 state Down->Up
*Jun 11 17:46:08.227: %TRACKING-5-STATE: 2 ip sla 2 reachability Down->Up
*Jun 11 17:46:08.439: %SYS-5-CONFIG_I: Configured from console by on vty0 (EEM:SP-up)
查看F0/2的配置:
R6#sh run int f2/0
Current configuration : 112 bytes
!
interface FastEthernet2/0
ip address 172.16.2.1 255.255.255.0
ip policy route-map pbr-cnc
duplex half
end
Copyright ©2017-2021 武汉市朗联科技有限公司 鄂ICP备案号17020357