BGP配置实战指南:从基础配置到策略安全与排错
1. 先把BGP这件事聊透它到底在解决什么问题刚接触网络工程那会儿我对BGP的印象就俩字——玄学。OSPF配完邻居就起来路由表里该有的都有BGP配完邻居也起来了路由表里却空空如也排查半天发现是忘了写network宣告。后来项目做多了才明白BGP本身不复杂复杂的是它背后那套“选路逻辑”和“策略思维”。这篇内容我就按一线实操的顺序把BGP的基本配置从头到尾捋一遍包括我踩过的坑、参数怎么算、邻居起不来怎么查尽量让你看完就能在自己的实验环境里跑通。先说清楚BGP是什么。BGPBorder Gateway Protocol边界网关协议是一种运行在自治系统AS之间的外部网关协议当前主流版本是BGP-4。它最核心的职能是在AS之间交换路由可达性信息并依靠一套丰富的路径属性来做选路决策。和OSPF、IS-IS这类内部网关协议不同BGP不关心链路带宽、不跑SPF算法它更像一个“路由策略执行器”——把哪些路由告诉谁、优先走哪条路全靠属性加策略来控制。那它解决什么问题举个生活化的类比OSPF像是公司内部各部门之间共享文件大家在一个楼里谁离得近走谁BGP则像是几家不同公司之间的商务合作签不签合同、走哪条合作通道、优先级怎么排都得按商业规则来谈。跨AS的路由交换必须有一套能承载策略、能过滤、能聚合的机制BGP就是干这个的。适合谁来参考这篇内容我的定位是已经掌握静态路由和至少一种IGP比如OSPF准备上手BGP配置的网络工程师或备考者。如果你连AS、邻居、路由宣告这些概念都没接触过建议先把IGP跑通再回来不然BGP的属性体系会让你一头雾水。下面所有配置我都以通用命令行风格呈现具体厂商的语法差异我会在关键处点出来你按自己设备的实际情况微调即可。2. 配置前的整体设计与思路拆解2.1 为什么BGP配置要“先设计后敲命令”很多人学BGP的习惯是打开模拟器直接敲命令邻居起来了就以为学会了。但真实项目里BGP配置的80%工作量在设计阶段AS号怎么规划、邻居用物理口还是环回口、宣告哪些网段、要不要做路由聚合、入方向和出方向分别加什么策略。这些想不清楚命令敲得再熟也是白搭。我一般的顺序是先画拓扑定AS边界再定邻居关系类型IBGP还是EBGP然后规划宣告网段和聚合策略最后才落到具体命令。这个顺序不能反因为BGP的配置是强依赖拓扑设计的——你邻居类型定错了后面的策略全得推倒重来。2.2 IBGP与EBGP的选型逻辑BGP邻居分两类这个必须一开始就分清EBGP外部BGP不同AS之间的邻居。默认情况下EBGP邻居的TTL是1也就是说通常要求直连或者用多跳配置。EBGP传递路由时会修改下一跳为自身地址。IBGP内部BGP同一AS内部的邻居。IBGP有个著名规则叫水平分割——从IBGP邻居学到的路由不会再传给其他IBGP邻居。这就导致AS内部如果有多台BGP路由器必须做全互联或者用路由反射器/联邦来解决。选型的核心考量是跨AS用EBGPAS内用IBGP。但IBGP的全互联在设备多的时候是灾难N台设备需要N(N-1)/2条邻居关系所以实际项目里超过三四台BGP路由器基本都会上路由反射器。这个决策点我在设计阶段就会定下来因为它直接影响邻居配置的数量和后续维护成本。2.3 邻居地址用物理口还是环回口这是个高频争议点。我的经验是EBGP优先用物理接口地址IBGP优先用环回口地址。EBGP用物理口的原因很直接——EBGP默认TTL为1用环回口需要额外配多跳而且跨AS的物理链路本身就是边界用物理口地址语义清晰。IBGP用环回口的原因则是稳定性环回口只要设备活着就不会down物理口一抖邻居就断BGP重新收敛的代价比IGP大得多。当然用环回口建IBGP邻居的前提是底层IGP已经把环回口地址打通了并且要配update-source指定更新源。提示IBGP用环回口建邻居时别忘了在邻居配置里指定更新源接口否则默认用出接口地址发起连接对端回包对不上邻居卡在Active或Connect状态。2.4 宣告网段的方式选择BGP把路由放进BGP表有两种方式network宣告和重分发redistribute。这两者的区别值得单独说。network命令的本质是检查本地路由表里是否存在这条精确匹配的路由存在才放进BGP。它不产生新路由只是“搬运”。redistribute则是把某种协议的路由批量导入BGP。我的建议是直连网段和需要精确控制的网段用network大量IGP路由需要引入时用redistribute配合路由策略。纯用redistribute容易把不该宣告的路由带出去尤其是做跨境或跨运营商对接时一条多余的路由都可能引发问题。3. 核心细节解析与实操要点3.1 AS号规划别随手填个65001AS号分公有和私有。公有AS由权威机构分配私有AS范围是64512–6553416位以及4200000000–429496729432位。实验环境和内部网络一律用私有AS这个没得商量。规划时要注意两点一是同一个AS内所有BGP路由器的AS号必须一致这个看似废话但我见过有人两台设备填了不同AS号还纳闷为什么IBGP邻居起不来二是EBGP对接双方的AS号必须不同如果两边填了一样的AS号BGP会直接拒绝建邻居这叫AS号冲突检测。3.2 邻居配置的关键参数一条完整的BGP邻居配置核心参数就这几个参数作用常见取值/注意点邻居地址指定对端EBGP用物理口IBGP用环回口远端AS号声明对端所属AS必须与对端实际AS一致更新源指定发起连接的源地址IBGP用环回口时必配多跳允许非直连建邻居EBGP跨设备时配IBGP一般不需要认证防止非法邻居两端必须一致定时器keepalive/hold时间默认60s/180s跨广域可适当放宽这里重点说更新源和多跳。IBGP用环回口建邻居本端发起TCP连接时源地址默认是出接口地址而对端邻居配的是你的环回口地址回包时对不上连接就建不起来。配了update-source loopback0之后源地址变成环回口问题解决。EBGP如果非直连比如中间隔了台设备需要配ebgp-multihop跳数按实际路径算别随手填个255。3.3 路由宣告与聚合的细节宣告网段时network后面跟的掩码必须和路由表里完全一致。比如路由表里是192.168.1.0/24你写network 192.168.1.0 mask 255.255.255.0没问题但如果你写network 192.168.0.0 mask 255.255.0.0除非路由表里真有这条聚合路由否则宣告不生效。这是新手最常见的“邻居起来了但路由没传过去”的原因。聚合方面BGP支持自动聚合和手动聚合。自动聚合在老版本里默认开启会把子网聚成主类网络这个行为在现代网络里基本是灾难建议一律关掉。手动聚合用aggregate-address可以配合summary-only只发聚合路由、抑制明细也可以配合suppress-map精细控制哪些明细不发。我的习惯是对外宣告尽量聚合对内保留明细既减小路由表规模又不丢失内部转发精度。3.4 一个容易被忽略的点下一跳可达性BGP路由能不能进路由表一个硬性条件是下一跳必须可达。EBGP传递路由时会把下一跳改成自己这个一般没问题但IBGP传递从EBGP学来的路由时默认不修改下一跳如果AS内部其他路由器没有到那个外部下一跳的路由这条BGP路由就是“有效但不优”进不了路由表。解决办法有两个一是在边界路由器上配next-hop-self让发给IBGP邻居的路由下一跳改成自己二是确保AS内部IGP能到达外部下一跳。我一般用前者干净利落。4. 实操过程与核心环节实现4.1 实验拓扑与地址规划为了把配置讲清楚我搭一个最小可用的拓扑两个ASAS 65001里两台路由器R1、R2AS 65002里一台R3。R1和R3之间跑EBGPR1和R2之间跑IBGP。R2的环回口网段需要通过BGP传给R3。地址规划如下R1物理口10.0.1.1/24连R2物理口10.0.12.1/24连R3环回口1.1.1.1/32R2物理口10.0.1.2/24连R1环回口2.2.2.2/32R3物理口10.0.12.3/24连R1环回口3.3.3.3/32AS内部先跑OSPF打通环回口这个前提不能省否则IBGP用环回口建邻居起不来。4.2 基础配置IGP先跑通以R1为例OSPF配置大致如下通用风格router ospf 1 network 10.0.1.0 0.0.0.255 area 0 network 1.1.1.1 0.0.0.0 area 0R2同理宣告10.0.1.0/24和2.2.2.2/32。配完确认R1能ping通2.2.2.2这是IBGP建邻居的前提。这一步我见过太多人跳过结果IBGP邻居一直Active回头查半天发现是底层不通。4.3 EBGP邻居配置R1连R3属于不同AS配EBGProuter bgp 65001 neighbor 10.0.12.3 remote-as 65002R3侧对称配置router bgp 65002 neighbor 10.0.12.1 remote-as 65001配完用show bgp summary或对应厂商的邻居状态命令看状态正常应该到Established。如果卡在Idle、Active、Connect排查顺序是物理口通不通、ACL有没有挡TCP 179、AS号填对没有、认证配没配一致。4.4 IBGP邻居配置R1连R2同属AS 65001用环回口建邻居router bgp 65001 neighbor 2.2.2.2 remote-as 65001 neighbor 2.2.2.2 update-source Loopback0R2侧router bgp 65001 neighbor 1.1.1.1 remote-as 65001 neighbor 1.1.1.1 update-source Loopback0这里update-source是关键不配的话源地址是物理口对端邻居地址是环回口TCP握手对不上。配完确认状态Established。4.5 路由宣告与下一跳处理R2要把自己的环回口网段传给R3先在R2上宣告router bgp 65001 network 2.2.2.2 mask 255.255.255.255这条路由会通过IBGP传给R1R1再通过EBGP传给R3。但问题来了R1从R2学到的路由下一跳是2.2.2.2R1传给R3时EBGP会改下一跳为10.0.12.1这个没问题。反过来R3的路由传给R1R1再传给R2时IBGP默认不改下一跳R2看到的下一跳是R3的地址10.0.12.3而R2的IGP里没有这条路由路由就进不了R2的路由表。解决方式是在R1上对IBGP邻居配next-hop-selfrouter bgp 65001 neighbor 2.2.2.2 next-hop-self这样R1发给R2的路由下一跳改成1.1.1.1R2通过OSPF能到达路由正常生效。4.6 验证与结果确认配置完成后按这个顺序验证show bgp summary确认所有邻居Establishedshow bgp看BGP表里有没有预期路由重点看下一跳和AS_PATHshow ip route确认BGP路由进了路由表前面有B标记从R2 ping R3的环回口3.3.3.3通就说明端到端转发正常。我实测这套最小拓扑从零配置到全通大概15分钟前提是IGP先跑通。如果哪一步不通按下一节的排查表逐项对。5. 常见问题与排查技巧实录5.1 邻居起不来的排查速查表BGP邻居状态卡住是最常见的问题我整理了一张速查表按状态对号入座邻居状态可能原因排查动作Idle没有发起连接路由不可达检查邻居地址是否可达ACL是否放行179ConnectTCP连接未完成检查物理链路、中间设备是否放行TCP 179Active发起连接但被拒绝或超时检查对端是否有对应邻居配置、AS号是否匹配OpenSent已发Open但未收到回应检查对端AS号、BGP版本、认证OpenConfirm收到Open等待Keepalive检查定时器是否匹配、MTU是否一致Established正常若路由不通转查路由宣告和下一跳这张表我贴在工位上用了好几年90%的邻居问题都能定位到。5.2 邻居起来了但路由没传过去这个问题的排查顺序我总结为“三看”一看宣告network的掩码和路由表是否精确匹配。我踩过最坑的一次是路由表里是/24我宣告写了/16死活不生效查了半小时。二看策略入方向或出方向有没有配filter、route-map、prefix-list把路由挡了。BGP的策略是逐邻居生效的很容易配了一条忘了另一条。三看下一跳前面说的下一跳可达性问题IBGP场景下尤其常见next-hop-self该配就配。5.3 路由震荡与定时器调优BGP默认keepalive 60秒、hold 180秒。跨广域链路时如果链路质量一般邻居可能频繁震荡。我的做法是适当放宽定时器比如keepalive 30、hold 90但不要放得太宽否则真断了发现得也慢。另外BGP有惩罚机制dampening路由反复震荡会被抑制这个在稳定网络里建议关掉避免正常的路由抖动被误伤。5.4 几个我踩过的实操坑第一个坑忘了关自动聚合。老设备默认开启宣告的明细路由被聚合成主类网络对端看到的路由和你预期完全不一样。现在新版本默认关闭但接手老设备时一定要确认。第二个坑IBGP全互联没做全。三台路由器只配了两条邻居第三台收不到路由排查半天发现是水平分割规则。设备一多就上路由反射器别硬扛全互联。第三个坑EBGP多跳忘了配。跨设备建EBGP邻居TTL默认1包到中间设备就丢了邻居一直Active。配ebgp-multihop时跳数按实际路径算别图省事填大值。注意BGP配置改动后建议先在实验环境验证策略效果尤其是出方向的filter和route-map配错了可能直接把路由全断掉生产环境回滚成本很高。6. 策略与安全让BGP配置真正可用6.1 为什么裸配BGP是危险的基础配置跑通只是第一步。真实网络里BGP邻居之间如果不加任何策略等于把自家路由表完全暴露给对方对方发什么你都收你发什么对方都收。这在跨组织对接时是绝对不允许的。BGP的安全边界靠策略来划入方向过滤防止收到伪造路由出方向过滤防止泄露内部路由。6.2 用prefix-list做路由过滤最常用的过滤工具是prefix-list。比如只允许向EBGP邻居宣告特定网段ip prefix-list TO_EBGP seq 10 permit 2.2.2.0/24 router bgp 65001 neighbor 10.0.12.3 prefix-list TO_EBGP out入方向同理只接收对方合法网段。prefix-list比ACL更适合做路由过滤因为它能精确匹配掩码长度范围比如ge 24 le 24表示只匹配/24。6.3 最大前缀数限制防路由泄露的保险丝maximum-prefix这个参数我强烈建议每个EBGP邻居都配上。它的作用是限制从某个邻居接收的路由条数超过阈值就告警或直接断邻居。这相当于给BGP加了一根保险丝防止对端配置错误导致海量路由灌进来把设备打挂。阈值按对端正常路由量的1.2到1.5倍设置比如对端正常发100条设120到150。6.4 认证与TTL安全BGP邻居之间配TCP MD5认证能防止非法设备冒充邻居建连。配置很简单两端配一样的密钥即可。另外EBGP可以配ttl-security强制检查报文的TTL值防止远端伪造的BGP报文。这两个措施在跨组织对接时基本是标配。7. 从实验到生产我的几点经验体会实验环境跑通和 production ready 之间还有一段距离。我在实际项目里最大的体会是BGP配置的可维护性比功能实现更重要。邻居描述、策略命名、注释这些看似琐碎的东西在半年后回头看或者交接给同事时价值巨大。我现在配BGP每个邻居必写description每条prefix-list必带语义化命名route-map的每个节点都写注释说明用途。另一个体会是变更前先备份、变更后先验证。BGP的策略改动影响面大我习惯改之前把当前配置和路由表导一份改完立刻对比路由条目数有没有异常变化。有一次出方向filter少写了一条permit差点把一条关键路由断掉幸亏改完马上查了BGP表发现条目数不对五分钟内回滚。最后说个扩展方向基础配置跑通后值得深入的是路由反射器和BGP选路属性weight、local-preference、MED、AS_PATH。选路这块是BGP真正的精髓也是面试和实战的高频考点。我个人的学习路径是先把手动选路local-preference和MED玩熟再去看路由反射器的设计循序渐进比一上来啃RFC效率高得多。