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号 | 角色 |
|---|---|---|---|---|
| Cisco | Gi0/0 | 192.168.12.1/24 | 65001 | iBGP |
| Juniper | ge-0/0/0 | 192.168.12.2/24 | 65001 | iBGP + eBGP |
| FRR | eth0 | 192.168.12.3/24 | 65002 | eBGP |
需要特别说明的是,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保证下一跳可达。
常见故障与判断依据
邻居停留在Active状态,通常表示本端已发起TCP连接但未收到对端响应,应检查对端是否配置了反向邻居、ACL是否放行179端口。邻居停留在Idle,可能是没有到达对端的路由,或BGP进程未启动。邻居Established但学不到路由,优先检查export/network策略:Cisco的network是否精确匹配、Junos的export策略是否放行、FRR的network是否对应有效前缀。
最后需要强调,iBGP与eBGP在路由传递规则上有本质区别:eBGP邻居之间传递的路由,AS_PATH会追加本端AS号;iBGP邻居之间传递的路由,AS_PATH不变。此外,iBGP要求全互联或使用路由反射器/联盟,否则从eBGP学到的路由无法传递给其他iBGP邻居。本节的三角拓扑中,Juniper同时承担iBGP和eBGP角色,它从FRR学到的10.2.2.0/24会通过iBGP传给Cisco,这正是验证iBGP传递规则的好例子。