PBR+多出口NAT+IP SLA

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PBR+多出口NAT+IP SLA相关的知识,希望对你有一定的参考价值。

PBR策咯路由(Policy-Based Routing

         route-map的一种应用,基于策略的路由比传统的路由能力更强,使用更灵活,它使网络管理者不仅能够根据目的地址而且能够根据协议类型、报文大小、应用或IP源地址来选择转发路径。策略路由可以定义为通过多路由器的负载平衡或根据总流量在各线上进行报文转发的服务质量来定义策略路由

        策略路由主要对经过路由器的数据流进行分流和过滤以及感兴趣的数据流

    在讲PBR之前有必要简单介绍下Route-map工具,Route-map包含两元,一个是match(匹配)还有一个是set(执行动作)。

         Route-map默认为permit,默认序列号10,序列号不会自动递增,需要指定序列号

         Route-map执行从最小的序列号开始执行,如果一旦匹配住将不再执行下边序列号的语句,如果一个都没有匹配住,Route-map末尾隐含deny any语句。

         单条match语句包含多个条件时,使用逻辑or运算(或运算)

         多条match语句时,使用逻辑and运算(且运算)

Route-map name {permit|deny }10     

    match xxx zzz                 XZ只要匹配住一个这个match就成真

    Set yy                              执行set动作

Route-map name {permit|deny } 20

    match xxx                      xz两个match都必须匹配住这个序列号中的set动作才会执行

    match zzz

    Set yy                     

Route-map name deny           隐含deny any语句

 

PBR对数据的处理流程:

 技术分享图片


图解:数据包到了接口,路由器查看是否应用PBR工具,如果有执行PBRmatch语句,如果被match语句匹配住则执行set动作,如果没有被match语句匹配住,这个数据包流量将会按照传统路由表进行转发,而不是丢弃。这是PBR很重要的一个处理数据包的流程概念,PBRset动作是优于路由表的。

PBR的配制分为三个步骤:1.ACL匹配数据 2.Route-map中部署PBR  3.调用PBR

如果你只再Route-map中部署PBR而不调用,PBR是不生效的。

 

技术分享图片

整篇文章的实验拓扑IP地址规划:192.168.xy.z/24   其中x和y是两端设备编号,z是设备本身编号。 x代表较小的设备编号,y代表较大的设备编号

例如:R1----R2     R1的IP:192.168.12.1   R2的IP:192.168.12.2     下边文章不做赘述IP编址

PBR的应用场景一:

PBR叫策略路由,而不是叫路由策略,PBR和传统的路径控制工具最大的区别就是它可以跟据源去做策略,而传统的路径控制工具只能根据目的去做决策,改变目的来影响数据流的走向。

如上图,R1路由器去往100.100.100.100/24目的有两条路径,下边的VLAN10VLAN20用户只能走一边,或者等价负载均衡方式转发。传统工具无法做到让VLAN10强制走R2VLAN20强制走R3

PBR可以做到,PBR可以跟据源去匹配感兴趣的data(数据),强制性让VLAN10用户走R2,并且当R2挂掉切换到R3。强制性让VLAN20R3,同样当R3挂掉切换到R2

具体配置命令:

R1(config)#ip access-list standard vlan10

R1(config-std-nacl)#permit 192.168.1.0 0.0.0.255

R1(config)#ip access-list standard vlan20

R1(config-std-nacl)#permit 192.168.2.0 0.0.0.255

首先用ACL匹配感兴趣数据流,上边命令分别用两个ACL去匹配VLAN10VLAN20的数据

R1(config)#route-map PBR permit 10                创建Route-map,配置PBR

R1(config-route-map)#match ip address vlan10      match VLAN10ACL

R1(config-route-map)#set ip next-hop 192.168.12.2               执行set动作将数据丢给下一跳,需要注意这个下一跳一定是我直连的下一跳。Set动作的意思就是我将数据包丢给我的下一跳路由器,让它帮我转发数据

R1(config-route-map)#exit                                                            它丢给下一跳的动作是不会改变数据包的源和目的信息

R1(config)#route-map PBR permit 20                PBR Route-map里边创建第二个序列号

R1(config-route-map)#match ip address vlan20      match VLAN20ACL

R1(config-route-map)#set ip next-hop 192.168.13.3               执行set动作将数据丢给下一跳,需要注意这个下一跳一定是我直连的下一跳,Set动作的意思就是我将数据包丢给我的下一跳路由器,让它帮我转发数据

R1(config-route-map)#exit                                                             它丢给下一跳的动作是不会改变数据包的源和目的信息

R1(config)#interface fastEthernet 1/0              R1路由器的f1/0接口进行调用

R1(config-if)#ip policy route-map PBR              这条命令是调用PBR,接口调用PBR,使得刚配置的PBR生效

PBR的调用有两种方式:第一种接口调用,第二种全局调用

接口调用:从这个接口经过的数据流量执行PBR的策略

全局调用:R1(config)#ip local policy route-map PBR    全局调用就是从这台路由器设备本身经过的数据全部执行PBR的策略

经过以上三个步骤配置,PBR的最简单的应用场景就实现了,下边查看VLAN10VLAN20用户是不是按照PBR的方式执行

R1路由表去往100.100.100.100/24实际上是走的默认路由,而默认路由的下一跳是R2,也就是在上述情况,去往该目的地实际上只能走R2,通过R3是到不了的,但是我们PBR可以做到,因为我们可以将数据丢给我的直连下一跳,让它们进行转发。

R1#show ip route

C    192.168.15.0/24 is directly connected, FastEthernet2/0

C    192.168.16.0/24 is directly connected, FastEthernet1/0

S    192.168.1.0/24 [1/0] via 192.168.16.6

S    192.168.2.0/24 [1/0] via 192.168.16.6

S*   0.0.0.0/0 [1/0] via 192.168.12.2

 

PC-4#traceroute 100.100.100.100                     VLAN10用户

 

Type escape sequence to abort.

Tracing the route to 100.100.100.100

 

  1 192.168.1.254 80 msec 52 msec 16 msec

  2 192.168.16.1 76 msec 48 msec 44 msec

  3 192.168.12.2 108 msec 72 msec 44 msec          最后一跳路由是192.168.12.2刚好是R2

 

PC-5#traceroute 100.100.100.100                              VLAN20用户

 

Type escape sequence to abort.

Tracing the route to 100.100.100.100

 

  1 192.168.2.254 88 msec 60 msec 20 msec

  2 192.168.16.1 60 msec 48 msec 44 msec

  3 192.168.13.3 84 msec 64 msec 72 msec            最后一跳路由是192.168.13.3刚好是R3

 

总结:VLAN10的用户发送数据到去往100.100.100.100/24目的,数据包到了R1f1/0接口,R1路由器查看有没有部署PBR,刚好部署,查看match语句能否匹配,刚好匹配执行set动作强制将数据包丢给R2路由器

VLAN20的用户发送数据到去往100.100.100.100/24目的,数据包到了R1f1/0接口,R1路由器执行PBR,将数据丢给R3,其实如果没有部署PBRR1直接通过R3是过不去的,因为没有路由。R1的路由表去往100.100.100.100/24只有一条默认路由指向R2。但是我们做了PBRR1将数据丢个了R3路由器,让它进行转发,尽管我路由表本身没有路由。

 

PBR应用场景二:利用set语句的多个下一跳特性

技术分享图片

需求:希望VLAN10用户强制走R2路由器,当R2路由器挂掉后走R3路由器,当R3挂掉后通过R7访问100.100.100.100/24

希望VLAN20用户强制走R3路由器,当R3路由器挂掉后走R2路由器,当R2挂掉后通过R7访问100.100.100./24

 

具体配置命令:

R1(config)#ip access-list standard vlan10

R1(config-std-nacl)#permit 192.168.1.0 0.0.0.255

R1(config)#ip access-list standard vlan20

R1(config-std-nacl)#permit 192.168.2.0 0.0.0.255

首先用ACL匹配感兴趣数据流,上边命令分别用两个ACL去匹配VLAN10VLAN20的数据

R1(config)#route-map PBR permit 10                创建Route-map,配置PBR

R1(config-route-map)#match ip address vlan10      match VLAN10ACL

R1(config-route-map)#set ip next-hop 192.168.12.2       192.168.13.3                  set动作这里的下一跳可以写多个,先执行第一个,当第一个不可达了也就是挂掉了,执行第二个

R1(config-route-map)#exit

R1(config)#route-map PBR permit 20                PBR Route-map里边创建第二个序列号

R1(config-route-map)#match ip address vlan20      match VLAN20ACL

R1(config-route-map)#set ip next-hop 192.168.13.3       192.168.12.2                  set动作这里的下一跳可以写多个,先执行第一个,当第一个不可达了也就是挂掉了,执行第二个

R1(config-route-map)#exit

R1(config)#interface fastEthernet 1/0      R1路由器的f1/0接口进行调用

R1(config-if)#ip policy route-map PBR      这条命令是调用PBR

 

总结:其实配置和场景一配置是一模一样的,就是在set后边多添加了那个下一跳的地址,当第一个地址不可达了,执行第二个地址。

实验结果:

R1(config)#interface fastEthernet 0/0                    模拟R2路由器挂掉,看VLAN10的用户是否切换到R3

R1(config-if)#shutdown                                             关闭R1路由器接口,也只能关闭R1的,因为模拟器无法感知对端设备的存活,将就下,最后讲解如何让R1探测到对端设备存活

 

 PC-4#traceroute 100.100.100.100               VLAN10的用户

 

Type escape sequence to abort.

Tracing the route to 100.100.100.100

 

  1 192.168.1.254 40 msec 68 msec 12 msec

  2 192.168.16.1 80 msec 56 msec 64 msec

  3 192.168.13.3 88 msec 116 msec 56 msec      最后一跳路由是192.168.13.3刚好R3路由器         说明PBR生效了   VLAN20的用户同理

 

 

技术分享图片

PBR应用场景三:递归下一跳

 

PBRset动作下一跳也不一定非要是直连的路由器接口IP,PBR有一个递归下一条的概念。

recursive next-hop(递归下一跳)特性突破了传统下一跳必须是直连路由器接口IP的限制。recursive next-hop可以不是直连网络,只要路由表中有相关的路由可达即可。一般recursive next-hop不可达,数据交由路由       表处理(一般就被默认路由匹配走了)    

 

    规则:如果在一个route-map列表同一个序列号中同时使用ip next-hopip next-hop recursive ,则ip next-hop有效,如果IP next-hop挂了,则启用IP next-hop recursive,如果两个都挂了,则丢给路由表处理。注意:        一个route-map序列号中,只允许配置一个ip next-hop recursive

 

需求VLAN10VLAN20用户强制走R3路由器,当R3路由器挂掉以后从R2路由器走,R2路由器挂掉后从R5路由器转发出去。

 

R1(config)#ip access-list standard vlan10anvlan20

R1(config-std-nacl)#10 permit 192.168.1.0 0.0.0.255

R1(config-std-nacl)#20 permit 192.168.2.0 0.0.0.255

首先用ACL匹配感兴趣数据流,上边命令用1ACL去匹配VLAN10VLAN20的数据

R1(config)#route-map PBR permit 10                    创建Route-map,配置PBR

R1(config-route-map)#match ip address vlan10andvlan20            match VLAN10和VLAN20的用户数据流量ACL

R1(config-route-map)#set ip next-hop 192.168.13.3                        先set到R3路由器

R1(config-route-map)#set ip next-hop recursive 192.168.24.2        递归到R2路由器f0/1接口,也只能递归这个接口,不能递归到R4路由器接口IP

R1(config-route-map)#exit

R1(config)#interface fastEthernet 1/0              在R1路由器的f1/0接口进行调用

R1(config-if)#ip policy route-map PBR             这条命令是调用PBR

 

 

结果:

 

R1#show ip route

C    192.168.15.0/24 is directly connected, FastEthernet2/0

C    192.168.16.0/24 is directly connected, FastEthernet1/0

S    192.168.1.0/24 [1/0] via 192.168.16.6

S    192.168.2.0/24 [1/0] via 192.168.16.6

S*   0.0.0.0/0 [1/0] via 192.168.15.5

R1的路由表中去往100.100.100.100/24的目的只有默认路由可以匹配,但是默认路由的下一跳是R5,因为部署了PBR所以先匹配PBRset动作。

R1(config)#interface fastEthernet 0/1

R1(config-if)#shutdown                          R1f0/1接口shutdown掉,模拟R3挂掉

 

PC-4#traceroute 100.100.100.100

 

Type escape sequence to abort.

Tracing the route to 100.100.100.100

 

  1 192.168.1.254 88 msec 72 msec 12 msec

  2 192.168.16.1 56 msec 56 msec 40 msec

  3 192.168.12.2 104 msec 72 msec 44 msec      最后一跳路由是192.168.12.2刚好R2路由器

 

 

R1(config)#interface fastEthernet 0/0

R1(config-if)#shutdown                 R1f0/0接口shutdown掉,模拟R2挂掉

 

PC-4#traceroute 100.100.100.100

 

Type escape sequence to abort.

Tracing the route to 100.100.100.100

 

  1 192.168.1.254 100 msec 28 msec 16 msec

  2 192.168.16.1 48 msec 28 msec 20 msec

  3 192.168.15.5 84 msec 40 msec 24 msec                 最后一跳路由是192.168.15.5刚好R5路由器

 

技术分享图片

应用场景四:多出口NAT+PBR+IP SLA

需求:我们希望VLAN10的用户走ISP-1VLAN20的用户走ISP-2并且在两边任何链路故障都能够切换,结合NAT

 IP SLAcisco公司的一种私有协议,可以通过源发送icmp包检测公司与运营商之间的接口是否是up的,因为有可能R1作为客户路由器和运营商之间有一台透明设备。假设ISP-1和透明设备之间链路故障,而作为客户这边是感知不到的,岂不是数据转发就有问题。就算没有透明设备,一般与运营商之间链路接口的UPdown也很难通过接口本身去感知,所以我们需要IP SLA协议去探测链路接口的UPdown,更多的说明,还请百度。在模拟器环境下 IP SLA好像只对S串口生效,就是我上图环境,以太网接口模拟器它模拟不到对端存活,我有尝试以太网接口没用。。。。。。

多出口NAT:我们希望VLAN10的用户走ISP-1VLAN20的用户走ISP-2

并且在两边任何链路故障都能够切换,像上边的三个场景,都没有部署NAT只是单纯的为了实验PBR工具的使用方式,在一些现网有可能顾客就有这种需求,一台出口路由器上联两家ISP运营商,然后不同的VLAN用户走不同的ISP运营商

NAT我们做PAT,就是端口扩展的NAT模式,不做动态和静态的。

PBR:通过PBR实现VLAN10ISP-1VLAN20ISP-2进行数据分流

我们要结合Route-mapNAT去最终实现上述要求,不过现网一般有负载均衡的设备,也可以更简单的达到这种需求,我们可以看下在ciscoios平台如何通过Route-map+NAT的结合实现

 

 

路由部分:出口路由器必须有默认路由,我们写一个静态和一个浮动默认路由

R1(config)#ip route 0.0.0.0 0.0.0.0 192.168.12.2                 静态默认路由指电信运营商

R1(config)#ip route 0.0.0.0 0.0.0.0 192.168.13.3 5     浮动的指教育网

R1(config)#ip route 192.168.1.0 255.255.255.0 192.168.14.4    回城路由,要能回到VLAN10

R1(config)#ip route 192.168.2.0 255.255.255.0 192.168.14.4    回城路由,要能回到VLAN20

PBR部分:就不再赘述,上边已经举例3个场景了,PBR实现数据分流

R1(config)#route-map PBR permit 10

R1(config-route-map)#match ip address vlan10

R1(config-route-map)#set ip next-hop 192.168.12.2

R1(config-route-map)#exit

R1(config)#route-map PBR permit 20

R1(config-route-map)#match ip address vlan20

R1(config-route-map)#set ip next-hop 192.168.13.3

R1(config-route-map)#exit

R1(config)#interface fastEthernet 0/0                   最后一定在接口或者全局进行调用PBR

R1(config-if)#ip policy route-map PBR

NAT部分:结合Route-map去实现

R1(config)#interface serial 2/0            定义接口的outsideinside模式

R1(config-if)#ip nat outside                                   外是outside模式

R1(config-route-map)#exit   

R1(congig)#interface serial 2/1

R1(config-if)#ip nat outside

R1(config)#interface range fastEthernet 1/0

R1(config-if-range)#ip nat inside                                       内是inside模式

R1(config-route-map)#exit

定义4Route-map,定义4nat的实例,一一相互对应进行调用,我用序号进行标识,属于一个序列就是一组配置,一组配置指:Router-map+NAT的一组

①R1(config)#route-map nat1 permit 10                   定义第一个nat

     R1(config-route-map)#match ip address vlan10              匹配VLAN10的数据

     R1(config-route-map)#match interface serial 2/0           匹配从该接口经过的数据,在最前边Route-map中有提到,    多条match语句时,使用逻辑and运算(且运算)

     R1(config-route-map)#exit

②R1(config)#route-map nat2 permit 10

     R1(config-route-map)#match ip address vlan10

     R1(config-route-map)#match interface serial 2/1

     R1(config-route-map)#exit

③R1(config)#route-map nat3 permit 10

     R1(config-route-map)#match ip address vlan20

     R1(config-route-map)#match interface serial 2/1

     R1(config-route-map)#exit

④R1(config)#route-map nat4 permit 10

     R1(config-route-map)#match ip address vlan20 

     R1(config-route-map)#match interface serial 2/0

     R1(config-route-map)#exit

 

①R1(config)#ip nat inside source route-map nat1 interface serial 2/0 overload      配置NAT调用Route-map所匹配的数据,这个和最上边的nat1所对应    下边的同理一 一对应

②R1(config)#ip nat inside source route-map nat2 interface serial 2/1 overload

③R1(config)#ip nat inside source route-map nat3 interface serial 2/1 overload

④R1(config)#ip nat inside source route-map nat4 interface serial 2/0 overload


Sla部分:关于sla命令,百度百科的不准确,它们的命令有些多出的,甚至命令都打不上去,应该是和IOS版本有关系,你们按照这个模板就可以了,我把我的IOS版本号写上:C3660-JK9O3S-M, Version 12.4(15)T5

现在都EVE模拟器,12.4版本是老版本,EVE模拟器的IOS版本都是最新的15.0以后的,15.0sla的配置我没试来尝试,但是只有一条命令和12.4版本的不一样我写出来:

R1(config)#track 10 ip route 192.168.12.2 192.168.12.1 reachability  GNS3模拟器的12.4版本用这条命令进行关联track实例

R1 (config)#track 10 ip sla 10 reachability   15.0版本用这条命令关联track实例

 

R1 (config)#ip sla 10                创建sla 10,检测ISP-2运营商现路

Switch(config-ip-sla)#icmp-echo 192.168.12.2 source-ip 192.168.12.1     用源192.168.12.1检测对端192.168.12.2地址

R1 (config-ip-sla-echo)#frequency 5                      检测超时时间5S

R1 (config-ip-sla-echo)#exit

R1(config)#ip sla schedule 10 life forever start-time now          设置立即生效sla命令

R1(config)#track 10 ip route 192.168.12.2 192.168.12.1 reachability  关联到一个Track实例,

R1(config-track)#exit

R1 (config)#route-map PBR permit 10                  

R1(config-route-map)#set ip next-hop verify-availability 192.168.12.2 10 track 10

PBR中调用,下边一共两个10,第一个10sla10,第二个10track实例的10

 

 

R1 (config)#ip sla 20                创建sla 20,检测ISP-3运营商线路

R1 (config-ip-sla)#icmp-echo 192.168.13.3 source-ip 192.168.13.1     用源192.168.13.1检测对端192.168.13.3地址

R1 (config-ip-sla-echo)#frequency 5                      检测超时时间5S

R1 (config-ip-sla-echo)#exit

R1 (config)#ip sla schedule 20 life forever start-time now                  设置立即生效sla命令

R1 (config)#track 20 ip route 192.168.13.3 192.168.13.1 reachability      关联到一个Track实例

R1(config-track)#exit

R1 (config)#route-map PBR permit 20

R1(config-route-map)#set ip next-hop verify-availability 192.168.13.3 20 track 20

PBR中调用,下边一共两个20,第一个20sla20,第二个20track实例的20



把整个PBR写完,发现还是漏了一个点就是PBR的set动作,我上边提到它是优于传统路由表的,通过整篇文章应该也能理解这句话。

漏讲的就是我们可以通过在set动作后加上default关键字,让set动作它不优于路由表。就是先查询路由表,看有没有去往目的的明细,有走路由表,没有执行set动作

比如接场景一的实验吧,其实配置大同小异只是结果稍微有点不同,我把配置还是全部粘贴一遍吧~

技术分享图片

需求:VLAN10用户去往100.100.100.100/24目的强制丢给R2,VLAN20强制丢给R3路由器

具体配置命令:

R1(config)#ip access-list standard vlan10

R1(config-std-nacl)#permit 192.168.1.0 0.0.0.255

R1(config)#ip access-list standard vlan20

R1(config-std-nacl)#permit 192.168.2.0 0.0.0.255

首先用ACL匹配感兴趣数据流,上边命令分别用两个ACL去匹配VLAN10和VLAN20的数据

R1(config)#route-map PBR permit 10                创建Route-map,配置PBR

R1(config-route-map)#match ip address vlan10      match VLAN10的ACL

R1(config-route-map)#set ip default next-hop 192.168.12.2    执行set动作将数据丢给下一跳,需要注意这个下一跳一定是我直连的下一跳。注意加上了default 关键字

R1(config-route-map)#exit                           

R1(config)#route-map PBR permit 20                在 PBR 的Route-map里边创建第二个序列号

R1(config-route-map)#match ip address vlan20      match VLAN20的ACL

R1(config-route-map)#set ip next-hop 192.168.13.3    执行set动作将数据丢给下一跳,需要注意这个下一跳一定是我直连的下一跳

R1(config-route-map)#exit                                                           

R1(config)#interface fastEthernet 1/0              在R1路由器的f1/0接口进行调用

R1(config-if)#ip policy route-map PBR              这条命令是调用PBR,接口调用PBR,使得刚配置的PBR生效



R1#show ip route

C    192.168.15.0/24 is directly connected, FastEthernet2/0

C    192.168.16.0/24 is directly connected, FastEthernet1/0

S    192.168.1.0/24 [1/0] via 192.168.16.6

S    192.168.2.0/24 [1/0] via 192.168.16.6

S     100.100.100.0/24 [1/0] via 192.168.13.3                    有去往100.100.100.100/24的明细路由,下一跳是R3路由器

S*   0.0.0.0/0 [1/0] via 192.168.12.2

 

PC-4#traceroute 100.100.100.100                     VLAN10用户

 

Type escape sequence to abort.

Tracing the route to 100.100.100.100

 

  1 192.168.1.254 80 msec 52 msec 16 msec

  2 192.168.16.1 76 msec 48 msec 44 msec

  3 192.168.13.3 108 msec 72 msec 44 msec          最后一跳路由是192.168.12.2刚好是R3

 

PC-5#traceroute 100.100.100.100                              VLAN20用户

 

Type escape sequence to abort.

Tracing the route to 100.100.100.100

 

  1 192.168.2.254 88 msec 60 msec 20 msec

  2 192.168.16.1 60 msec 48 msec 44 msec

  3 192.168.13.3 84 msec 64 msec 72 msec            最后一跳路由是192.168.13.3刚好是R3


总结:VLAN10用户的数据包到了路由器接口,被match匹配住,执行set动作,但是我们加了default关键字,default 关键字能够让set动作次优于路由表。这个时候R2先去查找路由表,发现去往100.100.100.100/24有一条明细路由,这个时候R2就会按照这个明细路由进行转发,数据包到了R3路由器



 

 

 

 


以上是关于PBR+多出口NAT+IP SLA的主要内容,如果未能解决你的问题,请参考以下文章

Cisco(63)——多出口PBR+NAT解决方案

Cisco(63)——多出口PBR+NAT解决方案

Cisco(61)——双出口策略路由PBR+NAT

Cisco(61)——双出口策略路由PBR+NAT

单路由器多出口解决方案(route-map+sla+track)

思科路由器PBR(策略路由)结合IP SLA实现双线备份和负载均衡