BGP 路由配置

BGP 路由协议介绍

边界网关协议(Border Gateway Protocol,BGP)是互联网上使用最广泛的外部网关协议(EGP),主要用于在不同自治系统(Autonomous System,AS)之间交换路由信息。BGP 是一种路径向量协议,不同于 RIP 和 OSPF 等内部网关协议(IGP),它主要关注的是路由策略而非最短路径。

BGP 的主要特点包括:

  • 可靠性:使用 TCP(端口 179)作为传输协议,确保可靠的路由信息交换
  • 可扩展性:能够处理互联网规模的路由表(超过 900,000 条路由)
  • 策略控制:提供丰富的路由属性和策略工具,实现灵活的路由控制
  • 增量更新:只发送路由变化,而不是周期性地发送整个路由表

在本文中,我们将使用 FRRouting(FRR)来配置 BGP,并通过 veth 对和网络命名空间来模拟多个自治系统环境。

BGP 基本概念

在深入 BGP 配置之前,我们需要了解一些基本概念:

自治系统(AS)

自治系统是一组在单一技术管理下的 IP 网络和路由器,通常由一个组织(如 ISP 或大型企业)管理。每个 AS 都有一个唯一的 AS 号码(ASN),范围从 1 到 4,294,967,295。

  • 公有 ASN:1 - 64511,由 IANA 分配给组织
  • 私有 ASN:64512 - 65534 和 4200000000 - 4294967294,用于内部使用

BGP 邻居关系

BGP 路由器之间建立 TCP 连接(端口 179)来交换路由信息。BGP 邻居关系有两种类型:

  • EBGP(外部 BGP):连接不同 AS 的 BGP 路由器
  • IBGP(内部 BGP):连接同一 AS 内的 BGP 路由器

BGP 路径属性

BGP 使用多种路径属性来选择最佳路径和实现路由策略。主要的路径属性包括:

  • NEXT_HOP:到达目标网络的下一跳 IP 地址
  • AS_PATH:到达目标网络需要经过的 AS 列表
  • LOCAL_PREF:本地优先级,用于 IBGP 路径选择
  • MED(Multi-Exit Discriminator):多出口鉴别器,影响从其他 AS 进入本 AS 的流量
  • ORIGIN:路由的起源(IGP、EGP 或 INCOMPLETE)
  • COMMUNITY:用于分组路由并应用策略

BGP 路径选择

BGP 使用一系列规则来选择最佳路径。主要的选择标准(按优先级排序)包括:

  1. 最高的 WEIGHT(思科专有属性)
  2. 最高的 LOCAL_PREF
  3. 本地生成的路由
  4. 最短的 AS_PATH
  5. 最低的 ORIGIN 类型(IGP < EGP < INCOMPLETE)
  6. 最低的 MED
  7. EBGP 路径优于 IBGP 路径
  8. 到达最近的 BGP 下一跳
  9. 最低的路由器 ID

BGP 基本配置

我们将创建一个包含两个自治系统(AS)的简单网络拓扑,并配置 BGP 路由。

网络拓扑

+----------------+         +----------------+
|                |         |                |
|    Router1     |         |    Router2     |
|    (AS 65001)  +---------+    (AS 65002)  |
|                |         |                |
+----------------+         +----------------+
        |                           |
        |                           |
        v                           v
   10.1.1.0/24                 10.2.2.0/24
                

环境准备

首先,我们需要创建网络命名空间和 veth 对:

# 创建网络命名空间
sudo ip netns add r1
sudo ip netns add r2

# 创建 veth 对
sudo ip link add r1-r2 type veth peer name r2-r1

# 将 veth 对分配给相应的命名空间
sudo ip link set r1-r2 netns r1
sudo ip link set r2-r1 netns r2

# 配置 IP 地址
sudo ip netns exec r1 ip addr add 192.168.12.1/24 dev r1-r2
sudo ip netns exec r2 ip addr add 192.168.12.2/24 dev r2-r1

