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运算(或运算)
Route-map name {permit|deny }10
match xxx zzz X和Z只要匹配住一个这个match就成真
Set yy 执行set动作
Route-map name {permit|deny } 20
match xxx x和z两个match都必须匹配住这个序列号中的set动作才会执行
match zzz
Set yy
Route-map name deny 隐含deny any语句
PBR对数据的处理流程:
图解:数据包到了接口,路由器查看是否应用PBR工具,如果有执行PBR的match语句,如果被match语句匹配住则执行set动作,如果没有被match语句匹配住,这个数据包流量将会按照传统路由表进行转发,而不是丢弃。这是PBR很重要的一个处理数据包的流程概念,PBR的set动作是优于路由表的。
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目的有两条路径,下边的VLAN10和VLAN20用户只能走一边,或者等价负载均衡方式转发。传统工具无法做到让VLAN10强制走R2,VLAN20强制走R3。
PBR可以做到,PBR可以跟据源去匹配感兴趣的data(数据),强制性让VLAN10用户走R2,并且当R2挂掉切换到R3。强制性让VLAN20走R3,同样当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去匹配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 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 VLAN20的ACL
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的最简单的应用场景就实现了,下边查看VLAN10和VLAN20用户是不是按照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目的,数据包到了R1的f1/0接口,R1路由器查看有没有部署PBR,刚好部署,查看match语句能否匹配,刚好匹配执行set动作强制将数据包丢给R2路由器
VLAN20的用户发送数据到去往100.100.100.100/24目的,数据包到了R1的f1/0接口,R1路由器执行PBR,将数据丢给R3,其实如果没有部署PBR,R1直接通过R3是过不去的,因为没有路由。R1的路由表去往100.100.100.100/24只有一条默认路由指向R2。但是我们做了PBR,R1将数据丢个了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去匹配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 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 VLAN20的ACL
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应用场景三:递归下一跳
PBR的set动作下一跳也不一定非要是直连的路由器接口IP,PBR有一个递归下一条的概念。
recursive next-hop(递归下一跳)特性突破了传统下一跳必须是直连路由器接口IP的限制。recursive next-hop可以不是直连网络,只要路由表中有相关的路由可达即可。一般recursive next-hop不可达,数据交由路由 表处理(一般就被默认路由匹配走了)
规则:如果在一个route-map列表同一个序列号中同时使用ip next-hop及ip next-hop recursive ,则ip next-hop有效,如果IP next-hop挂了,则启用IP next-hop recursive,如果两个都挂了,则丢给路由表处理。注意: 一个route-map序列号中,只允许配置一个ip next-hop recursive
需求VLAN10和VLAN20用户强制走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匹配感兴趣数据流,上边命令用1个ACL去匹配VLAN10和VLAN20的数据
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所以先匹配PBR的set动作。
R1(config)#interface fastEthernet 0/1
R1(config-if)#shutdown 将R1的f0/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 将R1的f0/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-1,VLAN20的用户走ISP-2并且在两边任何链路故障都能够切换,结合NAT
IP SLA:cisco公司的一种私有协议,可以通过源发送icmp包检测公司与运营商之间的接口是否是up的,因为有可能R1作为客户路由器和运营商之间有一台透明设备。假设ISP-1和透明设备之间链路故障,而作为客户这边是感知不到的,岂不是数据转发就有问题。就算没有透明设备,一般与运营商之间链路接口的UP和down也很难通过接口本身去感知,所以我们需要IP SLA协议去探测链路接口的UP和down,更多的说明,还请百度。在模拟器环境下 IP SLA好像只对S串口生效,就是我上图环境,以太网接口模拟器它模拟不到对端存活,我有尝试以太网接口没用。。。。。。
多出口NAT:我们希望VLAN10的用户走ISP-1,VLAN20的用户走ISP-2
并且在两边任何链路故障都能够切换,像上边的三个场景,都没有部署NAT只是单纯的为了实验PBR工具的使用方式,在一些现网有可能顾客就有这种需求,一台出口路由器上联两家ISP运营商,然后不同的VLAN用户走不同的ISP运营商
NAT我们做PAT,就是端口扩展的NAT模式,不做动态和静态的。
PBR:通过PBR实现VLAN10走ISP-1,VLAN20走ISP-2进行数据分流
我们要结合Route-map和NAT去最终实现上述要求,不过现网一般有负载均衡的设备,也可以更简单的达到这种需求,我们可以看下在cisco的ios平台如何通过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 定义接口的outside和inside模式
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
定义4个Route-map,定义4给nat的实例,一一相互对应进行调用,我用序号进行标识,属于一个序列就是一组配置,一组配置指: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.0的sla的配置我没试来尝试,但是只有一条命令和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)#route-map PBR permit 10
R1(config-route-map)#set ip next-hop verify-availability 192.168.12.2 10 track 10
在PBR中调用,下边一共两个10,第一个10是sla的10,第二个10是track实例的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,第一个20是sla的20,第二个20是track实例的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的主要内容,如果未能解决你的问题,请参考以下文章