备考HCIP数通,最怕的不是题库里那些选择题,而是拿到一张拓扑图,突然不知道往设备里敲什么。这个行当说的"代码",指的就是华为VRP平台上一行行配置命令。这期HCIP代码小练,我重点练BGP路由控制,在eNSP里搭了一张跨AS实验拓扑,把OSPF、IBGP/EBGP邻居、ip-prefix过滤、route-policy改属性这几个环节完整跑了一遍。整个过程从规划到排错都记在这里,给正在啃HCIP或者日常要碰华为设备的兄弟一份能直接照着敲的参考。
1. 练前准备:拓扑、工具与IP规划
1.1 为什么配置命令要单独练
很多人备考HCIP有个误区,觉得OSPF、BGP的原理懂了,选择题能做对,实验就没问题。真到动手的时候,原理和命令之间隔着一条鸿沟。BGP的邻居关系、路由通告、属性传递这些机制,光在书上看是记不牢的,必须自己在设备上把命令敲一遍,再看一下display输出的路由表状态,才会对"协议怎么工作"有实感。
我一般会在eNSP里搭一套固定的练手拓扑,每次练习就在这套拓扑上加新需求。这样省去反复搭环境的成本,而且同一套拓扑跑不同控制策略,对比效果非常直观。这次用的还是AR3260做路由器,设备内存开满了四台,跑起来不卡,CPU占用也正常。AR2220也能用,只是接口编号和部分特性支持上有细微差别,不影响这个实验。
1.2 本次实验拓扑与地址规划
这次的核心场景是模拟一个跨AS的路由交换环境,AS100内部有两台路由器跑OSPF加IBGP,AS200有两台路由器,分别通过EBGP接到AS100的一台设备上,形成双入口。
IP规划如下表:
| 设备 | 接口 | IP地址 | 说明 |
|---|---|---|---|
| R1 | GE0/0/0 | 10.0.12.1/24 | 连接R2 |
| R1 | LoopBack0 | 10.0.1.1/32 | OSPF Router-ID及IBGP源地址 |
| R1 | LoopBack1 | 172.16.1.1/24 | 模拟业务网段A |
| R1 | LoopBack2 | 172.16.2.1/24 | 模拟业务网段B |
| R1 | LoopBack3 | 172.16.3.1/24 | 模拟业务网段C |
| R2 | GE0/0/0 | 10.0.12.2/24 | 连接R1 |
| R2 | GE0/0/1 | 10.0.23.2/24 | 连接R3 |
| R2 | GE0/0/2 | 10.0.24.2/24 | 连接R4 |
| R2 | LoopBack0 | 10.0.2.2/32 | OSPF Router-ID及IBGP源地址 |
| R3 | GE0/0/0 | 10.0.23.3/24 | 连接R2 |
| R3 | GE0/0/1 | 10.0.34.3/24 | 连接R4 |
| R3 | LoopBack0 | 10.0.3.3/32 | Router-ID |
| R4 | GE0/0/0 | 10.0.24.4/24 | 连接R2 |
| R4 | GE0/0/1 | 10.0.34.4/24 | 连接R3 |
| R4 | LoopBack0 | 10.0.4.4/32 | Router-ID |
AS划分是这样的:R1和R2属于AS100,R3和R4属于AS200。R1-R2之间跑OSPF Area 0,同时建立IBGP;R2-R3、R2-R4之间各建一条EBGP;R3-R4之间建IBGP。这样一来,R1上三条业务网段通告进BGP后,AS200那边就能通过R2这个出口收到两份相同前缀、不同路径的路由,后续做路由控制就有得玩了。
2. 第一步:把OSPF和BGP邻居关系跑起来
2.1 OSPF基础配置
R1和R2之间的OSPF是整个实验的底层路由基础。BGP在通告network时,要求路由表中必须先存在对应前缀的路由,所以底层IGP必须先把路由打通。这里用OSPF承载AS100内部路由。
先配R1:
system-view sysname R1 interface GigabitEthernet0/0/0 ip address 10.0.12.1 24 interface LoopBack0 ip address 10.0.1.1 32 interface LoopBack1 ip address 172.16.1.1 24 interface LoopBack2 ip address 172.16.2.1 24 interface LoopBack3 ip address 172.16.3.1 24 ospf 1 router-id 10.0.1.1 area 0.0.0.0 network 10.0.12.0 0.0.0.255 network 10.0.1.1 0.0.0.0 network 172.16.1.0 0.0.0.255 network 172.16.2.0 0.0.0.255 network 172.16.3.0 0.0.0.255这里有个非常容易错的地方:OSPF的network命令用的是通配符掩码,不是子网掩码。172.16.1.0 0.0.0.255表示匹配172.16.1.0/24这个网段,写成255.255.255.0就错了,设备会直接报错,这是新手最常见的问题。
R2的OSPF配置对称即可:
system-view sysname R2 interface GigabitEthernet0/0/0 ip address 10.0.12.2 24 interface GigabitEthernet0/0/1 ip address 10.0.23.2 24 interface GigabitEthernet0/0/2 ip address 10.0.24.2 24 interface LoopBack0 ip address 10.0.2.2 32 ospf 1 router-id 10.0.2.2 area 0.0.0.0 network 10.0.12.0 0.0.0.255 network 10.0.2.2 0.0.0.0配置完检查一下邻居状态:
display ospf peer brief正常会看到R1和R2互相出现在邻居表里,State是Full。如果卡在Init或者ExStart,多半是区域ID不一致、通配符写错、或者接口没有加入正确区域,从这几方面查。
2.2 BGP邻居配置与next-hop-local
OSPF起来之后,开始建BGP邻居。AS100内部R1和R2建IBGP,IBGP通常用LoopBack地址作为更新源,避免物理链路down掉影响邻居关系。
R1的BGP配置:
bgp 100 router-id 10.0.1.1 peer 10.0.2.2 as-number 100 peer 10.0.2.2 connect-interface LoopBack0 ipv4-family unicast network 172.16.1.0 24 network 172.16.2.0 24 network 172.16.3.0 24 peer 10.0.2.2 enableR2的BGP配置:
bgp 100 router-id 10.0.2.2 peer 10.0.1.1 as-number 100 peer 10.0.1.1 connect-interface LoopBack0 ipv4-family unicast peer 10.0.1.1 enable这里有两个关键点。第一,用LoopBack建IBGP邻居,必须配置connect-interface LoopBack0,否则设备会用出接口地址作为TCP源地址,而邻居期望的源地址是LoopBack0,邻居就起不来。第二,R2向IBGP邻居R1通告路由时,默认会把下一跳指向自己,但如果R1收到的BGP路由下一跳是10.0.2.2,R1的路由表里如果没有到10.0.2.2的路由,这条BGP路由就不能变成最优路由。
解决方法是在R2上给IBGP邻居配置next-hop-local:
bgp 100 ipv4-family unicast peer 10.0.1.1 next-hop-local等等,next-hop-local其实是IBGP场景下默认对EBGP学习的路由生效的行为配置吗?这里我建议直接用最稳妥的写法:在R2上对IBGP邻居显式配置peer 10.0.1.1 next-hop-local,确保R1收到的BGP路由下一跳是R2的LoopBack地址,而R1恰好有OSPF学习到的10.0.2.2/32路由,下一跳可达,路由才能优选。
验证命令是三件套:
display bgp peer display bgp routing-table display ip routing-table protocol bgp邻居状态看Established,路由表里看前缀前面的符号,>表示最优路由,*表示有效路由。如果看到前缀没有>标记,后面十有八九是next-hop不可达。
3. 第二步:用ip-prefix和route-policy做前缀过滤
3.1 ip-prefix的语法细节
AS100的R1通告了三条业务网段:172.16.1.0/24、172.16.2.0/24、172.16.3.0/24。如果需求突然变了,AS200只允许接收前两个网段,第三个必须拦掉,怎么实现?最干净的做法是在AS200入口设备R3上做入方向过滤。
先写前缀列表,控制匹配的对象:
ip ip-prefix PL-ALLOW index 10 permit 172.16.1.0 24 ip ip-prefix PL-ALLOW index 20 permit 172.16.2.0 24 ip ip-prefix PL-ALLOW index 30 deny 0.0.0.0 0 less-equal 32细说ip-prefix的规则。index是匹配顺序,按从小到大逐一匹配,命中即停,不再往下走。第三条deny 0.0.0.0 0 less-equal 32是一条兜底规则,匹配所有IPv4路由并拒绝。因为ip-prefix默认末尾隐藏了一条deny all,其实不写也能达到效果,但显式写出来有两个好处:一是自己看着清楚,二是方便以后在中间插入其他规则时不容易搞混。
less-equal 32的意思在这个场景里其实是"允许掩码长度从0到32",配合0.0.0.0 0就是匹配一切。如果只想精确匹配某一条路由,就写permit 172.16.1.0 24,它默认只匹配掩码正好是24的这条。想匹配172.16.1.0/24及其子网,就写172.16.1.0 24 greater-equal 24 less-equal 32,这在汇总场景里非常常用。
3.2 route-policy的调用与生效机制
光有前缀列表还不够,BGP不会直接认ip-prefix,要通过route-policy把它包一层,再挂到peer上。
R3上这样配置:
route-policy RP-IN permit node 10 if-match ip-prefix PL-ALLOW route-policy RP-IN deny node 20这个route-policy的逻辑是:node 10先匹配PL-ALLOW,命中就放行;没命中就跳到node 20,无条件拒绝。因为route-policy每个node自带一个默认deny于末尾,所以node 20其实可以不写,但我习惯显式写出来,逻辑更完整。
挂到邻居上:
bgp 200 ipv4-family unicast peer 10.0.23.2 route-policy RP-IN import调用方向是import,意思是R3从邻居10.0.23.2收到的路由,进路由表之前先过这个策略。验证方法:
display bgp routing-table正常情况下能看到172.16.1.0/24和172.16.2.0/24,172.16.3.0/24已经消失。如果想确认策略确实生效了,可以看它的统计:
display route-policy或者临时把策略删掉,再用reset bgp all软重置会话,路由就全回来了。我每次调策略都习惯反复"挂载-检查-撤销-再检查",确认不是别的因素导致路由缺失。
注意:修改route-policy后,BGP不会自动重新过滤已经收到的路由,必须执行
refresh bgp all import或者reset bgp all才会重新执行策略。eNSP里reset最省事,但生产环境慎用,会造成会话中断,优选refresh。
4. 第三步:路径属性控制实战
4.1 local-preference控制选路
过滤只是路由控制的入门,属性控制才是HCIP BGP的重点。AS200有R3和R4两个入口,AS100通过R2把同一批路由分别通告给R3和R4,那AS200内部路由器最终怎么选路?默认情况下,来自EBGP的路由Local Preference是100,两边一样,接下来比AS路径长度,也差不多,最后会走到Router-ID等更细的比较。这种"自然选择"往往不如我们想要的精确,得用属性干预。
比如需求:AS200内部所有路由器访问172.16.1.0/24时,优先走R3这边。
在R3入方向,针对这个网段把Local Preference抬高:
route-policy RP-LP permit node 10 if-match ip-prefix PL-LP apply local-preference 300 route-policy RP-LP permit node 20 ip ip-prefix PL-LP index 10 permit 172.16.1.0 24 bgp 200 ipv4-family unicast peer 10.0.23.2 route-policy RP-LP importR4那边保持默认100。BGP选路时Local Preference值越高越优,所以AS200内部所有路由器都会优选从R3学来的那条172.16.1.0/24。注意这个属性只在AS内部传递,R3通过IBGP通告给R4时,Local Preference会保留,但不会传给AS100的R2。
验证命令:
display bgp routing-table 172.16.1.0输出里能看到两条路径,一条next-hop是10.0.23.2,LocalPref是300,带>最优标记;另一条next-hop是10.0.24.4,LocalPref是100。
4.2 MED和AS-Path的实战对比
Local Preference是影响"别人怎么选",MED则是影响"对方AS怎么选"。通俗讲,本地优先级是"我说了算",MED是"我求着你选我"。
再添加一个需求:R2希望AS200在访问172.16.2.0/24时,优先选择经过R3这条链路,怎么办?因为R2是AS100的设备,MED属性可以跨AS传递,R2可以在向R3通告这条路由时设置一个较小的MED,向R4通告时设置一个较大的MED,这样R3和R4收到后在比较来自同一邻居AS的路由时,MED值小的路径胜出。
R2上配置:
route-policy RP-MED-TO-R3 permit node 10 if-match ip-prefix PL-MED apply cost 50 route-policy RP-MED-TO-R4 permit node 10 if-match ip-prefix PL-MED apply cost 200 ip ip-prefix PL-MED index 10 permit 172.16.2.0 24 bgp 100 ipv4-family unicast peer 10.0.23.3 route-policy RP-MED-TO-R3 export peer 10.0.24.4 route-policy RP-MED-TO-R4 exportapply cost在BGP里就是修改MED。华为设备上,EBGP路由默认MED为0,当两条路由来自同一个AS,MED小的优先。所以R3这边收到的MED是50,R4那边是200,路由器会优选R3。
但这里有个课本上经常考的坑:MED只在比较"来自同一个AS"的路由时有意义。如果两条路由分别来自AS100和AS300,就算一条MED是0、一条MED是50,也不会直接拿MED比,而是先比AS路径长度。我自己练的时候就吃过这个亏,以为把MED调小就万事大吉,结果AS路径差了一位,MED怎么改都不生效。理解了这句话,BGP选路一半的题就不会错了。
AS-Path的控制方式则是"加长路径":在R2向R4通告时,把本AS号多追加几次,让AS200认为走R4的路径更长,从而放弃。命令是:
route-policy RP-ASP-TO-R4 permit node 10 if-match ip-prefix PL-ASP apply as-path 100 100 additive ip ip-prefix PL-ASP index 10 permit 172.16.3.0 24apply as-path 100 100 additive表示在现有AS路径上追加两个100。效果是AS-Path从100 200变成100 200 100 100,长度变长,路由器选路时自然避开。这个方法在生产里也很常用,尤其是运营商间做流量牵引时。
4.3 验证方法与调完必做的动作
每改一个属性,我建议按这个顺序过一遍:
display bgp routing-table display bgp routing-table 172.16.2.0 display ip routing-table 172.16.2.0第一行看总表,确认路由还在;第二行看这条前缀的具体属性,确认LocalPref、MED、AS-Path都符合预期;第三行看全局路由表,确认BGP最优路由确实被装进了路由表,下一跳和出接口正确。
改完策略必须记得重置BGP会话让策略重新生效,华为设备上两种方式:
refresh bgp all import refresh bgp all export或者干脆reset bgp all。eNSP环境里reset最直接,生产环境能refresh就别reset,避免不必要的会话抖动。这个动作太容易被忽略,我见过不少人改了route-policy半天不生效,最后发现是没刷新。
5. 常见问题与排查实录
5.1 BGP邻居起不来的排查套路
练这个实验时最常遇到的第一个问题,就是IBGP邻居一直停在Active或者Connect。掏出display bgp peer看,邻居状态不对,先别急着怀疑配置,按下面顺序逐层查:
一是TCP层通不通。IBGP用LoopBack建邻居的话,先ping 10.0.2.2 -a 10.0.1.1,确认源地址能到达对端LoopBack。R1默认路由表里有OSPF的10.0.2.2/32,没通基本都是OSPF没起来或者没通告。
二是更新源对不对。IBGP邻居的TCP连接要求源地址与对端配置的peer地址一致。R1配置peer 10.0.2.2 connect-interface LoopBack0,那R2上配置的peer地址必须是10.0.1.1。如果R1忘记指定connect-interface,TCP源地址会变成10.0.12.1,R2一看源地址不匹配,直接拒绝。排错时抓display tcp status能看得很清楚。
三是AS号与版本。EBGP邻居如果AS号写反了,设备会尝试建立连接然后因为AS不匹配反复重置,状态在Connect和Idle之间来回跳。另外默认BGP版本是4,两边都别乱改。
5.2 路由不优、不通的排查套路
邻居都Established了,但路由表里没有想要的前缀,或者前缀没有>最优标记,这是第二类高频问题。
先说没有前缀。查有没有被过滤掉,重点看三处:对端是否用network或者import方式通告了路由、中间设备出方向策略是否有deny、本地入方向策略是否有deny。用display bgp routing-table看有没有前缀但缺>,如果有前缀无最优标记,查下一跳。
IBGP场景里最常见的就是"前缀存在但下一跳不可达"。R2把R1的172.16.1.0/24通告给IBGP邻居R1自己?不对,这里要理清楚:R1把路由通告给R2,R2再通告给EBGP邻居R3、R4,R3、R4收到后通过IBGP互传。如果R3收到的IBGP路由下一跳是R2的LoopBack地址10.0.2.2,而R3的IGP没有到10.0.2.2的路由,这就麻烦了,所以前面强调在AS200里也需要保证到对端LoopBack的路由可达,通常做法是在R3和R4之间跑OSPF或者静态路由,把LoopBack地址也通告进去。
设备上查下一跳的快捷命令:
display ip routing-table 10.0.2.2如果无路由,就去IGP里补通告。这个环节我建议把这个命令刻在脑子里,它比看一堆display bgp的输出更快定位问题。
5.3 eNSP操作细节与设备层面的坑
最后说几个eNSP和真实设备不太一样的地方,都是实操里踩出来的。
第一,eNSP里AR3260默认接口是GigabitEthernet,AR2220有些型号接口叫GigabitEthernet有些是Ethernet,写脚本前先把display ip interface brief跑一遍,别照着网上模板硬抄接口名。
第二,eNSP里的设备如果长时间不操作会"空闲断开",命令敲到一半丢失很烦。建议在系统视图下执行user-interface vty 0 4再配idle-timeout 0,把超时关掉。
第三,改完配置先display current-configuration确认设备记住了,有些错误配置设备拒绝接受但你又不注意看回显,比如OSPF通配符写错、BGP路由ID冲突等,设备都会在敲回车时给出报错信息。养成看回显的习惯,比事后排错省太多时间。
6. 小结:一次练习下来最值钱的经验
这期HCIP代码小练跑下来,我最大的感触是:路由控制的组合拳不是看会的,是敲会的。ip-prefix控制匹配范围,route-policy控制动作,import/export控制方向,refresh/reset控制生效时机,这几个环节环环相扣,缺一个都会在验证阶段原形毕露。建议拿到实验拓扑后,先把需求拆成"放什么路由、改什么属性、从哪个方向做",再落成命令,而不是上来就敲。下一期我打算把BGP路由反射器和联盟一起练,顺带把OSPF特殊区域也揉进去,想要哪部分的兄弟可以留言,我优先安排。