7*24小时值班咨询手机:15101073985(微信同号)   
CCIE
当前位置:网站首页>CCIE
ccna培训经典案例:双ISP情况下冗余、负载分担
发布日期:2019-06-15 11:16:37 发布者:
    现在企业对于双ISP的需求越来越大了,Cisco的路由器解决起来比ASA好,因为ASA作为防火墙的存在,它只能有一条默认路由存在,而且不支持策略路由,所以对于ASA的实现难度很大,而路由器有策略路由加上cisco-NAT跟SLA的辅助,实现起来比较容易。其实也是朋友让我总结下解决方案,正好以前做过一次。【可用GNS3模拟器模拟】

    这里的负载均衡是指内网的负载均衡,如果实现电信走电信,联通走联通的话,那么估计很难,因为要知道电信和联通所有的网段,现在的网段变化很大,最后没有匹配的还是走默认路由出去, 这里是模拟一个双ISP的情况下,cisco-PC1默认走cisco-ISP1走,P2C默认走cisco-ISP2走,无论哪边出现了故障,都能自动切换到对端进行流量转发。

    这个环境是 cisco-PC1 cisco-PC2 和R2出口起EIGRP ,出口下放缺省到内部。这里不做PPPOE拨号了,用手工配置地址来模拟下,R3 R4 server起OSPF,模拟internet。 server模拟公网上一台服务器。

    基本配置

    cisco-PC1(config)#int f0/0

    cisco-PC1(config-if)#speed 100

    cisco-PC1(config-if)#full-duplex

    cisco-PC1(config-if)#ip add 192.168.1.1 255.255.255.0

    cisco-PC1(config-if)#no shut

    cisco-PC1(config-if)#int lo 0

    cisco-PC1(config-if)#ip add 1.1.1.1 255.255.255.255

    cisco-PC2(config)#int f0/0

    cisco-PC2(config-if)#ip add 192.168.1.2 255.255.255.0

    cisco-PC2(config-if)#no shut

    cisco-PC2(config-if)#speed 100

    cisco-PC2(config-if)#full-duplex

    cisco-PC2(config-if)#int lo 0

    cisco-PC2(config-if)#ip add 2.2.2.2 255.255.255.255

    cisco-NAT(config)#int f1/0 内部 的接口

    cisco-NAT(config-if)#ip add 192.168.1.254 255.255.255.0

    cisco-NAT(config-if)#no shut

    cisco-NAT(config)#int f1/0

    cisco-NAT(config-if)#ip add 192.168.1.254 255.255.255.0

    cisco-NAT(config-if)#no shut

    cisco-NAT(config-if)#int f0/0 cisco-ISP1 的接口

    cisco-NAT(config-if)#ip add 23.1.1.1 255.255.255.252

    cisco-NAT(config-if)#no shut

    cisco-NAT(config-if)#speed 100

    cisco-NAT(config-if)#full-duplex

    cisco-NAT(config)#int f0/1 cisco-ISP2 的接口

    cisco-NAT(config-if)#ip add 24.1.1.1 255.255.255.0

    cisco-NAT(config-if)#speed 100

    cisco-NAT(config-if)#full-duplex

    cisco-NAT(config-if)#no shu

    这里关于路由,等后续在弄,因为要跟SLA做联动。

    cisco-ISP1(config)#int f0/0

    cisco-ISP1(config-if)#speed 100

    cisco-ISP1(config-if)#full-duplex

    cisco-ISP1(config-if)#ip add 23.1.1.2 255.255.255.252

    cisco-ISP1(config-if)#no shut

    cisco-ISP1(config-if)#int f0/1

    cisco-ISP1(config-if)#ip add 35.1.1.1 255.255.255.252

    cisco-ISP1(config-if)#no shut

    cisco-ISP1(config-if)#speed 100

    cisco-ISP1(config-if)#full-duplex

    cisco-ISP2(config)#int f0/1

    cisco-ISP2(config-if)#speed 100

    cisco-ISP2(config-if)#full-duplex

    cisco-ISP2(config-if)#ip add 24.1.1.2 255.255.255.252

    cisco-ISP2(config-if)#no shut

    cisco-ISP2(config-if)#int f0/0

    cisco-ISP2(config-if)#ip add 45.1.1.1 255.255.255.252

    cisco-ISP2(config-if)#no shut

    cisco-Server(config)#int f0/1

    cisco-Server(config-if)#speed 100

    cisco-Server(config-if)#full-duplex

    cisco-Server(config-if)#ip add 35.1.1.2 255.255.255.252

    cisco-Server(config-if)#no shut

    cisco-Server(config-if)#int f0/0

    cisco-Server(config-if)#ip add 45.1.1.2 255.255.255.252

    cisco-Server(config-if)#no shut

    cisco-Server(config-if)#int lo 0

    cisco-Server(config-if)#ip add 5.5.5.5 255.255.255.255

    接口信息搞定,开始把Internet 路由打通

    cisco-ISP1(config)#router ospf 1

    cisco-ISP1(config-router)#router-id 3.3.3.3

    cisco-ISP1(config-router)#network 23.1.1.0 0.0.0.3 a 0

    cisco-ISP1(config-router)#network 35.1.1.0 0.0.0.3 a 0

    cisco-ISP1(config-router)#passive-interface f0/0

    cisco-ISP2(config-if)#router ospf 1

    cisco-ISP2(config-router)#router-id 4.4.4.4

    cisco-ISP2(config-router)#network 24.1.1.0 0.0.0.3 a 0

    cisco-ISP2(config-router)#passive-interface f0/1

    cisco-ISP2(config-router)#network 45.1.1.0 0.0.0.3 a 0

    cisco-Server(config-if)#router ospf 1

    cisco-Server(config-router)#router-id 5.5.5.5

    cisco-Server(config-router)#network 0.0.0.0 0.0.0.0 a 0

    这里server就偷懒了 直接全部宣告,上面的被动接口设置是习惯性的问题,实验环境无所谓的。

    internet模拟完成,关键在内部了。

    cisco-NAT(config-if)#router eigrp 1

    cisco-NAT(config-router)#no auto-summary

    cisco-NAT(config-router)#network 192.168.1.0 0.0.0.255

    cisco-PC1(config-if)#router eigrp 1

    cisco-PC1(config-router)#no auto-summary

    cisco-PC1(config-router)#network 1.1.1.1 0.0.0.0

    cisco-PC1(config-router)#network 192.168.1.0 0.0.0.255

    cisco-PC2(config-if)#router eigrp 1

    cisco-PC2(config-router)#no auto-summary

    cisco-PC2(config-router)#network 192.168.1.0 0.0.0.255

    cisco-PC2(config-router)#network 2.2.2.2 0.0.0.0

    这里静态路由,如果直接写两条缺省的话,那么如果cisco-ISP1或cisco-ISP2出现了故障,而我们这边缺省路由却一直存在,可能会造成数据包黑洞的问题,所以这里必须与SLA做联动,检测对方的存在,如果在规定的时间内没有响应 这条路由也自动消失。

    先定义两个SLA。

    cisco-NAT(config)#ip sla 1 关于cisco-ISP1的

    cisco-NAT(config-ip-sla)#icmp-echo 23.1.1.2

    cisco-NAT(config-ip-sla-echo)#frequency 10

    cisco-NAT(config)#ip sla schedule 1 start-time now life forever

    cisco-NAT(config)#track 1 ip sla 1

    cisco-NAT(config)#ip route 0.0.0.0 0.0.0.0 23.1.1.2 track 1

    这里定义一个sla,探测23.1.1.2 cisco-ISP1的接口地址,频率为每10s一次,第四句话是说这个sla从现在开始执行,不会停止。然后用track调用这个SLA,最后关联到去往23.1.1.2的缺省上, 这里如果cisco-ISP1或者自己接口出现了问题,那么这条路由会自动消失。

    这里注意的是,可能IOS版本不同,调用的命令也不同 track 1 rtr 1 有些版本是这样调用的。

    cisco-NAT(config)#ip sla 2

    cisco-NAT(config-ip-sla)#icmp-echo 24.1.1.2

    cisco-NAT(config-ip-sla-echo)#frequency 10

    cisco-NAT(config)#ip sla schedule 2 start-time now life forever

    cisco-NAT(config)#track 2 ip sla 2

    cisco-NAT(config)#ip route 0.0.0.0 0.0.0.0 24.1.1.2 track 2

    show ip sla statistics查看SLA的状态,successes代表每频率测试成功的次数,faulures是失败的次数。

    cisco-NAT(config-router)#redistribute static

    把缺省推到内部,让它们的流量都引到cisco-NAT设备上来。

    开始最重要的部分

    1、关于cisco-NAT的写法,我们平常用的习惯ACL来调用,但是这里是双出口,如果用ACL来调用可能会产生混淆,cisco-NAT除了可以调用ACL以外,还能调用route-map,我们可以用route-map来设定一些规则,才允许cisco-NAT转换。

    2、关于缺省路由由于是负载均衡,所以必须用策略路由把内部流量在经过cisco-NAT的时候强行引入某一个cisco-NAT,不然它就不按你的规则走了。

    cisco-NAT(config)#ip access-list extended cisco-PC1

    cisco-NAT(config-ext-nacl)#permit ip 1.1.1.0 0.0.0.255 any

    cisco-NAT(config)#ip access-list extended cisco-PC2

    cisco-NAT(config-ext-nacl)#permit ip 2.2.2.0 0.0.0.255 any

    cisco-NAT(config)#route-map cisco-NAT1 permit 10

    cisco-NAT(config-route-map)#match ip address cisco-PC1

    cisco-NAT(config-route-map)#match interface f0/0

    cisco-NAT(config)#ip nat inside source route-map cisco-NAT1 interface f0/0 overload

    cisco-NAT(config)#route-map cisco-NAT2 permit 10

    cisco-NAT(config-route-map)#match ip address cisco-PC2

    cisco-NAT(config)#ip nat inside source route-map cisco-NAT2 interface f0/1 overload

    分析下这里为什么要定义两个route-map,第一个是必须满足ACL匹配的属于cisco-PC1的流量,第二个就是必须满足接口是up的,因为这个是与的操作,所以这两个要求必须同时满足才进行到f0/0的地址转换。

    第二route-map就直接匹配cisco-PC2的流量就能转换了,它转换的接口就是f0/1。

    cisco-NAT(config)#route-map cisco-NAT3 permit 10

    cisco-NAT(config-route-map)#match ip address cisco-PC1

    cisco-NAT(config-route-map)#match interface f0/1

    cisco-NAT(config)#ip nat inside source route-map cisco-NAT3 interface f0/1 overload

    cisco-NAT(config)#route-map cisco-NAT4 permit 10

    cisco-NAT(config-route-map)#match ip address cisco-PC2

    cisco-NAT(config)#ip nat inside source route-map cisco-NAT4 interface f0/0 overload

    这里也是一样,但是发现一个问题就是,关于F0/0和F0/1都有各自cisco-PC1和cisco-PC2匹配的流量,这样当一个数据包过来 它可能会匹配f0/0接口出去,也可以匹配f0/1出去,所以我们必须用一个工具来控制它。那就是策略路由。 这里注意调用ACL的时候 是大写PC

    注意的是,策略路由默认只对入接口的流量做策略,本地的不算在内,可以通过ip local policy route-map 来生效。另外就是一个接口只能调用一个策略的map。

    cisco-NAT(config)#route-map policy permit 10

    cisco-NAT(config-route-map)# match ip address cisco-PC1

    cisco-NAT(config-route-map)# match interface f0/0

    cisco-NAT(config-route-map)# set interface FastEthernet0/0

    这个是关于规定cisco-PC1的流量走f0/0的,因为GNS3的模拟器 以太网口不会自动down和up,必须还需要做个额外的工具EEM才能完成操作。实际中接口是会检测到的,所以不需要。

    cisco-NAT(config)#route-map policy permit 20

    cisco-NAT(config-route-map)#match ip address cisco-PC2

    cisco-NAT(config-route-map)#match interface f0/1

    cisco-NAT(config-route-map)# set interface FastEthernet0/1

    cisco-NAT(config-if)#ip policy route-map policy

    cisco-NAT(config-if)#ip nat inside

    cisco-NAT(config-if)#int f0/0

    cisco-NAT(config-if)#ip nat outside

    cisco-NAT(config-if)#int f0/1

    cisco-NAT(config-if)#ip nat outside

    在内网口调用策略路由的map和cisco-NAT,两个出网口也调用。

    这样就全部搞定了,当满足策略路由的10的送到f0/0,也就是f0/0连接的cisco-ISP1的接口,经过这接口因为是cisco-PC1的流量,所以直接执行cisco-NAT1的规则。 当cisco-ISP1出现了问题的话,那么这个策略就不生效了 因为不满足要求了,所以走cisco-NAT2 f0/1的接口。

    会发现有丢包的情况,其实这是GNS3的以太网口不能自动根据对方up和down来检测,所以自己的接口一直是up的,那些drop的包都是丢到了f0/0连接的cisco-ISP1上,因为cisco-ISP1我shutdown了,所以成了路由黑洞。 所以在这里还需要额外的加一个策略,EEM工具。这个工具能工具各种不同的状态来 实施定制的策略, 比如 某个时间,自动备份配置,某个状态dwon,自动shutwdo接口。

    这里就根据down的提示来做策略了。

    cisco-NAT(config)#event manager applet cisco-PC1

    cisco-NAT(config-applet)#event syslog pattern “1 ip sla 1 state Up->Down”

    cisco-NAT(config-applet)#action 1 cli command “eanble”

    cisco-NAT(config-applet)#action 1.2 cli command “clear ip nat translation *”

    cisco-NAT(config-applet)#action 2 cli command “configure terminal”

    cisco-NAT(config-applet)#action 3 cli command “interface f0/0”

    cisco-NAT(config-applet)#action 4 cli command “shutdown”

    这策略就是针对track1的状态,down了的话,那么就自动执行下面策略,enable 、config t、inte f0/0、shutdown 这里一定要注意序列号,它是从上往下开始配置的,序列号也要一样。

    cisco-NAT(config)#event manager applet cisco-PC2

    cisco-NAT(config-applet)#event syslog pattern “1 ip sla 2 state Up->Down”

    cisco-NAT(config-applet)#action 1.1 cli command “enable”

    cisco-NAT(config-applet)#action 1.2 cli command “configure terminal”

    cisco-NAT(config-applet)#action 1.3 cli command “interface f0/1”

    cisco-NAT(config-applet)#action 1.4 cli command “shutdown

    现在在来测试看看,把cisco-ISP1再次shutdown。

    提示了up-down,就直接把f0/0的接口shudown了。 这里第一个测试我多加了句 clear ip nat translation * 因为cisco对ICMP特殊的支持,从先切换一个ISP的时候 需要把之前的cisco-NAT状态清理掉,在实际中肯定不需要这么做的,不然所以的流量都断开了。

    OK,掉了几个包 就切换过来了

    路径也正确,关于f0/0不是我自己手工执行的,是根据EEM来决策的,它看见sla 1的状态down了就自动执行策略了。

    这里多加了EEM的策略,是因为GNS3接口不会自动down导致的,实际中大部分光猫都有检测机制,会自动告诉连接的接口,所以不会存在不会检测不到的情况,不过EEM是个好东西,可以根据不同的策略来做,这个需要大家多去接触了。

    关于如果接口恢复了怎么办,呵呵 我们在把cisco-ISP1的接口打开 ,你会发现

    down-up了,这是因为我在SLA里面并没有规定从哪个接口发出去的原因。这时候只要检测到cisco-ISP1接口正常了,我们可以根据这个提示来做另外个策略 就是把接口no shutdown。这个有兴趣可以自己做下。

    这个解决方案也不是很难,只需要把思路理清了 很容易解决的,主要是最后一个EEM比较难理解点,不过它不是必须的,这里是没办法才用这个。

微信