Peering Sessions

关于如何建立 BGP 会话的介绍。

对等会话

eBGP 会话的目的是在自治系统(AS)之间交换路由信息。通常,eBGP 会话建立在直接连接的物理或逻辑网络(单跳链路)上,位于网络出口点,并且使用默认参数时,如果对端距离多跳,将无法连接。
在 EVPN 配置中,运营商通常在由 IGP 路由的 loopback 地址上运行 eBGP 会话。这意味着连接不再位于连接网络上,除非配置 multihop=yes,否则将失败。

AS_PATH 属性用于防止路由循环。如果列表包含自身的 AS 号(ASN),则该路由被丢弃;但在某些特定配置中,这并不是期望的行为。例如,MPLS L3VPN 配置需要使用 input.allow-as 参数覆盖默认的防环机制,以允许 CE 路由器接受包含自身 ASN 的路由(来自多宿主或互连站点)。

默认情况下,下一跳会因显而易见的原因更改为自身,但同样,在某些配置中(例如 EVPN overlay)这种行为并不理想。要覆盖默认行为,请将 nexthop-choice 参数设置为 propagate。

内部 BGP(iBGP)对等

与 eBGP 相反,iBGP 用于在自治系统内部交换路由信息。它将从 eBGP 对端学到的外部路由传播到内部网络。

默认情况下,iBGP 会话被视为多跳,并运行在内部网关协议(IGP)之上,例如 OSPF 或 ISIS,后者提供 loopback 地址之间的可达性。外部路由的下一跳会被传播,由 IGP 负责下一跳解析。在较小的配置中,为降低配置复杂性,可以通过将 nexthop-choice 参数设置为 force-self 并在直接连接的网络上运行 iBGP 会话,从而在没有底层 IGP 的情况下使用 iBGP。

当路由在 iBGP 对端之间传播时,自身的 AS 号不会添加到 AS Path 列表中;相反,使用水平分割(split-horizon)进行防环,即从 iBGP 对端学到的路由不会通告给另一个 iBGP 对端。为克服水平分割的限制,每个 iBGP 路由器必须连接到所有其他 iBGP 路由器,形成 full mesh(全互联)。

graph LR
    R1 <--> R2
    R2 <--> R3
    R3 <--> R1

全互联的问题是可扩展性,连接总数为 n*(n-1)/2。为简化大规模 iBGP 网络,使用 Route reflector (RR) 来消除对全互联的需求。它建立客户端-服务器关系,其中客户端只与 route reflector 对等,从而将连接数减少到 n-1。

graph TB
    R2(R2 RR) <--> R1
    R2 <--> R3

引入 RR 打破了标准的水平分割规则以实现路由反射,这就是为什么使用 ORIGINATOR_ID 和 CLUSTER_LIST 属性来防止路由循环。

会话配置

/routing/bgp/connection 菜单定义 BGP 出站连接,同时也充当入站 BGP 连接的模板匹配器。

以下是一个非常基本的 BGP 配置示例。假设 Router1 的 IP 为 192.168.1.1,AS 为 65531,Router2 的 IP 为 192.168.1.2,AS 为 65532:

#Router1
/routing/bgp/instance
add name=myInstance as=65531

/routing/bgp/connection
add name=toR2 remote.address=192.168.1.2 instance=myInstance local.role=ebgp
#Router2
/routing/bgp/instance
add name=myInstance as=65532

/routing/bgp/connection
add name=toR1 remote.address=192.168.1.1 instance=myInstance local.role=ebgp

local.role 是一个必填参数,描述会话的性质,无论是 eBGP 会话(如我们的示例)、iBGP 会话,还是它将充当 iBGP route-reflector。此外,还有来自 RFC 9234 的用于 route leak 预防和检测的其他模式。

连接不需要指定远程 AS 号;RouterOS 会从收到的第一条 OPEN 消息中动态确定它。

与其他厂商以及旧版 RouterOS update-source 等效的参数是 local.address。在大多数情况下,可以不配置它,路由器会自行确定地址。