# 启用接口
sudo ip netns exec r1 ip link set r1-r2 up
sudo ip netns exec r1 ip link set lo up
sudo ip netns exec r2 ip link set r2-r1 up
sudo ip netns exec r2 ip link set lo up

# 启用 IP 转发
sudo ip netns exec r1 sysctl -w net.ipv4.ip_forward=1
sudo ip netns exec r2 sysctl -w net.ipv4.ip_forward=1

# 添加本地网络
sudo ip netns exec r1 ip link add lo1 type dummy
sudo ip netns exec r1 ip link set lo1 up
sudo ip netns exec r1 ip addr add 10.1.1.1/24 dev lo1

sudo ip netns exec r2 ip link add lo2 type dummy
sudo ip netns exec r2 ip link set lo2 up
sudo ip netns exec r2 ip addr add 10.2.2.1/24 dev lo2
                

安装 FRRouting

确保已安装 FRRouting(FRR):

# 添加 FRR 官方 PPA
sudo add-apt-repository ppa:frrouting/frr-stable
sudo apt update
sudo apt install frr frr-pythontools
                

启用 BGP 路由协议:

sudo sed -i 's/bgpd=no/bgpd=yes/g' /etc/frr/daemons
sudo systemctl restart frr
                

配置 BGP

现在,我们将在每个路由器上配置 BGP:

Router1 配置(AS 65001)

sudo ip netns exec r1 vtysh

# 进入配置模式
configure terminal

# 配置 BGP
router bgp 65001
 bgp router-id 1.1.1.1
 neighbor 192.168.12.2 remote-as 65002
 network 10.1.1.0/24

# 保存配置并退出
write
exit
                

Router2 配置(AS 65002)

sudo ip netns exec r2 vtysh

# 进入配置模式
configure terminal

# 配置 BGP
router bgp 65002
 bgp router-id 2.2.2.2
 neighbor 192.168.12.1 remote-as 65001
 network 10.2.2.0/24

# 保存配置并退出
write
exit
                

或者,可以使用以下命令一次性配置:

# Router1 配置
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "bgp router-id 1.1.1.1" -c "neighbor 192.168.12.2 remote-as 65002" -c "network 10.1.1.0/24" -c "write"

# Router2 配置
sudo ip netns exec r2 vtysh -c "conf t" -c "router bgp 65002" -c "bgp router-id 2.2.2.2" -c "neighbor 192.168.12.1 remote-as 65001" -c "network 10.2.2.0/24" -c "write"
                

验证 BGP 配置

配置完成后,我们可以验证 BGP 是否正常工作:

# 查看 BGP 邻居
sudo ip netns exec r1 vtysh -c "show bgp neighbors"
sudo ip netns exec r2 vtysh -c "show bgp neighbors"

# 查看 BGP 路由表
sudo ip netns exec r1 vtysh -c "show bgp ipv4 unicast"
sudo ip netns exec r2 vtysh -c "show bgp ipv4 unicast"

# 查看 IP 路由表
sudo ip netns exec r1 vtysh -c "show ip route bgp"
sudo ip netns exec r2 vtysh -c "show ip route bgp"
                

测试连通性

测试 Router1 是否可以访问 Router2 的本地网络:

sudo ip netns exec r1 ping 10.2.2.1 -c 4
                

测试 Router2 是否可以访问 Router1 的本地网络:

sudo ip netns exec r2 ping 10.1.1.1 -c 4
                

BGP 路由通告

在 BGP 中,有多种方式可以通告路由:

使用 network 语句

最直接的方式是使用 network 语句,如我们在基本配置中所示:

router bgp 65001
 network 10.1.1.0/24
                

注意:使用 network 语句通告的路由必须存在于 IP 路由表中。

使用重分发

另一种方式是将其他路由协议或直连路由重分发到 BGP:

# 重分发直连路由
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "redistribute connected"

# 重分发静态路由
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "redistribute static"

# 重分发 OSPF 路由
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "redistribute ospf"
                

