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