ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

BGP路径属性详解:从选路原理到华为设备实战配置

BGP路径属性详解:从选路原理到华为设备实战配置 做网络的朋友应该都有过这种经历配置BGP的时候邻居怎么也建不起来路由通告过去对端就是不理你或者明明两条链路都在跑流量却挤在一条上另一条闲得发慌。折腾到最后才发现问题根本不是命令写错而是没把BGP路由身上带的那些标签看明白。这些标签就是路径属性Path Attributes。路径属性是BGP协议的核心数据结构。BGP在UPDATE报文里通告路由时不是只丢一个前缀和掩码过去而是附带一串描述这条路由出身、路径、优先级的属性字段。选路、防环、策略控制全部建立在属性之上。这篇就围绕路径属性展开适合正在学HCIP、在eNSP上搭环境做实验的朋友也适合在生产网络里排查BGP选路异常的工程师。从头梳理属性分类、选路规则再用华为设备的配置实例把每个属性怎么用讲透。1. BGP路径属性先搞清楚它为什么存在1.1 从距离到属性BGP决策逻辑的底层变化RIP和OSPF这类IGP路由协议选路时看的是什么RIP看跳数OSPF看开销Cost。它们解决的是哪条路更近的问题。但到了BGP这个层面事情就变了。BGP连接的是自治系统AS一个AS可能同时是运营商、企业也可能是数据中心。AS之间走的往往是跨国链路、多运营商互联单纯一个距离根本无法表达复杂的商业策略——我希望流量从这条链路走因为这条链路便宜不希望走那条因为那条链路带宽小。这些诉求没法用跳数表达于是BGP引入了路径属性。很多人第一次学BGP时会被UPDATE报文吓到其实报文本身很朴素。BGP运行在TCP 179端口上一共只有四种报文OPEN、KEEPALIVE、UPDATE、NOTIFICATION。路径属性就藏在UPDATE报文里和NLRI网络层可达信息放在一起。如果说NLRI是路由的前缀和掩码那路径属性就是这条路由的附加履历。BGP的决策引擎拿到这条履历后逐项对比最终选出一条最优路由。这也是为什么BGP常被称为策略型路由协议——选路的过程本质上是属性的比较过程而不是简单的距离计算。1.2 路径属性四分类一张表看清全貌RFC 4271把BGP路径属性按照公认性和传递性两个维度分成四类。这个分类不只是理论考试点它直接决定了某条属性在跨AS传播时会不会被丢掉、能不能被修改。分类是否必须识别是否可传递典型属性通俗理解公认必遵是是Origin、AS_Path、Next_Hop简历上的姓名身份证号必须带公认自决是可选Local_Pref、Atomic_Aggregate简历上的特长路由器自己决定写不写可选传递否是Community、Aggregator可选项但跨AS不丢后面节点都能看到可选非传递否否MED、Originator_ID、Cluster_List仅在小范围内有效出了边界就丢为什么要区分可选传递和可选非传递因为有些属性只在当前AS内部有意义。比如MED是给对端AS选路用的但对端再往外传时不希望别人也看到这个协商出来的值所以设计成非传递。Community则相反需要在全程传播方便下游AS根据标签做策略。记住这个分类逻辑后面理解每个属性的行为就会很顺。2. 核心路径属性逐个拆解路由身上带的简历长什么样2.1 公认必遵三件套Origin、AS_Path、Next_HopOrigin起源属性标记这条路由是怎么进BGP的。值为0表示通过network命令发布的IGP路由值为1表示通过EGP协议引入老古董现在基本见不到值为2表示通过import命令从IGP协议引入。选路时Origin值越小越优也就是0优于1优于2。很多人在eNSP里看到同一条前缀既有network发布又有import引入时会好奇为什么选路结果总是network那条答案就在Origin里。network命令发布的前提是路由表里已经有这条路由它代表的是我AS内部确实存在这个网段import引入则更像是我顺手把别人家的路由导进来了语义上可信度就差一截。AS_PathAS路径这是最核心的防环与选路属性。BGP在UPDATE报文中会把路由经过的每个AS记录下来形成一条路径字符串。向EBGP对等体通告时把自己的AS号追加进去收到路由时如果发现AS_Path里已经有自己的AS号直接判定环路并丢弃。这就是EBGP层面的防环机制。同时AS_Path长度是选路的重要依据——路径越短越优。这也是为什么很多运营商喜欢用AS_Path prepend技术来劝退对端流量后面实战部分会细讲。AS_Path有两种编码方式。AS_SEQUENCE表示途经AS的有序列表这是最常见的形式AS_SET表示一个无序集合一般出现在路由聚合的场景中因为聚合时会把多条路径的AS号合并成集合此时顺序不确定。在华为设备上AS_SEQUENCE显示为100 200 300这样用空格分隔的序列AS_SET则会用大括号{}括起来。排障时看到大括号基本可以判断是聚合产生的路由。Next_Hop下一跳BGP的下一跳和其他协议不一样的地方在于通告给谁就改给谁。向EBGP对等体通告路由时默认把Next_Hop改成通告者自己的接口地址向IBGP对等体通告时默认保留从EBGP学到的下一跳不变。这个设计常把新手绕晕——R1从R3学到一条EBGP路由再传给IBGP邻居R2时R2看到的是R3的地址而不是R1的地址。如果R2的IGP比如OSPF没有宣告R3的接口地址这条路由就是无效状态永远进不了IP路由表。提示这就是为什么玩HCIP实验时经常需要把IBGP邻居建在Loopback上同时保证AS内部OSPF把Loopback路由都宣告出去。Next_Hop是不是可达决定了BGP路由是否参与选路这一条永远排在选路逻辑的最前面。2.2 公认自决Local_Pref与Atomic_AggregateLocal_Pref本地优先级是公认自决属性里实战价值最大的一个。它只在AS内部传播通过IBGP通告时携带通告给EBGP对等体时会被移除。默认值是100越大越优。用途非常直观控制本AS的流量从哪个出口走。比如AS 100同时连接AS 200和AS 300我想让去往AS 200的流量从连接AS 200的链路走就给从AS 200学到的路由设置更高的Local_Pref这样本AS内所有路由器都会优先使用这条链路。在eNSP实验里最常见的方式是在IBGP入方向应用route-policy使用apply local-preference 200指定值。记住一个关键点Local_Pref是接收侧设置的属性必须在IBGP邻居收到路由的那个方向上挂策略。如果把方向搞反了在export方向设置Local_Pref对端收到后会在通告给其他IBGP邻居时携带这个值但本设备自己选路时却用不上。Atomic_Aggregate是另一个公认自决属性但基本属于通知性属性当路由器做了路由聚合聚合过程中丢失了一些原有属性时会打上这个标签通知下游这条路由的属性已经不完整了只能保证可达性。它在选路上的作用很小主要存在于UPdate报文里考试中倒是常出判断题。2.3 可选传递Community与AggregatorCommunity团体属性是可选传递属性里最有价值的一个。它本质上是给路由打的标签用4字节表示书写格式AA:NN比如100:200。AA一般用AS号NN是自定义编号。社区属性的强大之处在于它可以跨AS传递下游AS收到带社区标签的路由后可以根据标签执行不同的策略而不用逐条匹配前缀。生产网络里运营商之间经常约定私有社区比如100:100表示这条路由只在你那边生效100:666表示发布但不要广播。知名社区值必须背下来INTERNET0x00000000无限制通告给所有邻居NO_EXPORT0xFFFFFF01不传给任何EBGP对等体可以在联盟内部传递NO_ADVERTISE0xFFFFFF02不传给任何对等体包括IBGPNO_EXPORT_SUBCONFED0xFFFFFF03不传给任何EBGP对等体包括联盟外部实际排障时看到一条路由明明有去程却不可达很多人就会查社区属性是不是有人打了NO_ADVERTISE社区属性在生产环境里还有一个特殊用法——搭配route-filter做策略模板。把几十条路由打上同一社区标签下游只需要匹配一个标签就能批量执行原本需要几十条前缀策略才能完成的操作。Aggregator属性记录的是做聚合的路由器AS号和Router ID主要用于追溯这个聚合路由是谁做的排障时能派上用场但选路不起作用。它和Atomic_Aggregate通常是成对出现的——聚合者打上Aggregator表明身份同时用Atomic_Aggregate提示属性不完整。2.4 可选非传递MED、Originator_ID与Cluster_ListMED多出口鉴别度量是可选非传递属性默认值为0比较时值越小越优。它的典型用法是影响对端AS进入本AS的选路。比如AS 100通过两条链路连接AS 200我希望AS 200的流量优先从R1进来就在向R1的通告中设置较小的MED在向R2的通告中设置较大的MED由于值越小越优对端会优先选择R1。这看起来是不是和Local_Pref刚好相反Local_Pref管的是我这边从哪个出口出去MED管的是对方从哪个入口进来。MED比较有个关键坑默认情况下只有来自同一个AS的邻居路由才会比较MED。来自不同AS邻居通告的同一条前缀即使A的MED是10、B的MED是100华为设备也不会去比较而是进入下一条选路规则。所以想跨AS比较MED要去配置always-compare-med但这在跨运营商实际环境里很少用因为MED的解释权在发出方接收方默认不完全信任这个数值。Originator_ID和Cluster_List这两个属性服务于路由反射器场景。Originator_ID由反射器生成值是路由原始来源的Router ID用来防止反射器环境下的环路Cluster_List是路由经过的反射器集群ID列表同样承担防环任务。简单说IBGP原本靠全互联防环引入反射器后没法保证全互联就用这两个属性兜底。选路时Cluster_List越长说明绕的反射器越多所以越短的越优先。3. BGP选路顺序与路由控制策略实战3.1 选路决策表属性之间怎么PKBGP不是所有属性一次性比较而是有严格的优先级顺序一旦某条属性分出胜负后面规则不再执行。标准流程大致如下华为设备略有差异丢弃Next_Hop不可达的路由比较Preferred-Value华为私有类似思科的Weight越大越优比较Local_Pref越大越优本地生成路由network/import优先于从对等体学到的路由比较AS_Path长度越短越优比较OriginIGP优于EGP优于Incomplete比较MED越小越优比较路由优先级华为的preference机制IBGP默认200EBGP默认255数值越小越优所以华为默认IBGP路由比EBGP优先这与思科的EBGP优先相反比较到Next_Hop的IGP度量值越小越优如果配置了负载分担执行负载分担比较Cluster_List长度越短越优比较Router ID或Originator_ID越小越优比较对端IP地址越小越优考试会要求把整张决策表背得很熟但实际排障通常主要看前几项Preferred-Value、Local_Pref、本地路由、AS_Path、Origin、MED。绝大多数场景在MED之前就已经分出结果。第8点的华为差异值得单独说一句跨厂商组网时如果一边设备是华为一边是思科同样的拓扑、同样的路由两边选出来的主路径可能完全不同这就是协议优先级设计不同带来的。很多HCIP考生栽在这一点上。3.2 用Local_Pref控制本AS出站流量场景AS 100有两条上行链路分别连接到AS 200和AS 300。我希望默认所有去外网的流量走AS 200只有在AS 200链路故障时才走AS 300。做法在连接AS 200的边界路由器上对从AS 200学到的路由设置Local_Pref为200默认100在连接AS 300的边界路由器上保持默认Local_Pref 100。这样AS内部所有IBGP路由器都会收到这两个值决策引擎统一比较优先选择200的那条。配置示例华为eNSP环境R2连接AS 200R1是AS 100内部路由器先定义route-policyroute-policy LP_IN permit node 10 apply local-preference 200在BGP视图下挂到EBGP邻居的入方向bgp 100 peer 10.1.23.3 as-number 200 ipv4-family unicast peer 10.1.23.3 route-policy LP_IN import验证display bgp routing-table此时从AS 200邻居收到的路由LocPrf列会显示200从另一个邻居收到的是100。AS内部路由器据此统一选路。注意Local_Pref只通过IBGP在AS内部传递如果你的IBGP邻居之间没有建立会话策略根本传不到AS内部。这一步经常被忽略IBGP全互联或反射器配置没有提前做好Local_Pref策略就是一张废纸。3.3 用MED和AS_Path prepend影响入站流量入站流量的控制逻辑稍微绕一点你无法直接命令对端AS你要走我这边的链路只能通过调整通告出去的属性影响对方的选路决策。MED方式AS 100通过R1、R2两条链路连接AS 200。希望AS 200的流量优先从R1进那就让R1通告给AS 200的MED更小。比如R1上设MED 0R2上设MED 100对端比较MED时自然选择R1。这里特别容易记反——MED是越小越优和Local_Pref的越大越优正好相反。配置示例R2上设置较大的MED把流量往R1方向引导R1保持默认0route-policy MED_OUT permit node 10 apply cost 100BGP视图bgp 100 peer 10.1.23.3 as-number 200 ipv4-family unicast peer 10.1.23.3 route-policy MED_OUT exportAS_Path prepend方式向对端通告时在自己的AS_Path里反复追加自己的AS号让路径变长。对端比较AS_Path长度时就会避开这条变长的路径。例如route-policy ASPATH_OUT permit node 10 apply as-path 100 100 additive这条命令会在原有AS_Path上追加两个100加上原有的一个100对端看到的路径就是100 100 100绕远路的感觉一下就出来了。实战对比一下两种方式MED修改简单但对端不一定信任、不一定参与比较AS_Path prepend生效直接但会让路由表的路径字段变长。生产环境里通常组合使用而且要和对端AS提前约定好策略口径否则你在出口改了MED对方入口没有开启对应比较策略等于白改。3.4 用Community做批量标记与过滤社区属性的实战价值在于批量。假设AS 100需要向AS 200通告几十条路由其中一部分是普通用户网段一部分是数据中心网段。AS 200希望针对数据中心网段执行不同的入站策略比如给更高的Local_Pref如果逐条写前缀匹配策略几十条下来会非常痛苦。更好的办法是AS 100在通告时给数据中心网段打上社区标签100:888AS 200只需要匹配这个社区标签一条策略搞定全部。AS 100配置route-policy COMM_OUT permit node 10 if-match ip-prefix DC_NET apply community 100:888 additiveBGP视图bgp 100 peer 10.1.23.3 as-number 200 ipv4-family unicast peer 10.1.23.3 route-policy COMM_OUT exportAS 200验证display bgp routing-table community 100:888如果查出来的路由正好是那批数据中心网段说明标签生效。提示Community在华为设备上默认是传递的——收到后原样转发给下游。某些场景需要清空社区比如去往对方的私网路由不希望再往互联网广播可以用apply community delete或者在邻居方向调整community传递策略精确控制谁能看到这些标签。4. 华为eNSP环境搭建与BGP配置全流程4.1 实验拓扑与规划我在eNSP里搭过很多次BGP实验给新手一个参考拓扑三台路由器R1、R2、R3R1和R2在AS 100R2和R3在AS 200R1和R2之间跑OSPF保证IGP连通同时建立IBGPR2和R3之间是EBGP。这个拓扑同时覆盖了IBGP、EBGP、OSPF与BGP联动三个关键点。如果你手头设备够也可以在R2上再挂一台AS 300的R4就能演示双出口场景下的Local_Pref流量调度。规划信息表设备ASLoopback接口地址角色R11001.1.1.1/32GE0/0/0: 10.1.12.1/24IBGP对等体R21002.2.2.2/32GE0/0/0: 10.1.12.2/24GE0/0/1: 10.1.23.2/24IBGPEBGPR32003.3.3.3/32GE0/0/0: 10.1.23.3/24EBGP对等体R1上通过network发布一条10.1.1.0/24用户网段R1和R2的Loopback以及直连网段都宣告进OSPF。这里有个容易被忽略的细节R3的Loopback不需要宣告进R1R2的OSPF因为R3在AS 200R1R2只需要保证AS 100内部的IBGP下一跳可达就行。4.2 基础BGP配置与路径属性验证R1配置sysname R1 interface LoopBack0 ip address 1.1.1.1 32 interface GigabitEthernet0/0/0 ip address 10.1.12.1 24 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 10.1.12.0 0.0.0.255 bgp 100 router-id 1.1.1.1 peer 2.2.2.2 as-number 100 ipv4-family unicast network 10.1.1.0 255.255.255.0 peer 2.2.2.2 enableR2配置sysname R2 interface LoopBack0 ip address 2.2.2.2 32 interface GigabitEthernet0/0/0 ip address 10.1.12.2 24 interface GigabitEthernet0/0/1 ip address 10.1.23.2 24 ospf 1 router-id 2.2.2.2 area 0.0.0.0 network 2.2.2.2 0.0.0.0 network 10.1.12.0 0.0.0.255 bgp 100 router-id 2.2.2.2 peer 1.1.1.1 as-number 100 peer 10.1.23.3 as-number 200 ipv4-family unicast peer 1.1.1.1 enable peer 10.1.23.3 enableR3配置sysname R3 interface LoopBack0 ip address 3.3.3.3 32 interface GigabitEthernet0/0/0 ip address 10.1.23.3 24 bgp 200 router-id 3.3.3.3 peer 10.1.23.2 as-number 100 ipv4-family unicast peer 10.1.23.2 enable配完先检查邻居状态display bgp peer状态应该是Established。然后在R3上查看学习到的路由display bgp routing-table你会看到10.1.1.0/24下一跳是10.1.23.2因为EBGP通告给R3时R2把下一跳改成了自己的接口地址AS_Path显示100Origin显示i。关键点来了R2从R1学习IBGP路由时下一跳是1.1.1.1R1的Loopback。R2要能到达1.1.1.1靠的是OSPF。如果OSPF没配好R2上这条路由就是无效状态。这是个非常经典的排障入口——BGP邻居都建起来了但路由不优先别怀疑策略查一下下一跳通不通。4.3 路由控制策略完整配置与验证在这个拓扑上做Local_Pref实验在R2上对从R3学到的路由设置Local_Pref为200然后观察R1收到的路由。route-policy LP_IN permit node 10 apply local-preference 200bgp 100 peer 10.1.23.3 as-number 200 ipv4-family unicast peer 10.1.23.3 route-policy LP_IN import在R1验证display bgp routing-table 10.1.1.0可以看到LocPrf列已经是200。如果R2还有第二个EBGP出口另一条路径保持默认100R1就会明确选择这条200的路径。接着做MED实验R2向R3通告路由时设置MED为50。route-policy MED_OUT permit node 10 apply cost 50bgp 100 peer 10.1.23.3 as-number 200 ipv4-family unicast peer 10.1.23.3 route-policy MED_OUT export在R3查看display bgp routing-table 10.1.1.0MED列应该显示50。这里要说明一下单出口拓扑下只能验证MED值是否传过去了看不到真正的选路变化。要想看到MED对选路的影响需要R3连接AS 100的多个边界设备形成多归属组网。社区实验继续顺着做R2通告时打100:888route-policy COMM_OUT permit node 10 if-match ip-prefix DC_NET apply community 100:888 additivebgp 100 peer 10.1.23.3 as-number 200 ipv4-family unicast peer 10.1.23.3 route-policy COMM_OUT export在R3上用display bgp routing-table community 100:888能看到对应的路由说明社区标签跨AS传过去了。整个过程在eNSP里完全跑得通不需要真实设备属性变化却看得清清楚楚。5. 常见问题与排障实录5.1 Next_Hop不可达最经典的路由无效问题现象在R2上执行display bgp routing-table看到10.1.1.0/24这条路由但状态列没有*路由始终不进IP路由表。原因IBGP学到的路由Next_Hop是R1的Loopback地址1.1.1.1R2的OSPF没宣告该网段IGP不可达。排查先执行display bgp routing-table 10.1.1.0看Next_Hop再用display ip routing-table 1.1.1.1确认有没有到下一跳的路由。解决在R1和R2的OSPF里宣告Loopback地址或者确保AS内部IGP能路由到所有BGP下一跳。这个坑我在eNSP里帮人排查过无数回十次BGP路由不优八次是下一跳问题。5.2 AS_Path与环路为什么我的路由被丢掉现象EBGP对等体之间状态正常但一边的路由始终无法学到或者时通时断。原因路由的AS_Path里出现了本AS的AS号被防环机制丢弃。最常见于双归属组网或路由聚合场景。排查display bgp routing-table查看对端路由的AS_Path列看是否反复出现同一个AS号。解决如果是双归属导致的问题检查是否需要配置peer allow-as-loop如果是聚合问题重新设计聚合方案避免把本AS号聚合进去。有些朋友会问能不能用as-path-filter限制AS_Path长度这是可以的但定位环路问题的第一步永远是先确认AS_Path内容。5.3 MED比较的坑跨AS、默认值和方向现象配置了MED控制入站流量但对端选路结果和预期不一致。可能原因有三个。第一比较方向理解反了——MED越小越优想让流量走R1R1的MED必须比R2小。第二跨AS的MED默认不比较——来自不同AS的邻居通告的同一条路由华为默认不去比较MED。第三对端设备对MED的信任策略不同——有些运营商干脆忽略MED。排查方法先display bgp routing-table 目标前缀确认MED值是否真的传过去了再看对端是否有多个入口路径。解决确保MED值按小优先思路配置跨AS场景评估是否启用always-compare-med如果对端忽略MED改用AS_Path prepend。5.4 Community属性没生效现象打了community标签对端查不到。常见原因第一方向挂反了export方向才是给对端的import方向是给自己的。第二没有使用additive参数把原有community覆盖了。第三对端没有开启接收community的过滤能力。排查在发出方display bgp routing-table 目标前缀查看Community字段是否存在在对端检查邻居是否启用了community传递。解决确认方向补additive参数必要时display bgp routing-table community-filter检查过滤器本身写得对不对。5.5 排障命令速查表问题类型关键命令关注点邻居状态display bgp peerState是否为Established路由是否有效display bgp routing-table状态列是否有*属性明细display bgp routing-table 前缀Next_Hop、AS_Path、MED、LocPrf、Community下一跳可达性display ip routing-table 地址IGP路由是否存在策略是否生效display bgp routing-table策略方向、值是否符合预期收到哪些路由display bgp routing-table peer 地址邻居方向的路由明细排障顺序建议先看邻居再看下一跳再看属性最后查策略方向。顺序反了容易绕进死胡同——策略写得再漂亮邻居状态Down或者下一跳不通一切免谈。最后聊点实操体会。BGP路径属性这个东西刚开始学的时候觉得就是一堆考试名词后来在生产环境里真刀真枪排了几次选路异常才明白属性的价值全在组合上——单个属性解决不了复杂场景Local_Pref管出站、MED和AS_Path prepend管入站、Community做批量标记配合起来才是一套完整的流量调度方案。建议新手在eNSP上把OSPF和BGP联动练熟尤其是Next_Hop在IBGP和EBGP之间的变化机制这是理解BGP选路的第一块基石。我自己当年就是卡在这一块后来在模拟器里反复改了十几次OSPF配置看着路由状态从无效变成最优才算真正开了窍。
返回列表