3. BGP配置起步

BGP邻居的建立是路由工程中最基础也最容易出错的一步。它不像OSPF那样自动发现邻居,而是必须显式指定对端地址、自治系统号(AS)和更新源。本节以一台Cisco IOS-XE、一台Juniper Junos和一台FRR(Free Range Routing)设备为例,搭建一个最小的三节点拓扑:Cisco(AS 65001)与Juniper(AS 65001)建立iBGP,Juniper(AS 65001)与FRR(AS 65002)建立eBGP。通过这个拓扑,可以同时观察iBGP与eBGP在配置和验证上的差异。

拓扑与地址规划

假设三台设备通过一个共享的192.168.12.0/24网段互联,实际工程中通常使用点对点或环回口建立邻居。为便于演示,这里使用直连物理接口地址:

设备接口IP地址AS号角色
CiscoGi0/0192.168.12.1/2465001iBGP
Juniperge-0/0/0192.168.12.2/2465001iBGP + eBGP
FRReth0192.168.12.3/2465002eBGP

需要特别说明的是,iBGP邻居之间不要求直连,但要求IP可达;eBGP邻居默认要求直连(除非配置multihop)。本拓扑中三者同网段,因此直连条件天然满足。

Cisco IOS-XE上的iBGP配置

在Cisco上,BGP进程通过router bgp启动,邻居用neighbor命令声明。iBGP邻居的AS号必须与本机相同:

router bgp 65001
 bgp log-neighbor-changes
 neighbor 192.168.12.2 remote-as 65001
 neighbor 192.168.12.2 description iBGP-to-Juniper
 !
 address-family ipv4 unicast
  neighbor 192.168.12.2 activate
  network 10.1.1.0 mask 255.255.255.0
 exit-address-family

其中network语句用于将本地路由注入BGP。注意,Cisco的network命令要求路由表中已存在精确匹配的路由,否则不会通告。如果希望更灵活地注入,可以使用redistribute配合route-map。

Juniper Junos上的iBGP与eBGP配置

Junos的配置风格与Cisco差异较大,BGP邻居在protocols bgp层级下定义,且必须显式指定local-address或peer-as。以下配置同时建立iBGP和eBGP邻居:

set protocols bgp group IBGP type internal
set protocols bgp group IBGP local-address 192.168.12.2
set protocols bgp group IBGP neighbor 192.168.12.1
set protocols bgp group EBGP type external
set protocols bgp group EBGP peer-as 65002
set protocols bgp group EBGP neighbor 192.168.12.3
set policy-options policy-statement EXPORT term 1 from protocol direct
set policy-options policy-statement EXPORT term 1 then accept
set protocols bgp group IBGP export EXPORT
set protocols bgp group EBGP export EXPORT

Junos中type internal表示iBGP,type external表示eBGP。与Cisco不同,Junos默认不会将任何路由通告给BGP邻居,必须通过export策略显式放行。这是初学者最容易忽略的一点:邻居起来了,但路由表里看不到对方的路由,往往就是export策略没配。

FRR上的eBGP配置

FRR的配置语法接近Cisco,但运行在Linux上,通常通过vtysh或配置文件/etc/frr/frr.conf管理:

router bgp 65002
 bgp router-id 192.168.12.3
 neighbor 192.168.12.2 remote-as 65001
 neighbor 192.168.12.2 description eBGP-to-Juniper
 !
 address-family ipv4 unicast
  neighbor 192.168.12.2 activate
  network 10.2.2.0/24
 exit-address-family

FRR的network命令同样要求路由表中存在对应前缀。如果使用network 10.2.2.0/24但本地没有这条直连或静态路由,BGP不会通告它。

邻居关系验证

配置完成后,第一步是检查TCP 179端口是否建立。BGP使用TCP作为传输层,因此可以用telnet 192.168.12.2 179或nc -zv 192.168.12.2 179快速判断底层可达性。如果TCP都连不上,BGP状态不可能进入Established。

在Cisco上查看邻居状态:

Cisco# show bgp ipv4 unicast summary
Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.12.2    4 65001      12      10        5    0    0 00:03:21        1

State/PfxRcd列显示数字表示已进入Established并收到1条前缀;如果显示Idle、Active或Connect,说明邻居未建立。常见原因包括:AS号配错、更新源地址不可达、ACL阻断了TCP 179、或对端没有配置反向邻居。

在Junos上查看:

user@Juniper> show bgp summary
Groups: 2 Peers: 2 Down peers: 0
Table          Tot Paths  Act Paths Suppressed    History Damp State    Pending
inet.0               2          2          0          0          0          0
Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State
192.168.12.1          65001         15         14       0       0    00:04:12 Establ
  inet.0: 1/1/0/0
192.168.12.3          65002         10          9       0       0    00:02:45 Establ
  inet.0: 1/1/0/0

在FRR上查看:

frr# show bgp summary
Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
192.168.12.2    4      65001        18        16        4    0    0 00:05:33            1

基本路由交换验证

邻居Established后,需要确认路由是否真正交换。在Cisco上执行show bgp ipv4 unicast,应能看到从Juniper学到的10.2.2.0/24(经eBGP传递)。在Junos上执行show route protocol bgp,应同时看到来自Cisco的10.1.1.0/24和来自FRR的10.2.2.0/24。在FRR上执行show bgp ipv4 unicast,应看到10.1.1.0/24和10.2.2.0/24。

这里有一个关键现象:iBGP邻居之间交换的路由,下一跳不会自动改变。Cisco从Juniper学到的10.2.2.0/24,下一跳是192.168.12.3;如果Cisco要把这条路由再传给其他iBGP邻居,默认下一跳保持不变,可能导致对端无法解析。实际工程中通常配合next-hop-self或IGP保证下一跳可达。

验证顺序建议:先看TCP 179是否可达,再看邻居状态是否Established,最后看路由表是否出现预期前缀。三步依次排查,可以快速定位问题出在传输层、BGP会话层还是策略层。

常见故障与判断依据

邻居停留在Active状态,通常表示本端已发起TCP连接但未收到对端响应,应检查对端是否配置了反向邻居、ACL是否放行179端口。邻居停留在Idle,可能是没有到达对端的路由,或BGP进程未启动。邻居Established但学不到路由,优先检查export/network策略:Cisco的network是否精确匹配、Junos的export策略是否放行、FRR的network是否对应有效前缀。

三节点BGP邻居与路由交换示意 Cisco IOS-XE AS 65001 Gi0/0: 192.168.12.1 通告: 10.1.1.0/24 Juniper Junos AS 65001 ge-0/0/0: 192.168.12.2 iBGP + eBGP FRR AS 65002 eth0: 192.168.12.3 通告: 10.2.2.0/24 iBGP TCP 179 eBGP TCP 179 邻居状态 Established PfxRcd: 1 邻居状态 Established ×2 inet.0: 2条 邻居状态 Established PfxRcd: 1 路由交换:10.1.1.0/24 与 10.2.2.0/24 经iBGP/eBGP传递 验证顺序:TCP 179可达 → 邻居Established → 路由表出现预期前缀 → 下一跳可解析

最后需要强调,iBGP与eBGP在路由传递规则上有本质区别:eBGP邻居之间传递的路由,AS_PATH会追加本端AS号;iBGP邻居之间传递的路由,AS_PATH不变。此外,iBGP要求全互联或使用路由反射器/联盟,否则从eBGP学到的路由无法传递给其他iBGP邻居。本节的三角拓扑中,Juniper同时承担iBGP和eBGP角色,它从FRR学到的10.2.2.0/24会通过iBGP传给Cisco,这正是验证iBGP传递规则的好例子。