网络拓扑请见附件:


背景: 当前越来越多的公司,随着公司的网络结构和规模的扩大,原有的网络带宽已经慢慢达到饱和,这时候需要网络管理员考虑如何解决网速越来越慢的问题。在已经无法再用限制内部员工的网络流量的方式之后,增加出口带宽已经是迫在眉睫。一般都不会选择直接撤掉原先的网络,会先申请一根光纤,然后并入现有的网络中,然后在等原先的带宽到期废弃。有些公司直接慢慢增加外网的出口线路。这样的情况下多出口的网络解决方案尤为重要,能更好的利用网络资源(一根商业光纤价格还是比较昂贵的)。也有些公司增加新的线路就是为了做备份,可是老板不会让一根昂贵的线路睡觉(土豪忽略)。

本文就是要解决,通过分流内部网络分别从不同的出口走,当一条线路down了,会自动切换到另一条线路上。题外话:最好不要安装多条相同的isp服务商的线路在同一所大楼里面,因为一旦大楼机房某个服务商的光端机down了,那就都没用啦。

(1)大体描述网络拓扑结构

client1----->内网部分机器,client2------>内网部分机器。出口router链接内网,也就是连接client1和client2。router分别有二个出口分别连接isp1和isp2(都用路由器代替)。isp1和isp2之间也连接了,并且做了ospf,模拟广域网。

(2)网络设备ip地址

client1---192.168.10.2 ,网关:192.168.10.1;client2---192.168.20.2,网关:192.168.20.1;

router---10.10.10.2连接isp1---10.10.10.1;router---30.30.30.2连接isp2---30.30.30.1;isp1--

20.20.20.1连接isp2---20.20.20.2;

(3)模拟器

本实验用的是web iou


配置:

(1) client1:

部分默认配置略

interface Ethernet0/0

 ip address 192.168.10.2 255.255.255.0

 no ip route-cache

!

ip default-gateway 192.168.10.1(因为用路由器模拟的所以,先no ip routing后增加网关)

ip forward-protocol nd

(2)client2 

ip default-gateway 192.168.20.1

ip forward-protocol nd

ip default-gateway 192.168.20.1

(3)router

!

redundancy

!

!         

!

track 1 ip sla 1 reachability(此处定义一个track,跟踪连接isp1的链路状态,后面的1是调用这条语句的标识,后面是调用哪个sla,不要调用错了。本语句的意思就是判断 sla 1 所定义的语句判断的结果,如果sla 1结果为非,那么结果就是track1 不可达,这个是track调用sla。track自己也可以直接跟踪端口,并且被调用。但是track跟踪端口只可以是本机的,端口,协议或者是服务。而sla 可以判断链路对端的端口是否开启可用。因为在很多情况下,都有由于电信或者联通的机房出现问题导致链路不可用,如果用track本机,那么就算对方down了,也不会被判断出来,所以这里就是track 和sla的结合使用)

!

track 2 ip sla 2 reachability (定义 track 2,跟踪连接isp2的链路状态)


interface Ethernet0/0

 ip address 192.168.10.1 255.255.255.0

 ip nat inside

 ip virtual-reassembly in

 ip policy route-map ccie 

!

 --More-- 

*Nov  2 08:24:59.059: %SYS-5-CONFIG_I: Configured from console by console

interface Ethernet0/1

 ip address 192.168.20.1 255.255.255.0

 ip nat inside

 ip virtual-reassembly in

 ip policy route-map ccie (在内部两个接口上应用route-map,这里解释一下做route-map和nat的思路,因为这个解决方案里面的route-map比较多,很多刚刚接触的不知道从何下手,不知道如何去合理的理清思路。大家不妨这样想,一个内部数据要想送出去,那么到达路由器被送出去的时候,网关路由器要对数据进行封装,那么就需要知道下一条地址和如何被PAT转换。那么就很简单了,分为二部分解决,二者route-map没有直接关联,直接关联的都是内部的数据。在内部端口应用的策略是为了让路由器的得到下一条地址。所以以上二个内部端口都应用了route-map)


!

interface Ethernet0/2 (外部端口连接isp1)

 ip address 10.10.10.2 255.255.255.0

 ip nat outside

 ip virtual-reassembly in

!

interface Ethernet0/3 (外部端口连接isp2)

 ip address 30.30.30.2 255.255.255.0

 ip nat outside

 ip virtual-reassembly in


!

no ip http server

no ip http secure-server

ip nat inside source route-map nat1 interface Ethernet0/2 overload

ip nat inside source route-map nat11 interface Ethernet0/3 overload