使用聚合地址

BGP 支持路由聚合,可以将多个具体路由聚合为一个更一般的路由:

# 聚合 10.1.0.0/16 网络
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "aggregate-address 10.1.0.0/16 summary-only"
                

参数 summary-only 表示只通告聚合路由,而不通告具体路由。

BGP 高级配置

BGP 提供了丰富的高级配置选项,用于实现复杂的路由策略和控制。

复杂拓扑

让我们创建一个更复杂的网络拓扑,包含三个自治系统:

                +----------------+
                |                |
                |    Router3     |
                |    (AS 65003)  |
                |                |
                +----------------+
                      /   \
                     /     \
                    /       \
+----------------+ /         \ +----------------+
|                |/           \|                |
|    Router1     |             |    Router2     |
|    (AS 65001)  +-------------+    (AS 65002)  |
|                |             |                |
+----------------+             +----------------+
                

配置步骤:

# 创建网络命名空间
sudo ip netns add r3

# 创建 veth 对
sudo ip link add r1-r3 type veth peer name r3-r1
sudo ip link add r2-r3 type veth peer name r3-r2

# 将 veth 对分配给相应的命名空间
sudo ip link set r1-r3 netns r1
sudo ip link set r3-r1 netns r3
sudo ip link set r2-r3 netns r2
sudo ip link set r3-r2 netns r3

# 配置 IP 地址
sudo ip netns exec r1 ip addr add 192.168.13.1/24 dev r1-r3
sudo ip netns exec r3 ip addr add 192.168.13.3/24 dev r3-r1
sudo ip netns exec r2 ip addr add 192.168.23.2/24 dev r2-r3
sudo ip netns exec r3 ip addr add 192.168.23.3/24 dev r3-r2

# 启用接口
sudo ip netns exec r1 ip link set r1-r3 up
sudo ip netns exec r3 ip link set r3-r1 up
sudo ip netns exec r2 ip link set r2-r3 up
sudo ip netns exec r3 ip link set r3-r2 up
sudo ip netns exec r3 ip link set lo up

# 添加本地网络
sudo ip netns exec r3 ip link add lo3 type dummy
sudo ip netns exec r3 ip link set lo3 up
sudo ip netns exec r3 ip addr add 10.3.3.1/24 dev lo3
                

配置 BGP:

# Router1 配置
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "neighbor 192.168.13.3 remote-as 65003" -c "write"

# Router2 配置
sudo ip netns exec r2 vtysh -c "conf t" -c "router bgp 65002" -c "neighbor 192.168.23.3 remote-as 65003" -c "write"

# Router3 配置
sudo ip netns exec r3 vtysh -c "conf t" -c "router bgp 65003" -c "bgp router-id 3.3.3.3" -c "neighbor 192.168.13.1 remote-as 65001" -c "neighbor 192.168.23.2 remote-as 65002" -c "network 10.3.3.0/24" -c "write"
                

BGP 路由过滤

BGP 提供多种路由过滤机制,包括前缀列表、AS 路径访问列表、路由图等。

前缀列表

前缀列表用于基于 IP 前缀过滤路由:

# 创建前缀列表
sudo ip netns exec r1 vtysh -c "conf t" -c "ip prefix-list FILTER seq 5 permit 10.2.2.0/24" -c "ip prefix-list FILTER seq 10 deny any"

# 应用前缀列表
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "neighbor 192.168.12.2 prefix-list FILTER in" -c "write"
                

AS 路径访问列表

AS 路径访问列表用于基于 AS 路径过滤路由:

# 创建 AS 路径访问列表
sudo ip netns exec r1 vtysh -c "conf t" -c "ip as-path access-list 1 permit ^65002$" -c "ip as-path access-list 1 deny .*"

# 应用 AS 路径访问列表
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "neighbor 192.168.12.2 filter-list 1 in" -c "write"
                

路由图

路由图是最强大的过滤和修改路由的工具:

