首页 / 资讯中心 / 文章详情

BGP属性综合实验:eNSP环境下四类属性验证与选路排查指南

BGP属性综合实验:eNSP环境下四类属性验证与选路排查指南 ★ FEATURED ARTICLE
1. 为什么BGP属性实验值得单独拿出来做一轮刚接触BGP的时候很多人会把注意力全放在邻居建立、路由通告这些能通就行的环节上等真正进了项目现场才发现路由是通的但选路结果跟预期完全对不上——流量绕了三个省才到目的地或者备线永远抢不到主线的活。这类问题十有八九出在BGP属性上。属性这个东西说白了就是BGP给每条路由贴的标签路由器靠这些标签决定走哪条路、传给谁、传的时候改不改。标签分四类公认必遵、公认任意、可选过渡、可选非过渡。这四类的区别不是学术分类而是直接决定了这条属性能不能丢、丢了怎么办、跨厂商设备传的时候会不会被吞掉。我见过不少备考HCIA/HCIP的朋友理论背得滚瓜烂熟一到eNSP里配实验就懵Local_Pref配了不生效、MED传过去变成0、Community莫名其妙消失。这些问题在真实设备上同样会出现而且排查起来比实验环境更麻烦。所以拿eNSP把BGP属性综合实验完整跑一遍价值不在于应付考试而在于把四类属性的行为边界摸清楚——哪些属性只在IBGP内传、哪些能跨EBGP、哪些必须手动开启传递、哪些默认就被丢弃。这篇内容适合三类人正在备考HCIA/HCIP、需要把BGP属性从背概念变成能配能排的考生刚上手企业网、需要做多出口选路优化的初级工程师以及用过BGP但选路结果总是不符合预期、想系统梳理属性优先级的老手。下面我会用eNSP搭一个多自治系统的拓扑把四类属性逐一验证重点讲清楚为什么这么配和配完不生效该往哪查而不是只给一堆命令。2. 实验拓扑设计与四类属性的验证思路2.1 拓扑怎么搭才能把四类属性都覆盖到eNSP里做BGP属性实验拓扑不用太复杂但自治系统AS的数量和邻居类型必须够用。我的建议是搭三个ASAS 100、AS 200、AS 300。AS 100内部跑OSPF保证IBGP全互联可达AS 200作为中间过渡ASAS 300作为目标AS。AS 100和AS 200之间跑EBGPAS 200和AS 300之间也跑EBGP同时AS 100和AS 300之间再拉一条直连EBGP这样就有了直连路径和经过AS 200的路径两条可选路由选路对比才有意义。设备选型上eNSP里的AR2220足够用每台路由器配两个以上接口。AS 100内部放两台路由器R1、R2做IBGPR1连AS 200的R3R2连AS 300的R5R3和R4在AS 200内跑IBGPR4连R5。这样AS 100去往AS 300的网段时R1和R2都会收到路由选路结果直接受属性影响。地址规划要提前想清楚别配到一半发现网段冲突。我的习惯是互联链路用10.0.X.0/30环回口用X.X.X.X/32业务网段用192.168.X.0/24。比如R1的环回口1.1.1.1/32R2的环回口2.2.2.2/32AS 300的业务网段192.168.30.0/24。这样后面做属性对比时看路由表一眼就能分辨是哪条。提示eNSP的AR2220在跑BGP时如果IBGP邻居没配全互联或者没做路由反射会出现路由学不到的情况。实验阶段最省事的做法是AS内所有IBGP邻居两两互联或者直接配路由反射器。别在这个环节省事否则后面属性验证会被路由压根没收到干扰。2.2 四类属性的验证顺序为什么不能乱四类属性里公认必遵Well-known Mandatory是所有BGP实现都必须识别并且必须携带的典型代表就是AS_Path和Next_Hop。公认任意Well-known Discretionary是必须识别但不一定携带的典型是Local_Pref和Atomic_Aggregate。可选过渡Optional Transitive是厂商可以不支持但收到后如果认不出来还要继续传给邻居典型是Community和Aggregator。可选非过渡Optional Non-transitive是认不出来就直接丢弃、不再传递典型是MED和Originator_ID、Cluster_List。验证顺序我建议按从必遵到非过渡来因为后面的属性行为依赖前面的基础。先确认AS_Path和Next_Hop正常说明BGP路由本身是通的再验证Local_Pref这是IBGP内选路的第一权重然后验证Community能不能跨AS传、需不需要手动开启最后验证MED看它在EBGP之间怎么影响选路、为什么默认不传给第三方AS。这个顺序乱了比如先调MED结果发现路由根本没进BGP表就会浪费大量时间在错误的方向上排查。2.3 属性优先级速查选路时到底谁说了算在动手之前先把BGP选路时属性的比较顺序理清楚这个顺序在华为设备上的实现是固定的从高到低依次是Weight华为私有仅本地有效、Local_Pref、本地始发路由、AS_Path长度、Origin类型、MED、EBGP优于IBGP、IGP度量、Router_ID。这个顺序不需要死记但要知道Local_Pref排在AS_Path前面MED排在AS_Path后面这样调属性的时候才知道该动哪个。属性类别作用范围选路优先级位置Weight华为私有仅本地路由器最高Local_Pref公认任意IBGP内AS内次高AS_Path公认必遵跨AS传递中Origin公认必遵跨AS传递中MED可选非过渡EBGP之间默认不传第三方较低这张表建议贴在实验台旁边每配一个属性就对照一下看它应该在哪一层起作用。很多配了不生效的问题本质是属性作用范围搞错了——比如在EBGP邻居上配Local_Pref对端根本不看这个值因为Local_Pref只在AS内部传递。3. 公认必遵属性的实操验证AS_Path与Next_Hop3.1 AS_Path的防环逻辑和修改技巧AS_Path是公认必遵属性里最核心的一个它的首要作用是防环路由器收到一条路由如果AS_Path里已经包含自己所在的AS号就直接丢弃。这个机制保证了BGP路由不会在AS之间无限循环。在eNSP里验证很简单在R1上把去往192.168.30.0/24的路由通过EBGP发给R3R3再发给R4R4发给R5R5一看AS_Path里有AS 300自己直接丢弃路由不会回环。但AS_Path的第二个作用才是实验重点它影响选路。AS_Path越短路由越优。所以工程上常用AS_Path prepending来人为加长某条路径的AS_Path让这条路径在选路时变差从而实现主备切换。在eNSP里配置命令是# 在R1上对发往R3的路由做AS_Path prepending route-policy AS_PATH_PRE permit node 10 apply as-path 100 100 100 additive quit bgp 100 peer 10.0.13.3 route-policy AS_PATH_PRE export quit这里additive关键字很关键不加的话是覆盖而不是追加。我踩过的坑是一开始没加additive结果AS_Path被改成了100 100 100原本的AS号没了防环机制失效差点造成环路。所以做prepending一定要加additive在原有AS_Path基础上追加。验证的时候在R5上看display bgp routing-table 192.168.30.0对比两条路径的AS_Path长度。正常情况下经过prepending的路径AS_Path会变长选路时被优先度降低。这里要注意AS_Path prepending只在EBGP出口方向做才有效在IBGP内做没有意义因为IBGP不修改AS_Path。3.2 Next_Hop在EBGP和IBGP中的不同行为Next_Hop也是公认必遵属性但它的行为在EBGP和IBGP里差别很大这是很多人配实验时容易忽略的点。EBGP邻居之间Next_Hop默认会改成发送方的接口地址IBGP邻居之间Next_Hop默认保持不变。这个差异导致一个经典问题IBGP学到的路由Next_Hop指向的是外部AS的地址如果本AS内没有去往那个地址的路由路由就是不可达的。在eNSP里复现这个场景R1从R3EBGP学到192.168.30.0/24Next_Hop是10.0.13.3。R1通过IBGP发给R2R2收到的路由Next_Hop还是10.0.13.3。如果R2上没有去往10.0.13.3的路由这条BGP路由就不会被优选。解决办法有两种一是在R1上配peer 2.2.2.2 next-hop-local让R1发给R2时把Next_Hop改成自己的地址二是在AS内保证去往外部Next_Hop的IGP可达。# 在R1的IBGP邻居上配置next-hop-local bgp 100 peer 2.2.2.2 next-hop-local quit我个人的习惯是IBGP邻居一律配next-hop-local除非有特殊需求。这样能避免大量路由收到了但不优选的问题。配完之后在R2上看display bgp routing-tableNext_Hop应该变成R1的地址比如1.1.1.1或者互联口地址路由状态变成*。注意next-hop-local只对IBGP邻居生效对EBGP邻居配了也没用。另外如果IBGP邻居之间跨了多跳还要确保peer connect-interface指向正确的源接口否则邻居都建不起来。3.3 Origin属性的三种取值和实际影响Origin属性也是公认必遵它标记路由的来源IGPi、EGPe、Incomplete?。IGP表示路由由BGP用network命令引入EGP表示从EGP协议学来现在基本不用Incomplete表示通过import-route引入。选路时IGP优于EGPEGP优于Incomplete。在eNSP里验证在R5上用network 192.168.30.0 24引入业务网段Origin是i用import-route direct引入Origin是?。然后在R1上看两条路由的Origin对比。实际工程中Origin的影响排在AS_Path之后所以一般不会为了选路去改Origin但排查路由来源时很有用——看到Origin是?就知道这条路由是通过import-route进来的可能带了不完整的掩码信息。4. 公认任意属性的实操验证Local_Pref与Atomic_Aggregate4.1 Local_Pref为什么是AS内选路的第一权重Local_Pref是公认任意属性只在IBGP内传递不会传给EBGP邻居。它的默认值是100值越大越优。因为它在选路顺序里排在AS_Path前面所以是AS内控制出站流量的首选手段。典型场景一个AS有两个出口想让流量优先走出口A就在出口A的IBGP邻居上把Local_Pref调高。在eNSP里配置R1和R2都从AS 300学到192.168.30.0/24R1的下一跳是R3经过AS 200R2的下一跳是R5直连。默认情况下R2的路由AS_Path更短会被优选。现在想让R1的路径优先就在R1上对从R3学到的路由设置Local_Pref为200# 在R1上设置Local_Pref route-policy LOCAL_PREF permit node 10 apply local-preference 200 quit bgp 100 peer 10.0.13.3 route-policy LOCAL_PREF import quit注意这里是import方向因为Local_Pref是在收到路由时设置的然后通过IBGP传给R2。R2收到后对比两条路由的Local_PrefR1传过来的200大于本地直连的默认100所以优选R1的路径。验证命令是display bgp routing-table 192.168.30.0看Local_Pref字段。我踩过的坑一开始在EBGP出口方向配apply local-preference结果对端根本不认因为Local_Pref不跨EBGP传递。记住Local_Pref只在IBGP内有效配置方向应该是import从EBGP学进来时设置或者在本AS内始发路由上设置。4.2 Atomic_Aggregate的标记作用和聚合场景Atomic_Aggregate是公认任意属性它本身不参与选路只是一个标记表示这条路由是聚合路由可能丢失了部分明细信息。当BGP做路由聚合时如果聚合路由的AS_Path等信息和明细路由不一致就会带上Atomic_Aggregate标记。在eNSP里验证在R5上把192.168.30.0/24和192.168.31.0/24聚合为192.168.30.0/23配置aggregate命令后看聚合路由是否带Atomic_Aggregate。这个属性在实际排错时有用——看到Atomic_Aggregate就知道这条路由是聚合来的如果发现某些明细网段不通可能是聚合时没加detail-suppressed或者suppress-policy导致明细被抑制了。# 在R5上做BGP聚合 bgp 300 aggregate 192.168.30.0 23 detail-suppressed quitdetail-suppressed表示抑制所有明细路由只发聚合路由。如果不加这个参数明细和聚合都会发对端可能同时收到两条选路时明细更优。这个细节在做路由汇总实验时经常被忽略导致聚合配了但明细还在传的现象。4.3 Local_Pref在双出口场景下的完整验证流程把Local_Pref放到双出口场景里完整走一遍才能理解它的实际价值。拓扑里AS 100有两个出口R1连R3路径长R2连R5路径短。默认选R2。现在业务要求走R1因为R1的链路带宽更大。操作步骤在R1上创建route-policy对从R3学到的路由设置Local_Pref为200。在R1的BGP进程里对EBGP邻居R3应用这个route-policy的import方向。在R2上看display bgp routing-table 192.168.30.0确认Local_Pref变成200且路由被优选。在R2上tracert 192.168.30.1确认流量走R1。这个流程里最容易出错的是第2步的方向。import是从邻居收路由时应用策略export是向邻居发路由时应用策略。Local_Pref要在import方向设置因为它是本地AS内的属性设置后通过IBGP传给本AS其他路由器。如果配成export策略会在发给EBGP邻居时应用但Local_Pref不跨EBGP等于白配。5. 可选过渡与可选非过渡属性的行为差异5.1 Community属性为什么需要手动开启传递Community是可选过渡属性的典型代表。它的特点是如果设备支持就识别并传递如果不支持也要继续传给下一个邻居。这个过渡特性意味着Community可以跨AS传递但华为设备默认不向EBGP邻居发送Community需要手动开启。在eNSP里验证在R5上给192.168.30.0/24打上Community 300:100然后发给R4。默认情况下R4收不到Community。需要在R5上对EBGP邻居R4配置peer 10.0.45.4 advertise-communityR4才能收到。R4再传给R3时同样需要配置advertise-community否则Community在R4到R3这一跳就丢了。# 在R5上配置Community并开启传递 route-policy COMM permit node 10 apply community 300:100 quit bgp 300 peer 10.0.45.4 route-policy COMM export peer 10.0.45.4 advertise-community quit这个实验的关键观察点是Community在每一跳EBGP都需要手动开启传递少配一个邻居Community就断在那里。实际工程中Community常用于标记路由来源或用途比如用no-export防止路由传出AS用no-advertise防止发给任何邻居。这些well-known Community的行为也值得在eNSP里验证一遍。Community类型值行为no-export0xFFFFFF01不传出本ASno-advertise0xFFFFFF02不发给任何BGP邻居no-export-subconfed0xFFFFFF03不传出子AS自定义300:100需手动开启传递5.2 MED为什么默认不传给第三方ASMED是可选非过渡属性它的特点是只在相邻EBGP之间传递默认不传给第三方AS。这个非过渡特性是MED和Community最大的区别。MED用于影响入站流量值越小越优。典型场景一个AS有多个入口想让外部流量从入口A进来就在入口A上设置较小的MED。在eNSP里验证R5发给R4时带MED 50R4发给R3时MED默认不传R3收到的路由MED是0。如果确实需要传要在R4上配置peer 10.0.34.3 advertise-med华为设备上是peer advertise-med或者通过route-policy的apply cost重新设置。# 在R5上设置MED route-policy MED permit node 10 apply cost 50 quit bgp 300 peer 10.0.45.4 route-policy MED export quit验证时在R4上看display bgp routing-table 192.168.30.0MED应该是50在R3上看MED应该是0默认不传。这个差异说明MED的作用范围仅限于相邻AS跨AS后需要重新设置。实际工程中如果想让MED影响多个AS的选路需要在每个AS的边界路由器上重新apply cost。5.3 Originator_ID和Cluster_List在路由反射场景下的作用Originator_ID和Cluster_List也是可选非过渡属性它们只在路由反射器RR场景下出现。Originator_ID标记路由的始发路由器Cluster_List记录经过的集群ID两者共同防止路由在RR集群内循环。在eNSP里搭一个RR场景R1作为RRR2和R3作为客户端R2和R3之间不建IBGP。R2发一条路由给R1R1反射给R3R3收到的路由会带Originator_IDR2的Router_ID和Cluster_ListR1的Cluster_ID。如果R3再把路由发回R1R1看到Originator_ID是自己的客户端就不会再反射回去防止循环。这两个属性不需要手动配置是RR自动添加的。但排查RR场景下的路由问题时看这两个属性很有用——如果路由带了Originator_ID但没被优选可能是Cluster_List里包含了本集群ID被防环机制丢弃了。6. 属性不生效时的排查链路与常见坑6.1 从路由表状态判断属性是否生效属性配了不生效第一步不是改配置而是看路由表状态。在华为设备上display bgp routing-table的输出里路由前面的状态码很关键*表示有效表示优选*表示有效且优选。如果路由只有*没有说明路由有效但没被优选问题可能出在属性比较的某一环。排查顺序建议先看Local_Pref再看AS_Path然后看MED。因为选路顺序是Local_Pref优先于AS_Path优先于MED。如果Local_Pref已经分出胜负后面的属性就不用看了。我见过有人调了半天MED结果Local_Pref早就把路由选定了MED根本没参与比较。# 查看BGP路由详细属性 display bgp routing-table 192.168.30.0 verboseverbose参数会显示路由的所有属性包括Local_Pref、MED、Community、Originator_ID等。这个命令是排查属性问题的核心工具建议养成习惯每次改完属性都用它确认一遍。6.2 属性作用范围搞错导致的典型故障最常见的坑是把只在IBGP内有效的属性配到了EBGP邻居上。比如Local_Pref配在EBGP的export方向对端根本不看。还有Community忘了在每一跳EBGP上开advertise-community导致Community传到一半就丢了。另一个典型故障是Next_Hop不可达。IBGP学到的路由Next_Hop是外部AS的地址如果本AS内没有去往这个地址的IGP路由路由就不会被优选。解决办法是配next-hop-local或者保证IGP可达。这个坑在eNSP里特别容易踩因为实验环境经常忘了配OSPF或者配了但没宣告正确的网段。故障现象可能原因排查命令Local_Pref不生效配在EBGP方向display bgp routing-table verboseCommunity丢失未开advertise-communitydisplay bgp routing-table communityMED不传默认非过渡display bgp routing-table verbose路由不优选Next_Hop不可达display bgp routing-table6.3 eNSP环境下的特殊注意事项eNSP是模拟器和真实设备有一些差异做属性实验时要特别注意。第一eNSP的BGP收敛速度比真实设备慢改完属性后可能需要等几秒甚至十几秒才能看到效果别急着反复改配置。第二eNSP对某些属性的默认行为和真实设备可能有细微差别比如Community的默认传递行为建议以display命令的实际输出为准。第三eNSP的AR2220在跑大量BGP路由时可能卡顿实验拓扑尽量精简别开太多路由器。还有一个经验eNSP里做EBGP实验时如果邻居建不起来先检查peer connect-interface和peer ebgp-max-hop。EBGP默认TTL是1如果邻居之间跨了多跳需要配peer ebgp-max-hop。这个在直连场景下不用配但用环回口建邻居时必须配。7. 四类属性在真实选路中的配合逻辑7.1 一个完整选路案例的属性比较过程把四类属性放到一个完整案例里看它们怎么配合决定最终选路。假设AS 100去往192.168.30.0/24有两条路径路径A经过AS 200AS_Path长度2MED 50Local_Pref 200路径B直连AS 300AS_Path长度1MED 100Local_Pref 100。选路过程比较Local_Pref路径A的200大于路径B的100路径A优选。选路结束后面的AS_Path和MED不再比较。如果把路径A的Local_Pref改成100两条路径Local_Pref相同继续比较AS_Path路径B的AS_Path长度1小于路径A的2路径B优选。选路结束。如果两条路径AS_Path也相同继续比较Origin、MED等。这个逐层比较的过程说明属性配置要有优先级意识想用MED影响选路必须确保Local_Pref和AS_Path没有提前分出胜负。7.2 属性配置的工程化建议实际工程中属性配置要遵循几个原则。第一Local_Pref用于AS内出站流量控制配置在IBGP的import方向或者本AS始发路由上。第二AS_Path prepending用于EBGP出口的入站流量控制配置在export方向记得加additive。第三MED用于相邻AS之间的入站流量控制配置在export方向跨AS后需要重新设置。第四Community用于路由标记和策略匹配每一跳EBGP都要开advertise-community。这些原则不是死规矩但按这个思路配能避免大部分配了不生效的问题。我个人的习惯是每配一个属性先问自己三个问题——这个属性在哪个范围有效配置方向是import还是export选路时它排在第几位想清楚这三个问题配置基本不会错。7.3 从实验到现网属性验证的迁移思路eNSP里验证过的属性行为迁移到现网时要注意几点差异。现网的BGP邻居可能跨厂商不同厂商对可选过渡属性的支持程度不同Community和MED的传递行为可能有差异。现网的路由数量大属性配置不当可能导致收敛变慢或者路由震荡。现网的选路还受IGP度量、Router_ID等因素影响实验环境里这些因素简化了现网要综合考虑。我的建议是实验阶段把每个属性的行为边界摸清楚现网配置前先在测试环境验证配置后持续观察路由表和流量路径。属性这东西配对了是优化配错了就是故障。尤其是AS_Path prepending加长了路径但没考虑备用路径的容量可能导致主路径故障时流量切过去把备线打满。8. 属性实验做完之后值得再挖的几个方向把四类属性的基础行为验证完之后还有几个方向值得继续挖。第一个是BGP选路顺序的完整验证从Weight到Router_ID逐项对比这个在eNSP里可以搭一个多路径拓扑逐项调整属性看选路变化。第二个是路由反射场景下的属性传递Originator_ID和Cluster_List的防环机制值得单独做一轮。第三个是BGP聚合与属性的配合聚合路由的AS_Path怎么设置、Community怎么继承、Atomic_Aggregate什么时候出现这些在现网做路由汇总时都会遇到。我自己做完这轮实验最大的体会是BGP属性不是孤立的知识点而是一套配合使用的工具。单独背Local_Pref的值和选路位置很容易但把它放到双出口场景里、和AS_Path、MED一起考虑才能理解为什么工程上这么配。eNSP的好处是可以随便折腾配错了大不了重启现网可没这个容错空间。所以实验阶段多踩坑现网就少踩坑。最后分享一个排查习惯每次改完BGP属性别只看目标路由把display bgp routing-table的完整输出过一遍看有没有其他路由被意外影响。属性策略经常是全局的改了一个route-policy可能影响多条路由的选路。这个习惯帮我避免过好几次改A路由结果B路由断了的事故。
阅读完成 · 觉得有帮助?
咨询建站