(以上二句是处理route-map定义的流量 如何被pat,因为是二个出口,所以需要二条语句,第二条为isp2出口,当isp1线路down了之后,路由器会通过第二条语句来pat流量)

ip nat inside source route-map nat2 interface Ethernet0/3 overload

ip nat inside source route-map nat22 interface Ethernet0/2 overload

(同上)

ip route 0.0.0.0 0.0.0.0 10.10.10.1

ip route 0.0.0.0 0.0.0.0 30.30.30.1

!

ip access-list extended client1 (定义client1的感兴趣流)

 permit ip 192.168.10.0 0.0.0.255 any

ip access-list extended client2(定义client2的感兴趣流)

 permit ip 192.168.20.0 0.0.0.255 any

!

ip sla 1 (测试到isp1的线路)

 icmp-echo 10.10.10.1 source-ip 10.10.10.2

 frequency 5(定义一个sla 通过icmp的echo包从本机的10.2到10.1,并且是5秒一次,不能低于5秒。如果10.1down了那么sla 1 结果就是非,track 1 的结果就是非)

ip sla schedule 1 life forever start-time noaw

(定义sla 1 从现在开始到永远 都开启)

ip sla 2 (测试到isp2 的线路)

 icmp-echo 30.30.30.1 source-ip 30.30.30.1

 frequency 5

ip sla schedule 2 life forever start-time now

!

route-map ccie permit 10

 match ip address client1

 set ip next-hop verify-availability 10.10.10.1 1 track 1

 set ip next-hop verify-availability 30.30.30.1 2 track 2

!

route-map ccie permit 20

 match ip address client2

 set ip next-hop verify-availability 30.30.30.1 1 track 2

 set ip next-hop verify-availability 10.10.10.1 2 track 1

这个route-map是用于定义下一条地址,分别匹配client1和client2的流量,然后为匹配的流量设定下一跳地址,下面一条是备用下一跳地址,只有当第一条语句结果为非时才能用到下一句,还不清楚route-map语法和规则请百度。这样就client1和2定义了主备下一跳地址了,当然是用在内部端口上

!

route-map nat2 permit 10

 match ip address client2

 match interface Ethernet0/3

!

route-map nat1 permit 10

 match ip address client1

 match interface Ethernet0/2

!

route-map nat11 permit 10

 match ip address client1

 match interface Ethernet0/3

!

route-map nat22 permit 10

 match ip address client2

 match interface Ethernet0/2

!

(这四个route-map和上面的route-map没有关联。主要是为了匹配流量和匹配对应的端口,为下面的pat,可以结合上面的pat部分来看。二者是对应的关系。)

end

以上就是router的配置。

isp1和isp2的配置由于时间关系就忽略了,里面就是对应的端口ip和ospf。下面就直接上测试结果。全部是真实的实验结果。

router路由器上面开启了debug ip nat,查看转换结果

(1)测试1,client1到外网走isp1出口。在client1 上ping广域网

在router上的nat转换表为:

*Nov  2 10:54:55.853: NAT*: s=192.168.10.2->10.10.10.2, d=10.10.10.1 [30]

*Nov  2 10:54:55.854: NAT*: s=10.10.10.1, d=10.10.10.2->192.168.10.2 [30]

*Nov  2 10:54:55.859: NAT*: s=192.168.10.2->10.10.10.2, d=10.10.10.1 [31]

*Nov  2 10:54:55.859: NAT*: s=10.10.10.1, d=10.10.10.2->192.168.10.2 [31]

说明正确。

(2)测试2,关闭isp2路由器的端口。查看网关router的track:

Router#sh track 

Track 1

  IP SLA 1 reachability

  Reachability is Up

    2 changes, last change 00:07:31

  Latest operation return code: OK

  Latest RTT (millisecs) 1

  Tracked by:

    ROUTE-MAP 0

Track 2

  IP SLA 2 reachability

  Reachability is Down

    1 change, last change 00:12:07

  Latest operation return code: Timeout

  Tracked by:

    ROUTE-MAP 0


然后在从client2上ping外网,本应该转换为30.30.30.2。

*Nov  2 11:04:25.625: NAT*: s=192.168.20.2->10.10.10.2, d=20.20.20.1 [15]

*Nov  2 11:04:25.626: NAT*: s=20.20.20.1, d=10.10.10.2->192.168.20.2 [15]

*Nov  2 11:04:25.630: NAT*: s=192.168.20.2->10.10.10.2, d=20.20.20.1 [16]

*Nov  2 11:04:25.631: NAT*: s=20.20.20.1, d=10.10.10.2->192.168.20.2 [16]

已经转换成 10.10.10.2的外网地址。

实验结束。谢谢!