当未指定本地地址时,BGP 将根据当前配置尝试猜测:

  • 如果对端是 iBGP
    • 如果存在 loopback
      • 选择最高的 loopback 地址
    • 如果不存在 loopback
      • 选择路由器上最高的 IP 地址
  • 如果对端是 eBGP
    • 如果远程对端的 IP 不是来自直接连接的网络:
      • 如果未设置 multihop,BGP 抛出错误
      • 如果启用了 multihop:
        • 如果存在 loopback
          • 选择最高的 loopback 地址
        • 如果不存在 loopback
          • 选择路由器上最高的 IP 地址
    • 如果远程对端的 IP 来自直接连接的网络:
      • 如果未设置 multihop:
        • 从该连接网络中选择路由器的 IP 地址
      • 如果设置了 multihop:
        • 如果存在 loopback
          • 选择最高的 loopback 地址
        • 如果不存在 loopback
          • 选择路由器上最高的 IP 地址

此菜单还直接暴露模板特定的参数,这在不需要模板的简单场景中使配置更容易。

警告

不应在不安全的环境中启用监听子网;这样的配置可能导致拒绝服务(DoS)。
必须配置防火墙以保护路由器。
有关更多详细信息,请参阅 listen 参数。

活动会话列表

检查 /routing/bgp/session 菜单以查看会话是否已建立:

[admin@MikroTik] /routing/bgp/session> print 
Flags: E - established 
 0 E name="toR2" instance=myInstance 
     remote.address=192.168.1.2 .as=65532 .id=192.168.1.1 .refused-cap-opt=no 
     .capabilities=mp,rr,as4 .afi=ip,ipv6 .messages=43346 .bytes=3635916 .eor="" 
     local.address=192.168.1.1 .as=65531 .id=192.168.44.2 .capabilities=mp,rr,gr,as4 .messages=2 
     .bytes=71 .eor="" 
     output.procid=97 .keep-sent-attributes=no 
     .last-notification=ffffffffffffffffffffffffffffffff0015030601 
     input.procid=97 .limit-process-routes=500000 ebgp limit-exceeded 
     hold-time=3m keepalive-time=1m uptime=4s70ms

它显示只读的缓存 BGP 会话信息:当前状态、标志、最后收到的通知以及协商的会话参数。

即使 BGP 会话不再活动,缓存仍可能保留一段时间。仅当缓存过期时,才会移除从特定会话接收的路由,如果 BGP 会话出现震荡,这可以减轻大量路由表重新计算。

如果 BGP 首次尝试建立会话,而 TCP 连接因 MD5 认证错误、被防火墙阻止或任何其他阻止连接的原因而无法发起,则不会创建会话条目。

参数分组

如果你注意到了,大多数参数都分组在 output、input、local 和 remote 部分中,使配置更具可读性,也更容易理解该选项是应用于 input 还是 output,或者它影响路由器本地的值还是尝试匹配远程对端的参数。
例如:

  • 要指定输出选择链,你设置 output.filter-chain=myBgpChain。
  • 会话列表中的 local.bytes 表示已发送了多少字节。
  • remote.messages 表示远程对端已发送了多少数据包。
  • 依此类推。

BGP unnumbered

RouterOS 能够在接口上没有全局 IPv6 地址且未指定远程链路本地地址的情况下动态建立 BGP 会话(BGP Unnumbered 连接)。该机制依赖 IPv6 邻居发现(RFC 4861)来获取邻居的链路本地地址,并使用 RFC5549 来通告带有 IPv6 nexthops 的 IPv4 NLRIs。

如果 remote.address 为空且 local.address 是一个接口,则配置为 unnumbered 连接。在此模式下,每个接口只接受一个连接。 这在具有大量点对点链路的配置中很有用,例如,如果 eBGP 用作 EVPN underlay。

对于未配置全局地址、需要发送 RA 回复的路由器,应用以下 ND 配置:

/ipv6/nd/prefix/add prefix=none interface=sfp-sfpplus1
[admin@CCR2004_2XS_111] /ipv6/neighbor> print 
Flags: D - DYNAMIC; R - ROUTER
Columns: ADDRESS, MAC-ADDRESS, INTERFACE, VRF
#    ADDRESS                    MAC-ADDRESS        INTERFACE     VRF 
0 DR fe80::de2c:6eff:fec5:a7ff  DC:2C:6E:C5:A7:FF  sfp-sfpplus1  main