# 创建路由图
sudo ip netns exec r1 vtysh -c "conf t" -c "route-map RMAP permit 10" -c "match ip address prefix-list FILTER" -c "set local-preference 200" -c "route-map RMAP deny 20" -c "write"

# 应用路由图
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "neighbor 192.168.12.2 route-map RMAP in" -c "write"
                

BGP 属性修改

BGP 允许修改路由属性,以影响路由选择和流量工程。

LOCAL_PREF

LOCAL_PREF 用于影响从本 AS 出去的流量:

sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "neighbor 192.168.12.2 route-map SET-PREF in" -c "route-map SET-PREF permit 10" -c "set local-preference 200" -c "write"
                

MED

MED 用于影响进入本 AS 的流量:

sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "neighbor 192.168.12.2 route-map SET-MED out" -c "route-map SET-MED permit 10" -c "set metric 100" -c "write"
                

AS_PATH 预置

通过在 AS_PATH 中预置 AS 号,可以使路径看起来更长,从而影响路由选择:

sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "neighbor 192.168.12.2 route-map PREPEND out" -c "route-map PREPEND permit 10" -c "set as-path prepend 65001 65001" -c "write"
                

COMMUNITY

COMMUNITY 属性用于标记路由,便于后续应用策略:

sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "neighbor 192.168.12.2 route-map SET-COMM out" -c "route-map SET-COMM permit 10" -c "set community 65001:100" -c "write"
                

BGP 路由反射器

在大型 AS 内部,为了解决 IBGP 全连接的问题,可以使用路由反射器:

# 配置路由反射器
sudo ip netns exec r2 vtysh -c "conf t" -c "router bgp 65002" -c "neighbor 192.168.24.4 remote-as 65002" -c "neighbor 192.168.24.4 route-reflector-client" -c "write"
                

BGP 联盟

BGP 联盟是另一种解决 IBGP 全连接问题的方法,它将一个大的 AS 分成多个子 AS:

# 配置 BGP 联盟
sudo ip netns exec r1 vtysh -c "conf t" -c "router bgp 65001" -c "bgp confederation identifier 65000" -c "bgp confederation peers 65002" -c "write"
                

BGP 故障排除

BGP 配置中可能会遇到各种问题。以下是一些常见问题及其解决方法:

邻居关系问题

  • TCP 连接问题:确保两个路由器之间的 TCP 连接(端口 179)正常
  • AS 号不匹配:检查 neighbor 语句中的 AS 号是否正确
  • 认证失败:如果配置了 MD5 认证,确保密钥匹配

路由通告问题

  • 路由不存在于 IP 路由表:使用 network 语句通告的路由必须存在于 IP 路由表中
  • 路由过滤:检查是否有前缀列表、AS 路径访问列表或路由图阻止了路由
  • 下一跳不可达:确保 BGP 下一跳地址可达

调试命令

# 启用 BGP 调试
sudo ip netns exec r1 vtysh -c "debug bgp updates"
sudo ip netns exec r1 vtysh -c "debug bgp events"
sudo ip netns exec r1 vtysh -c "debug bgp keepalives"

# 查看日志
sudo ip netns exec r1 vtysh -c "show logging"

# 禁用调试
sudo ip netns exec r1 vtysh -c "no debug all"
                

总结

BGP 是互联网的路由协议,它提供了丰富的功能和灵活的策略控制。在本文中,我们介绍了 BGP 的基本概念、配置方法和高级选项,并通过实际示例演示了如何在 veth 对和网络命名空间环境中配置 BGP。

虽然 BGP 配置相对复杂,但它提供了强大的路由控制能力,特别是在多自治系统环境中。通过掌握 BGP 的配置和使用,我们可以更好地理解互联网路由的工作原理,为构建大型网络奠定基础。

在实际网络中,BGP 通常与 IGP(如 OSPF 或 IS-IS)结合使用,IGP 负责 AS 内部的路由,而 BGP 负责 AS 之间的路由。这种组合可以提供高效、可扩展的路由解决方案。