Route Leak Prevention

使用 RFC 9234 中定义的 BGP 角色来预防和检测 route leak。

Route Leak 预防

当 BGP speaker 将路由通告给一个根据所配置的业务关系不应接收这些路由的对端时,就会发生 route leak。例如,一个 transit 客户将一个 provider 学到的路由重新通告给另一个 provider,可能导致流量通过客户的网络路由,可能绕过预期路径并造成路由循环或流量拦截。

RFC 9234 — Route Leak Prevention and Detection Using Roles in UPDATE and OPEN Messages — 定义了一种机制,通过为每个 eBGP 会话分配一个描述两个对端之间关系的角色来预防和检测 route leak。RouterOS 通过 local.role 参数实现此机制,该参数对每个 BGP 连接都是必填的,定义了本地路由器在 BGP 会话中的角色。

ibgp、ibgp-rr 和 ebgp 角色不参与 RFC 9234 角色协商。会话作为传统 BGP 会话建立,不交换 Role capability。

其余五个角色参与 RFC 9234 角色协商:

RoleDescription
ebgp-providerTransit provider(中转提供商)。
ebgp-rsRoute server(路由服务器)。
ebgp-rs-clientRoute server client(路由服务器客户端)。
ebgp-customerTransit customer(中转客户)。
ebgp-peerLateral peer(对等关系)。

关系类型

这些角色描述两个 eBGP 对端之间的业务关系:

  • Transit provider—customer:提供商向客户销售中转,使客户能够访问提供商的完整路由表(通常是整个互联网)。客户向提供商通告自己的前缀及其下游客户的前缀。提供商向客户通告它学到的所有路由(包括来自其他客户和对端的路由)。在这种关系中,提供商是上游,客户是下游。
  • Route server—client:route server 是一个中立的 BGP speaker,通常部署在互联网交换点(IXP)。它本身不转发流量——它只在客户端之间反射路由信息。route server 客户端连接到 route server,以便与其他客户端交换路由,而无需与每个客户端建立直接的对等会话。route server 不修改 AS_PATH 或 NEXT_HOP,也不出现在数据路径中。
  • Lateral peer:两个具有对等关系的网络只交换各自的路由以及各自客户的路由。双方都不通告从其他对端或提供商学到的路由。对等通常是免费结算的,意味着两个网络之间不交换金钱。

两个对端必须配置匹配的角色,会话才能成功建立。

角色协商

当使用 RFC 9234 角色配置 BGP 会话时,路由器会在 OPEN 消息中发送 BGP Role capability(Capability Code 9)。当本地路由器收到远程对端的 OPEN 消息时,它会根据本地配置的 local.role 检查收到的角色是否符合预期角色:

Local roleExpected remote role
ebgp-providerebgp-customer
ebgp-customerebgp-provider
ebgp-rsebgp-rs-client
ebgp-rs-clientebgp-rs
ebgp-peerebgp-peer

如果远程对端未发送 Role capability,或者收到的角色与预期角色不匹配,路由器会发送一条 NOTIFICATION 消息,其中 Error Code 为 2(OPEN Message Error),Error Subcode 为 8(Role Mismatch),并且会话被终止。

协商的角色可在会话监控输出中看到:

  • remote.role — 在 OPEN 消息中从远程对端收到的角色。
  • local.role — 本地配置的角色。

配置

local.role 参数在 /routing/bgp/connection 菜单中配置。

如果会话已建立,可以在 /rouring/bgp/session 菜单中监控协商的 capabilities 和选定的角色。

当远程对端支持 BGP Role capability 时,remote.capabilities 字段会包含 role。remote.role 字段显示从远程对端收到的实际角色。

如果会话因角色不匹配而建立失败,input.last-notification 字段包含从对端收到的十六进制编码的 NOTIFICATION 消息。

示例:Transit provider 到 customer

一个 transit provider 连接到下游客户:

# Provider side (AS 64500)
/routing/bgp/instance
add name=instance1 as=64500
/routing/bgp/connection
add name=to-customer remote.address=198.51.100.1 instance=instance1 local.role=ebgp-provider

# Customer side (AS 64501)
/routing/bgp/instance
add name=instance1 as=64501
/routing/bgp/connection
add name=to-provider remote.address=192.0.2.1 instance=instance1 local.role=ebgp-customer

两个对端必须配置匹配的角色。配置为 ebgp-provider 的对端期望远程为 ebgp-customer,反之亦然。

示例:带多个客户端的 Route server

一个 IXP route server 连接到多个客户端:

# Route server side (AS 65500)
/routing/bgp/instance
add name=instance1 as=65500
/routing/bgp/connection
add name=rs-client1 remote.address=203.0.113.1 instance=instance1 local.role=ebgp-rs
add name=rs-client2 remote.address=203.0.113.2 instance=instance1 local.role=ebgp-rs

# Route server client side (AS 64601)
/routing/bgp/instance
add name=instance1 as=64601
/routing/bgp/connection
add name=to-rs remote.address=203.0.113.254 instance=instance1 local.role=ebgp-rs-client

示例:两个网络之间的对等

两个具有对等关系的网络:

# Network A (AS 64500)
/routing/bgp/instance
add name=instance1 as=64500
/routing/bgp/connection
add name=to-peer-b remote.address=192.0.2.2 instance=instance1 local.role=ebgp-peer

# Network B (AS 64700)
/routing/bgp/instance
add name=instance1 as=64700
/routing/bgp/connection
add name=to-peer-a remote.address=192.0.2.1 instance=instance1 local.role=ebgp-peer

示例:iBGP 和 route reflector

内部 BGP 会话不使用 RFC 9234 角色协商:

# iBGP peer
/routing/bgp/instance
add name=instance1 as=64500
/routing/bgp/connection
add name=ibgp-peer1 remote.address=10.0.0.2 instance=instance1 local.role=ibgp

# iBGP route reflector client
/routing/bgp/connection
add name=rr-client1 remote.address=10.0.0.3 instance=instance1 local.role=ibgp-rr