添加 unnumbered 连接配置:

/routing bgp connection
add instance=myInstance local.address=sfp-sfpplus1 .role=ibgp name=unnumbered_2
[admin@CCR2004_2XS_111] /routing/bgp/connection> print 
Flags: D - DYNAMIC, X - DISABLED, I - INACTIVE 
 0   name="unnumbered_2" instance=myInstance 
     local.address=sfp-sfpplus1 .default-address=fe80::de2c:6eff:fea4:b42f%sfp-sfpplus1 .role=ibgp 
     routing-table=main as=333 

[admin@CCR2004_2XS_111] /routing/bgp/session> print 
Flags: E - ESTABLISHED 
 0 E name="unnumbered_2-1" instance=v6_test 
     remote.address=fe80::de2c:6eff:fec5:a7ff%sfp-sfpplus1 .as=333 .id=203.0.113.2 .capabilities=mp,rr,enhe,gr,as4 .afi=ipv6 
     .messages=5181 .bytes=98439 .eor="" 
     local.role=ibgp .address=fe80::de2c:6eff:fea4:b42f%sfp-sfpplus1 .as=333 .id=203.0.113.1 .cluster-id=203.0.113.1 
     .capabilities=mp,rr,enhe,gr,as4 .afi=ipv6 .messages=5181 .bytes=98439 .eor="" 
     output.procid=20 
     input.procid=20 ibgp 
     multihop=yes hold-time=3m keepalive-time=1m uptime=3d14h20m55s640ms last-started=2026-02-12 18:26:59 prefix-count=0 

动态会话

BGP 对端配置可能相当复杂且可扩展性不佳;例如,hub-and-spoke 配置或 iBGP route reflector 配置。

假设我们有一个包含 route reflector 的配置,其中连接了两个对端。为简化配置并使其可扩展,我们将利用 BGP 模板来设置公共参数,并配置连接以侦听 loopback 地址范围,这将允许我们在 route reflector 上无需任何配置即可添加更多对端。

前提条件

  • 接口上的 IP 连通性
  • 在接口上配置并运行 OSPF

Route reflector

在配置 BGP 之前,我们需要添加一个 loopback 地址并启用 OSPF 以分发该 loopback 路由:

/ip address
add address=203.0.255.1 interface=lo
/routing ospf interface-template add interfaces=lo area=backbone passive

接下来创建一个包含公共参数的 BGP 模板,以及一个侦听我们的 loopback(203.0.255.0/24)地址范围的 BGP 会话:

/routing bgp instance
add as=65000 name=bgp_inst
/routing bgp template
set default afi=ip multihop=yes nexthop-choice=propagate hold-time=10s
/routing bgp connection
add instance=bgp_inst local.address=203.0.255.1 .role=ibgp-rr name=rr remote.address=\
    203.0.255.0/24 templates=default listen=yes

要添加新的 BGP 对端,请在对端与 route reflector 之间创建 IP 连接,并配置 BGP 以连接到 reflector 的 loopback 地址:

Peer_1

/ip address
add address=203.0.255.11 interface=lo
/routing ospf interface-template add interfaces=lo area=backbone passive

/routing bgp instance
add as=65000 name=bgp_inst
/routing bgp connection
add instance=bgp_inst local.role=ibgp name=to_rr remote.address=203.0.255.1

Peer_2

/ip address
add address=203.0.255.12 interface=lo
/routing ospf interface-template add interfaces=lo area=backbone passive

/routing bgp instance
add as=65000 name=bgp_inst
/routing bgp connection
add instance=bgp_inst local.role=ibgp name=to_rr remote.address=203.0.255.1

Peer_N

/ip address
add address=203.0.255.1N interface=lo
/routing ospf interface-template add interfaces=lo area=backbone passive

/routing bgp instance
add as=65000 name=bgp_inst
/routing bgp connection
add instance=bgp_inst local.role=ibgp name=to_rr remote.address=203.0.255.1

有关更多用例,请参阅 EVPN,其中此方法用于 EVPN Overlay 配置。