
1. 两个名字近似的技术连方向都是反的很多朋友第一次接触路由策略和策略路由时都会下意识觉得这俩是同一个东西——无非是给路由加点策略嘛。实际项目中这两者不仅不是一回事处理的对象、生效的阶段、配置思路甚至可以说完全是反着来的。搞混了不光是配置写不出来更严重的是你会在错误的层面解决问题折腾一晚上最后发现方向就错了。我先用一个场景把话说清楚。假设公司出口路由器接了电信和联通两条线路老板的要求很简单财务部的网段必须走电信线路其他部门走联通。你打开路由器一看默认路由只有一条去联通走网关A去电信走网关B。想让财务网段的流量和别的流量分开走不同的出口这时候有两条路可以选一是用路由策略在路由表层面做文章——把财务网段对应的路由改一下比如给财务的路由加一个更高的优先级或者干脆把财务网段的路由只通过电信线路学习进来。二是用策略路由直接告诉路由器凡是源地址是财务网段的包别管路由表怎么写的一律扔给电信网关。前者改的是路由表里有什么路后者改的是数据包具体走哪条路。这俩名字看起来差不多实际上一个是控制平面的事一个是数据平面的事。下面我分别拆开讲然后再结合思科模拟器做一个基于源地址的策略路由实训把配置和排错的完整链路走一遍。1.1 一次配置翻车开始的误会我自己第一次理解这俩概念也栽过跟头。当时在做一台三层交换机的双出口改造想实现办公网段走主链路服务器网段走备链路的需求。我第一反应是在路由表里下功夫写了两条静态路由加上路由策略调整优先级。配置确实生效了但维护起来特别别扭只要网络里出现一条新的匹配路由或者有动态路由协议介入路由策略的匹配条件就得跟着改过滤逻辑稍微复杂一点脑子就开始转不过来。后来同事提醒了一句你要的是数据包选路不是路由表选路干吗不直接用PBR我换成策略路由后ACL抓源地址、route-map设下一跳、接口上应用三条命令就解决了逻辑还特别清晰再也不怕动态路由把路由表搅乱。从那次以后我就明确了一个判断标准只要需求描述里带着某个特定流量必须走某条链路优先想PBR只有涉及路由该不该被学习、该不该被发布、属性该怎么改这一类问题才轮到路由策略登场。1.2 控制平面与数据平面最关键的分水岭要理解这两个概念最关键的分水岭是控制平面和数据平面。路由器的工作可以拆成两个层面。控制平面负责学习路径运行OSPF、BGP、RIP这些协议接收路由更新维护路由表本质上是路由器之间交换路况信息的大脑。数据平面负责转发数据包当一个数据包从接口进来路由器查路由表找到最长匹配的路由条目然后决定从哪个接口扔出去这是高速转发的执行机构。路由策略作用于控制平面在路由信息进入路由表之前或者发布出去之前做过滤和修改。所以它影响的是路由表长什么样。而策略路由Policy-Based Routing简称PBR作用于数据平面它绕开路由表的决策过程由管理员预先定义好的规则直接决定数据包的去向。配置了PBR的接口收到数据包后先检查策略命中策略就按策略指定的下一跳或出口转发不命中的才回到普通路由表。打个生活化的比方路由表是城市里的地图导航路由策略是决定哪些道路能显示在地图上、拥堵指数怎么标注的编辑规则而策略路由是交警现场指挥——他说你右转你就右转根本不看导航。2. 路由策略在路由表形成之前动手脚2.1 route-map的三段式结构路由策略在思科设备上最常见的实现工具是route-map华为设备叫route-policy但思路完全一样都是匹配条件动作的组合。一个route-map可以包含多个条目每个条目都是独立的规则结构是route-map 名字 permit/deny 序号 match 条件 set 动作其中序号决定了匹配的先后顺序从小到大依次检查。permit表示命中后允许该路由通过并进行set动作deny则表示命中后拒绝该路由。这里有个初学者经常踩的坑route-map末尾其实隐含着一个deny all也就是说如果一条路由没有命中任何一个permit条目它会被默认拒绝。用的时候要么记得在最后加一个permit空条目兜底要么确认自己要的就是这个默认拒绝效果。match关键字用于匹配路由的特征常见的匹配对象包括ACL或前缀列表匹配路由的网段接口类型匹配从某个接口学习到的路由下一跳地址匹配指定下一跳的路由路由标签tag匹配带特定tag的路由set关键字则是修改路由的属性比如设置metric值、设置管理距离、设置下一跳地址、打tag等。2.2 用ACL和前缀列表精准圈定目标路由路由策略的前提是能精准描述我要处理哪些路由。这里有两个常用工具ACL和前缀列表。ACL在路由策略里用的时候要注意它匹配的规则是允许/拒绝某些网段但和普通的流量过滤有一点区别在路由策略中ACL只负责筛选路由不负责决定路由策略的permit/deny。route-map的permit/deny才是最终动作。前缀列表ip prefix-list比ACL更精确因为它能同时匹配网段和掩码长度。比如ip prefix-list LOOPBACK seq 5 permit 192.168.100.0/24这条只匹配192.168.100.0/24这个精确网段。如果想匹配所有192.168.0.0/16内的网段不管掩码多长可以写ip prefix-list RANGE seq 5 permit 192.168.0.0/16 le 32le 32表示掩码长度小于等于32位即允许这个范围内任意子网。前缀列表在路由策略里的优势就是这种灵活的掩码控制ACL只能用反掩码表达不了掩码范围这种精确需求。2.3 实操案例重分发进OSPF时改metric我给出一个最典型的实操场景把直连路由重分发进OSPF同时希望特定的业务网段在OSPF里有个较高的metric让其他路由器优先走别的路径。配置如下ip prefix-list SERVER seg 5 permit 192.168.100.0/24 route-map CONN-TO-OSPF permit 10 match ip address prefix-list SERVER set metric 200 route-map CONN-TO-OSPF permit 20第一段规则匹配到192.168.100.0/24这个网段重分发时把metric改成200。第二段成了一个空的permit条目用来兜底让其他所有没被第一条匹配到的直连路由也正常重分发并保持默认metric。在OSPF进程下调用router ospf 1 redistribute connected subnets route-map CONN-TO-OSPF这么做的效果是其他路由器通过OSPF学到192.168.100.0/24时发现metric是200比走另一条路径更远就不会把流量优先导向这台路由器。这就在完全不动数据包转发规则的情况下从路由源头调整了全网选路方向。3. 策略路由PBR数据包不查路由表也能走3.1 PBR的转发流程PBR的学名叫Policy-Based Routing有的资料叫策略路由有的直接叫PBR策略路由。它的核心价值在于路由表不是唯一的转发决策依据。在启用了PBR的接口上数据包的走向是这样的数据包从接口进入路由器路由器检查该接口是否应用了route-map如果启用了则按route-map条目逐一匹配数据包的特征命中后执行set指令指定的动作比如set ip next-hop没有命中任何条目的流量按普通路由表转发。注意这里的顺序PBR先于路由表查表过程。也就是说只要命中PBR规则路由器根本不管路由表里怎么写的直接按策略走。3.2 match与set的灵活组合PBR的灵活性来自match和set的组合方式。match可以匹配源地址、目的地址、服务类型、报文长度甚至可以用ACL做更复杂的四层匹配。set动作则支持三种常见方式set ip next-hop X.X.X.X指定下一跳地址set interface 接口名指定出接口set ip next-hop verify X.X.X.X实测下一跳可达才生效这属于PBR的可靠性增强选项。实际项目中set ip next-hop用得最多因为它配置直观、便于和现有的路由架构融合。而set interface在某些场景下有局限比如对于以太网多路访问链路只指定出接口而不指定下一跳路由器可能不知道ARP该找谁。这里提一个容易忽略的细节PBR不仅仅能指定下一跳还可以做报文标记比如set ip precedence、set ip tos这类QoS相关的动作让不同策略流量带上不同优先级进入网络。这意味着PBR和QoS可以联动后面我会再展开。3.3 PBR和普通路由转发并存PBR不会完全取代路由表。它就像一个关卡命中的流量走特殊通道没命中的流量走常规路线。所以设计PBR策略时要特别注意兜底逻辑你希望匹配的流量走A通道不匹配的流量走B通道那B通道就不要在PBR里单独写一条全匹配规则直接让不匹配的流量自然落回路由表即可。有一个反向思路也值得提PBR可以用deny条目来实现排除。比如希望除了某个网段以外其他所有流量都走特定出口那route-map里可以先写一个deny条目匹配那个网段让它回到路由表转发然后再写一个permit空条目让剩下的流量命中并指定下一跳。这种deny截断permit兜底的思路和防火墙策略有点像理解了就不容易乱。4. 模拟器实训基于源地址的PBR双向分流4.1 拓扑与需求现在到实操环节。我用的思科模拟器环境是Cisco Packet Tracer早期版本对PBR支持有限建议用较新的8.x版本或者GNS3配思科IOS镜像也行。实验拓扑很简单一台路由器R1作为出口网关它是三个网段的默认网关所在同时连接两个运营商模拟出口。具体规划为设备接口IP地址说明PC1网卡192.168.10.10/24模拟财务网段网关192.168.10.1PC2网卡192.168.20.10/24模拟办公网段网关192.168.20.1R1G0/0192.168.10.1/24接财务网段交换机R1G0/1192.168.20.1/24接办公网段交换机R1G0/210.0.1.1/24模拟电信出口R1G0/310.0.2.1/24模拟联通出口需求是源192.168.10.0/24的流量走10.0.1.2出口源192.168.20.0/24的流量走10.0.2.2出口。这句话直接用PBR实现不需要在路由表里区分。路由表里只需要两条默认路由分别指到两个出口网关ip route 0.0.0.0 0.0.0.0 10.0.1.2 ip route 0.0.0.0 0.0.0.0 10.0.2.2注意这两条默认路由是负载均衡关系如果没有PBR出流量会哈希轮流走两个出口需求无法满足。而PBR启用后匹配到的流量会被强制分流。4.2 配置步骤逐条拆解先配置ACL抓源地址。这里用的是扩展ACLaccess-list 110 permit ip 192.168.10.0 0.0.0.255 any access-list 120 permit ip 192.168.20.0 0.0.0.255 any扩展ACL允许指定源和目的因为PBR的match ip address可以直接引用它。目的地址写any表示只看源地址。然后配置两个route-maproute-map PBR-FIN permit 10 match ip address 110 set ip next-hop 10.0.1.2 route-map PBR-OFF permit 10 match ip address 120 set ip next-hop 10.0.2.2每个route-map只保留了一个序列号10没有额外的permit兜底这意味着不匹配的流量会自动落回路由表转发。如果需求是所有流量必须二选一而不是其他流量按路由表走那可以再加一个permit空序列但通常不建议这么写否则会影响管理流量。最关键的一步把策略应用在入接口上。PBR方向敏感必须在连接源站的接口上应用配置在哪个接口上就只对这个接口收到的流量生效interface GigabitEthernet0/0 ip policy route-map PBR-FIN interface GigabitEthernet0/1 ip policy route-map PBR-OFF到这里配置完成。注意不要把策略应用在出接口上那样不生效。从PC1方向进入的流量在G0/0接口上命中PBR-FIN直接扔给10.0.1.2从PC2方向进入的流量在G0/1接口上命中PBR-OFF扔给10.0.2.2。两个网段的数据包互不干扰。4.3 验证方法配置完不要急着下结论验证这一步非常关键。在特权模式下用两条命令确认show ip policy show route-mapshow ip policy的输出会列出接口绑定了哪个route-map确认应用位置没有搞错。show route-map的输出会显示每个条目以及命中次数matched这是判断PBR有没有真正生效的唯一硬指标。PC1上ping 10.0.1.2的连通性测试只能证明出口网关通不能直观证明走了PBR。更可靠的验证方式是在R1上开启debugdebug ip policy然后从PC1发起流量观察控制台是否输出PBR匹配和转发信息。这里有个版本相关的坑在开启CEF快速转发的设备上debug ip policy可能没有输出因为数据包走了硬件转发路径没有触发软件层面的策略检查。遇到这种情况可以临时关闭CEF后再测试但生产环境不要这么干那是老设备时代的做法了现在一般直接看show route-map的命中计数就够了。5. 那些年PBR翻车的排错过程5.1 快速转发导致debug无输出我特意把这个放第一位因为太多人在模拟器和真实设备上被坑过。现象是策略配置正确show ip policy也显示策略已经应用但debug ip policy就是不打印任何东西测试流量也确实没走PBR。这个问题的根因是思科设备默认启用CEF大多数数据包由CEF直接转发PBR的匹配在转发路径上完成不会像普通进程交换那样输出调试信息。不同平台、不同IOS版本的CEF对PBR的支持也不一样有的版本需要把PBR相关的CEF特性打开才能生效。排错思路先看show route-map里的matched计数是不是在增长只要计数在涨流量命中了策略就不用纠结debug输出。如果计数没涨那才是真正的策略没生效问题去检查ACL写法和接口应用位置。5.2 下一跳不可达时的隐性回退PBR有一个很多人不知道的机制set ip next-hop指定的地址路由器会检查它的有效性路由可达性。如果下一跳地址不可达PBR策略会失效数据包自动走普通路由表转发而且这种回退在信息呈现上非常隐蔽你可能根本意识不到PBR已经没在工作了。所以配置PBR时第一条排错命令应该是从路由器本身ping一下策略里指定的下一跳。连通性OK再谈其他。我见过不止一次ACL写得没问题、route-map也没问题结果就是下一跳IP写错了运营商网关地址流量全都悄悄走了默认路由而配置上看起来一切正常。顺带说一句set interface也会有类似问题如果指定接口处于down状态PBR同样无法生效。这些边界情况都要在前期设计时考虑进去。5.3 入接口和出接口的困惑PBR只能在入方向接口上应用这是原理决定的数据包在进入路由器的那一刻转发决策还没有做出PBR可以干预而数据包已经确定要从某个接口出去时再改方向已经没有意义了。虽然部分平台也支持出方向PBR但思科传统IOS的PBR始终以入方向为准。的实操教训是配置PBR前先画清楚数据流向。中央路由器上有多条连接源站的下行接口如果每个接口都指向同一个策略不如直接在靠近源站的汇聚层设备上处理这样策略的覆盖范围更清晰避免在核心路由器上堆叠大量ACL和route-map影响转发性能。6. 路由策略 策略路由什么时候用哪个6.1 快速决策对照表对比维度路由策略策略路由PBR作用层面控制平面数据平面处理对象路由信息数据包生效时机路由学习/发布时数据包转发前核心命令route-map match setroute-map match set影响效果改变路由表的组成和属性绕过路由表直接指定转发路径常见场景路由过滤、属性修改、重分发控制多出口分流、特定流量选路、QoS标记从配置命令上看这两者都叫route-map机制结构也一样这是容易混淆的根本原因。但仔细看set的内容就能区分路由策略里set的是路由属性metric、管理距离、tag策略路由里set的是转发属性next-hop、出接口。一个改的是路由怎么说一个改的是流量怎么走。6.2 协同工作的典型场景这两种技术不是互斥的在企业网络中经常配合使用。我举一个双运营商出口的简化案例路由策略负责把从运营商A学到的路由设置较高本地优先级从运营商B学到的路由设置较低优先级让默认的路由选择倾向于运营商A策略路由负责处理例外流量视频会议系统跨网质量不好需要固定走运营商B的精品线路那就ACL把视频会议服务器的地址抓出来PBR强制下一跳指向B出口。这样架构的好处是职责分明路由策略管理常规选路逻辑PBR处理特殊流量。后期如果精品线路调整只需改一条route-map里的下一跳不需要动整个路由体系。6.3 实际部署中的几条个人经验项目做多了我慢慢总结出几条PBR部署的原则写在这里给后来人参考第一策略里能写下一跳就尽量不写出接口。下一跳地址的语义在网络拓扑改变时更直观而物理接口一旦变动策略就会被动失效。除非设备本身就是边界只有一条上行链路那set interface也够用。第二PBR的ACL尽量保持精简。在生产设备上PBR匹配失败会回到路由表但匹配动作本身有开销ACL规则太庞大、太复杂会白白消耗设备CPU。能用一条ACL圈定网段就不要把协议、端口、分片乱七八糟的都写进去。第三注意排查默认的deny all逻辑。写路由策略route-policy时如果route-map里忘了放permit兜底条目可能造成路由被静默拒绝写PBR时同样的空permit兜底逻辑如果不配置反而意味着不匹配的流量走普通路由表。这个记反的问题出了几次事故后我都是直接拿show命令看实际效果不靠记忆赌。第四模拟器验证通过不等于生产环境可用。Packet Tracer里的PBR实现做了大量简化真实设备上的CEF交互、多路径负载均衡行为、硬件转发表项下发等等都需要在实验室用真实IOS验证后再上生产。有条件的话GNS3搭配IOS镜像做验证比模拟器更接近真实设备行为。路由策略和策略路由之间的辨析核心一句话就能概括路由策略是管路的策略路由是管车流的。管路的时候想清楚哪些路要留、属性怎么改路就按你的意思建起来了管车流的时候想清楚哪类车必须走哪条路车流就乖乖听你的指挥。两者不是替代关系而是不同场景下的不同工具。把控制平面和数据平面的概念焊死在脑子里看到任何一个路由相关需求你就能第一时间判断该用哪个了。