1. 为什么BGP属性值得单独拉出来做一轮综合实验刚接触BGP的时候很多人都有个错觉邻居起来了、路由收到了、能ping通这就算学会了。真到项目上才发现路由是收到了但选路完全不是自己预期的那条流量绕了一大圈或者备路死活不切换。问题十有八九出在属性上——BGP不像OSPF那样靠开销算路它靠的是一整套属性比较规则谁先比、谁后比、哪些属性只在特定场景生效这些搞不清楚排错就是盲人摸象。这篇内容就是围绕BGP属性综合实验展开的用eNSP把四类属性——公认必遵、公认任意、可选过渡、可选非过渡——全部跑一遍再配合选路规则做验证。适合已经会配基础BGP邻居、但一遇到选路就发懵的朋友。我会把每个属性的作用、传递行为、实验拓扑、关键配置、验证命令以及我自己踩过的坑全部摊开讲。看完你至少能做到两件事一是看到一条BGP路由能说清它带了哪些属性、为什么这么选二是自己搭一套实验环境把属性对选路的影响一条条验证出来。先说清楚一个前提BGP属性不是孤立存在的它和选路顺序强绑定。华为设备的选路顺序大致是——权重 本地优先级 本地始发 AS路径长度 起源属性 MED EBGP优于IBGP IGP开销最后才是路由ID等。属性实验的意义就是让你能人为控制其中某一环观察它如何改变最终结果。脱离选路谈属性等于背单词不看例句记不住也用不上。2. BGP属性分类与传递行为拆解2.1 四类属性的定义与典型代表BGP属性按“是否必须识别”和“是否必须传递”两个维度分成四类。这个分类不是学术游戏它直接决定了属性在跨设备、跨AS传递时会不会被丢掉。属性类别识别要求传递要求典型属性实际意义公认必遵所有BGP实现必须识别必须传给所有邻居AS_PATH、Next_Hop、Origin路由的基础身份信息缺了就不完整公认任意所有实现必须识别可以不传看情况Local_Preference、Atomic_Aggregate本地策略类通常不出AS可选过渡可以不识别识别则传不识别也要传Aggregator、Community跨厂商互通的关键保证信息不丢可选非过渡可以不识别不识别就丢弃不强制传MED、Cluster_List、Originator_ID局部优化用出了范围就没意义这张表建议直接记住。后面所有实验现象都能从“识别”和“传递”这两列推出来。比如Local_Preference是公认任意意味着它默认只在IBGP内传不会带到EBGP邻居那边去MED是可选非过渡跨AS传的时候对方不认就直接丢所以做多出口选路时经常要配合其他手段。2.2 属性传递的“边界感”从哪来很多人疑惑为什么Local_Preference不能跨EBGP传这不是设备故意为难你而是设计逻辑决定的。Local_Preference字面意思就是“本地优先”它是给本AS内部选路用的告诉自己的路由器“去某个目的地优先走我这条”。如果它跨AS传出去等于让别的AS替你决定内部选路这显然不合理。MED则相反它的作用是“告诉邻居从我这里进本AS走哪条入口更好”。所以MED是发给EBGP邻居看的但它是可选非过渡邻居如果不支持这个属性收到后直接忽略MED就失效了。这也是为什么做双出口选路时MED经常需要配合Community或者干脆用AS_PATH来兜底。理解了这个“边界感”你在配策略时就不会乱套。比如你想影响对端AS怎么把流量送进来用MED你想影响自己AS内部怎么出去用Local_Preference。方向搞反了配了也没效果。2.3 属性与选路顺序的对应关系把属性和选路顺序对照起来看记忆效率会高很多。华为的选路顺序里权重和Local_Preference排在最前面说明它们是“人为干预力度最强”的两个属性优先级最高。AS_PATH长度排在中间是天然形成的路径度量。MED排在后面影响力相对弱。最后才是IGP开销这类。这个顺序解释了一个常见现象你配了MED想让流量走某条路结果没生效很可能是因为前面某一环已经分出胜负了根本没轮到MED比较。比如两条路由AS_PATH长度不同那AS_PATH短的直接胜出MED看都不看。所以做属性实验时一定要控制变量一次只改一个属性否则现象会互相干扰。3. eNSP综合实验环境搭建与基础配置3.1 拓扑设计与地址规划实验拓扑我设计成四个AS互联的结构这样能同时覆盖IBGP和EBGP场景也能观察属性跨AS传递的行为。具体是AS 100内部跑OSPF保证IGP可达R1和R2建立IBGPR2与AS 200的R3建立EBGPR3与AS 300的R4建立EBGP。R1上挂一个环回口模拟业务网段。地址规划如下建议照着配避免后面验证时对不上R1G0/0/0 10.0.12.1/24Loopback0 1.1.1.1/32R2G0/0/0 10.0.12.2/24G0/0/1 10.0.23.2/24Loopback0 2.2.2.2/32R3G0/0/0 10.0.23.3/24G0/0/1 10.0.34.3/24Loopback0 3.3.3.3/32R4G0/0/0 10.0.34.4/24Loopback0 4.4.4.4/32AS号分配R1、R2属于AS 100R3属于AS 200R4属于AS 300。R1的1.1.1.1/32作为我们要重点观察的目标网段从R4侧引入一路传到R1观察属性变化。3.2 IGP与BGP邻居配置先在AS 100内部把OSPF跑起来保证R1和R2的Loopback互通这是IBGP能建立的前提。R2和R3之间是直连不需要IGP。配置思路是OSPF只宣告互联段和Loopback不要宣告业务网段避免和BGP抢路由。R1的关键配置ospf 1 router-id 1.1.1.1 area 0 network 10.0.12.0 0.0.0.255 network 1.1.1.1 0.0.0.0R2的OSPF类似宣告10.0.12.0和2.2.2.2。然后配BGP# R1 bgp 100 router-id 1.1.1.1 peer 2.2.2.2 as-number 100 peer 2.2.2.2 connect-interface LoopBack0 # R2 bgp 100 router-id 2.2.2.2 peer 1.1.1.1 as-number 100 peer 1.1.1.1 connect-interface LoopBack0 peer 10.0.23.3 as-number 200 # R3 bgp 200 router-id 3.3.3.3 peer 10.0.23.2 as-number 100 peer 10.0.34.4 as-number 300 # R4 bgp 300 router-id 4.4.4.4 peer 10.0.34.3 as-number 200配完用display bgp peer检查State必须是Established。IBGP用Loopback建邻居时一定要确认底层IGP可达否则邻居起不来。我见过有人Loopback没宣告进OSPF卡了半天找不到原因。3.3 业务网段引入与初始验证在R4上把4.4.4.4/32引入BGP模拟从AS 300发出来的业务路由bgp 300 network 4.4.4.4 255.255.255.255然后在R1上看display bgp routing-table应该能看到4.4.4.4/32下一跳是10.0.23.3AS_PATH是200 300。这时候路由是通的但只有一条路径看不出属性对选路的影响。接下来我们要人为制造多条路径才能观察属性怎么起作用。提示做属性实验前先确认基础路由是通的否则后面现象全是错的。建议每改一个属性都先reset bgp all再重新观察避免旧路由残留干扰。4. 公认必遵属性实验AS_PATH与Origin4.1 AS_PATH的防环与选路作用AS_PATH是公认必遵属性里最核心的一个。它有两个作用一是防环路由器收到带自己AS号的路由直接丢弃二是选路AS_PATH越短越优先。验证防环很简单在R2上把从R3学到的路由再发回给R3R3一看AS_PATH里有200直接忽略。这个不用特意配是默认行为。验证选路需要造两条路径。我在R2和R3之间再加一条链路让R2到R4有两条路可走一条是R2-R3-R4AS_PATH是200 300另一条是R2直接连R4假设物理可达AS_PATH是300。后者更短会被优选。实验里可以用环回口模拟或者干脆在R3上做AS_PATH prepend把路径变长。AS_PATH prepend的配置# 在R3上对发往R2的路由做prepend route-policy PREPEND permit node 10 apply as-path 200 200 200 additive bgp 200 peer 10.0.23.2 route-policy PREPEND export这样R2收到的路由AS_PATH变成200 200 200 300长度从2变4选路结果立刻改变。这个技巧在实际项目里常用于“让某条链路看起来更长从而不被选中”比直接关接口优雅得多。4.2 Origin属性的三种取值Origin属性表示路由是怎么进入BGP的有三个值IGP用network命令引入、EGP早期协议基本不用、Incomplete用import引入。选路时IGP优于EGP优于Incomplete。实验里可以这样验证在R4上用network引入4.4.4.4Origin是IGP再用import-route direct引入同一个网段Origin变成Incomplete。两条路由同时存在时IGP那条胜出。# R4上两种引入方式 bgp 300 network 4.4.4.4 255.255.255.255 import-route direct看display bgp routing-table 4.4.4.4会看到两条Origin分别是i和?优选i的那条。这个属性平时用得不多但排错时如果发现路由优选结果和预期不符可以查一下Origin有时候是引入方式不同导致的。注意Origin是公认必遵意味着它一定会传给邻居。但它的值不会因为传递而改变IGP传出去还是IGP。这点和后面要讲的MED不同。5. 公认任意属性实验Local_Preference与Atomic_Aggregate5.1 Local_Preference的本地选路控制Local_Preference是公认任意属性默认值100只在IBGP内传递。它的作用是告诉本AS的路由器“去某个目的地优先走哪条路”。数值越大越优先。实验设计让R1到4.4.4.4有两条路可走。一条是R1-R2-R3-R4另一条是R1直接连R3假设有链路。在R2上对发往R1的路由设Local_Preference 200R1就会优选经过R2的路。配置# R2上对IBGP邻居R1设置Local_Preference route-policy LP permit node 10 apply local-preference 200 bgp 100 peer 1.1.1.1 route-policy LP exportR1上display bgp routing-table 4.4.4.4会看到从2.2.2.2学来的路由Local_Pref是200被优选。这里有个关键点Local_Preference是公认任意意味着它“可以不传”。默认情况下它只在IBGP内传不会传给EBGP邻居。如果你在R2上对EBGP邻居R3设Local_PreferenceR3收到后不会认因为这是本地属性。所以做实验时一定要在IBGP邻居上设别设错方向。5.2 Atomic_Aggregate与聚合行为Atomic_Aggregate是个“标记属性”本身不携带数值作用是告诉邻居“这条路由是聚合过的可能丢失了明细”。它通常和Aggregator属性一起出现。实验里在R2上做路由聚合bgp 100 aggregate 4.4.0.0 255.255.0.0 detail-suppressed聚合后R1收到的4.4.0.0/16路由会带Atomic_Aggregate标记。用display bgp routing-table 4.4.0.0能看到这个属性。Atomic_Aggregate的实际意义在于它提醒下游设备这条聚合路由可能不完整如果对路径有严格要求需要谨慎使用。平时做实验容易忽略它但在跨AS场景下它会影响对端对路由可信度的判断。实操心得Local_Preference和Atomic_Aggregate虽然都是公认任意但行为差别很大。前者带数值、参与选路后者只是标记、不参与比较。别把两者混为一谈。6. 可选过渡属性实验Community与Aggregator6.1 Community属性的传递与匹配Community是可选过渡属性的典型代表。它的特点是如果设备识别它就传递如果不识别也要原样传下去不能丢。这个“过渡”特性保证了跨厂商设备互通时策略信息不会因为中间设备不支持而丢失。Community的格式是AS号:自定义值比如100:1。实验里在R4上给4.4.4.4打上Community 300:100传到R1后R1可以用这个值做策略匹配。配置# R4上设置Community route-policy COMM permit node 10 apply community 300:100 bgp 300 peer 10.0.34.3 route-policy COMM export peer 10.0.34.3 advertise-community注意advertise-community这条命令不加的话Community不会传出去。这是新手最容易漏的一步。R1上收到后用display bgp routing-table 4.4.4.4能看到Community值。然后R1可以基于Community做过滤或改属性# R1上匹配Community并改Local_Preference ip community-filter 1 permit 300:100 route-policy FROM-R4 permit node 10 if-match community-filter 1 apply local-preference 300这样就把Community和Local_Preference联动起来了实际项目里非常常用。比如给不同客户的路由打不同Community然后在边界路由器上统一做策略。6.2 Aggregator属性的作用Aggregator属性记录“是谁做的聚合”包含做聚合的AS号和路由器ID。它和Atomic_Aggregate配合使用一个标记“聚合过”一个记录“谁聚合的”。在R2上做聚合后R1收到的路由会带Aggregator属性值是2.2.2.2和AS 100。这个属性主要用于排错当聚合路由出问题时可以追溯是哪台设备做的聚合。Aggregator是可选过渡意味着它会跨AS传递。如果中间设备不识别也会原样传下去。这个特性保证了聚合信息的可追溯性在大型网络里很有价值。7. 可选非过渡属性实验MED与Cluster_List7.1 MED的多出口选路实验MED是可选非过渡属性作用是影响对端AS如何把流量送进本AS。数值越小越优先。它默认只在EBGP传且对方不识别就丢弃。实验设计让R1到4.4.4.4有两条入口一条经过R2一条经过另一台边界路由器假设是R5。在R4上对发往不同邻居的路由设不同MED观察R1的选路变化。配置# R4上对R3设MED 50 route-policy MED permit node 10 apply cost 50 bgp 300 peer 10.0.34.3 route-policy MED exportR3收到后MED值是50传给R2R2再传给R1。R1比较两条路由的MED小的胜出。这里有个坑MED是可选非过渡如果R3不识别MED收到后直接丢R1就看不到MED了。华为设备默认识别MED所以实验里能正常传。但跨厂商时要确认对端是否支持。另外MED默认只在相邻AS之间传不会继续往下传。如果R1和R4之间隔了多个ASMED传几跳就没了。这时候需要用peer x.x.x.x route-policy配合apply cost在每一跳重新设置或者干脆用Community来传递选路意图。7.2 Cluster_List与路由反射器Cluster_List是可选非过渡属性只在路由反射器RR场景下出现。它的作用是防环RR把路由反射给客户端时会在Cluster_List里加上自己的Cluster ID客户端收到后如果发现Cluster_List里有自己的Cluster ID就丢弃。实验里可以配一个简单的RR场景R2作为RRR1和另一台R6作为客户端。R2反射路由时R1收到的路由会带Cluster_List。这个属性平时做实验容易忽略但在大型IBGP网络里RR是必配的Cluster_List的防环机制必须理解。配置RRbgp 100 peer 1.1.1.1 reflect-client peer 6.6.6.6 reflect-clientR1上display bgp routing-table从R6学来的路由会带Cluster_List值是R2的Cluster ID。如果R1再把这条路由发回给R2R2一看Cluster_List里有自己直接丢弃防环成功。注意Cluster_List是可选非过渡意味着它不会跨AS传。如果路由出了AS 100Cluster_List就被丢弃了。这是合理的因为RR是AS内部机制跨AS不需要这个属性。8. 属性综合选路验证与常见问题排查8.1 多属性叠加时的选路顺序验证把前面所有属性放在一起做一次综合验证。在R1上制造两条到4.4.4.4的路由一条Local_Preference 200、AS_PATH长度3、MED 50另一条Local_Preference 100、AS_PATH长度2、MED 10。按选路顺序先比Local_Preference200大于100所以第一条胜出后面的AS_PATH和MED根本不看。这个实验说明一个道理选路是逐级比较的前面分出胜负后面就不参与。很多人配了MED没生效就是因为Local_Preference或AS_PATH已经决定了结果。做策略时一定要先确认当前在哪一级比较别做无用功。验证命令display bgp routing-table 4.4.4.4输出里会显示最优路由的标记以及各条路由的属性值。对照选路顺序表逐级核对就能定位是哪一级决定了结果。8.2 常见问题速查表现象可能原因排查方法Local_Preference没生效设在了EBGP邻居上检查邻居类型改到IBGP邻居MED没传过去对端不识别或未配advertise确认对端支持检查export策略Community丢失没配advertise-community在邻居上加该命令AS_PATH没变短prepend配错方向检查export方向确认additive路由优选结果不符预期前面某级已分胜负逐级核对选路顺序IBGP邻居起不来Loopback不可达检查IGP是否宣告Loopback这张表是我自己排错时总结的基本覆盖了属性实验里80%的问题。遇到现象不对先查表再逐级验证比盲目改配置高效得多。8.3 独家避坑技巧第一个坑reset bgp all之后路由可能不恢复。因为BGP是增量更新reset后需要重新收敛。如果底层IGP有问题路由可能起不来。建议reset后等30秒再看别急着下结论。第二个坑route-policy的节点顺序。route-policy是按节点号从小到大匹配的匹配到permit就执行不再往下走。如果节点10是permit且没有if-match那所有路由都匹配节点10节点20永远不生效。配策略时一定要把精确匹配的节点号设小宽松的设大。第三个坑MED的比较范围。MED默认只在相邻AS之间比较如果两条路由来自不同ASMED不参与比较。这时候需要用bestroute med-compare always命令强制比较或者用其他属性。第四个坑Community的格式。华为默认是十进制格式如果对端用十六进制需要转换。跨厂商时确认双方的Community格式一致否则匹配不上。9. 属性总结与实战应用思路把四类属性串起来看其实就一条主线公认必遵保证路由能传公认任意控制本地选路可选过渡保证跨厂商互通可选非过渡做局部优化。理解这条主线比死记硬背每个属性的定义有用得多。实际项目里属性策略通常是组合使用的。比如做双出口选路常见做法是用Local_Preference控制内部出去的方向用MED影响对端进来的方向用Community做标记和联动用AS_PATH prepend做兜底。四者配合才能实现精细的流量调度。我自己在项目上遇到过一种情况客户要求主备链路主链路正常时走主主链路故障时切备。一开始只配了MED结果主链路故障后备路不切换因为MED是可选非过渡故障时路由直接撤销备路虽然存在但没被优选。后来改成用Local_Preference做主备配合BFD做快速检测才实现预期效果。这个案例说明属性选型要结合故障场景考虑不能只看正常时的选路。最后分享一个验证习惯每次改完属性策略不要只看display bgp routing-table还要用tracert实际验证流量走向。路由表优选不代表转发一定走那条路中间可能还有策略路由或ACL拦截。路由和转发是两回事实验里也要养成端到端验证的习惯。这套实验环境搭一次大概20分钟但能把BGP属性全部跑通。建议你照着配一遍每改一个属性就reset一次、观察一次把现象和选路顺序对应起来。配完这一轮BGP选路就不再是黑盒了。
阅读完成 · 觉得有帮助?