概述
边界网关协议(BGP)可以建立域间动态路由系统,在网络拓扑变化时自动更新运行BGP的设备的路由表。
BGP是一个基于距离向量算法的自治系统间的路由协议。用在互联网上交换路由信息,是唯一为处理互联网这种规模的网络而设计的协议,也是唯一能够很好地处理有多个连接到不相关的路由域的协议。
BGP的设计是为了允许实施复杂的管理性路由策略。它不交换关于网络拓扑结构的信息,而是交换可达信息。因此,BGP更适合于AS间环境和信息反馈等特殊情况。如果你只要在网络中启用动态路由,可以考虑OSPF来代替。
SMIPS设备(hAP lite、hAP lite TC和hAP mini)不支持该功能。
标准和技术:
RFC 4271 边界网关协议4
RFC 4456 BGP路由反射
RFC 5065 BGP的自治系统联盟
RFC 1997 BGP社区属性
RFC 8092 BGP大型社区
RFC 2385 BGPv4的TCP MD5认证
RFC 5492 BGP-4的能力通告通告
RFC 2918 路线刷新能力
RFC 4760 BGP-4的多协议扩展
RFC 2545 在IPv6域间路由中使用BGP-4多协议扩展
RFC 4893 BGP对四字节AS号码空间的支持
RFC 4364 BGP/MPLS IP虚拟专用网络(VPN)
RFC 4761 使用BGP进行自动发现和信令的虚拟专用局域网服务(VPLS)
RFC 6286 - BGP-4的AS范围唯一BGP标识符
BGP术语
AS - 自治系统
ASN - 自治系统号
NLRI - 网络层可达性信息,是BGP对等体之间交换的内容,表示如何到达前缀。
IGP - 内部网关协议
EGP–外部网关协议
RR–路由反射器是BGP网络中的路由器,它向所有邻居反射通告,避免了对BGP全网的要求。
路由服务器 - 是不参与流量转发的BGP路由器。路由通常甚至不安装在FIB中。
环回地址 - 配置在假桥接口上的一个/32地址,可以作为环回。
BGP基础知识
BGP路由器通过传输协议交换可达性信息,在BGP的情况下是TCP(端口179)。在形成TCP连接时,这些路由器交换“OPEN”消息,以协商和确认支持的能力。
在就使用的能力达成一致后,会话被认为已经建立,对等体可以通过“UPDATE”消息开始交换NLRI。该信息包含一个指示,说明路由应该采取什么顺序的完整路径(BGP AS号码),以便到达目的网络(NLRI前缀)。
对等体最初交换其完整的路由表,在最初的交换之后,随着路由表的变化,增量更新被发送。因此,BGP不需要定期刷新整个BGP路由表。
BGP维护路由表的版本号,在连接期间任何两个给定的对等体之间都必须是相同的。
KEEPALIVE 消息会定期发送,以确保连接处于运行状态,如果在 Hold Time 间隔内没有收到 KEEPALIVE 消息,连接将被关闭。
为了应对错误或特殊情况,可以生成 NOTIFICATION 消息并发送至远程对等体,通知消息类型也表明是否应立即关闭连接。
可以有两种类型的BGP连接:
iBGP - 是连接同一AS的对等体的 "内部 "链接
eBGP - 是一种 "外部 "链接,连接属于两个不同AS的对等体。
特定的AS可能有多个BGP发言人,并向其他AS-es提供过境服务。这意味着BGP发言人必须保持对AS内路由的一致看法。 通过让AS内的所有BGP路由器彼此建立直接的iBGP连接(全网状)或利用Router Reflector设置,可以提供对AS外部路由的一致看法。
使用一套管理策略,AS内的BGP发言人就使用哪个入口/出口点到达某个特定目的地达成协议。这一信息通过内部路由协议(IGP)传达给AS的内部路由器,例如OSPF、RIP或静态路由。在某些设置中,iBGP也可以承担IGP协议的角色。
对于某些BGP属性的处理行为可能会根据设置的连接类型而改变,例如,LOCAL-PREF属性不向eBGP对等体公布。
RouterOS将配置和会话监控分为三个菜单:
连接菜单 (
/routing/bgp/connection)会话菜单 (
/routing/bgp/session)模板菜单 (
/routing/bgp/template)
连接菜单
看一个非常基本的eBGP配置例子,假设Router1的IP是192.168.1.1,AS 65531,Router2的IP是192.168.1.2,AS 65532:
#Router1
/routing/bgp/connection
add name=toR2 remote.address=192.168.1.2 as=65531 local.role=ebgp
#Router2
/routing/bgp/connection
add name=toR1 remote.address=192.168.1.1 as=65532 local.role=ebgp
BGP连接菜单定义了BGP出站连接,并作为入站BGP连接的模板匹配器。
local.role 参数用来表示该连接将是eBGP。另外,注意该连接不需要指定远程AS号,RouterOS可以从第一个收到的 OPEN 消息中动态地确定远程AS号。
与其他厂商和旧版RouterOS "update-source "相当的参数是 "local.address"。在大多数情况下,它可以不配置,让路由器决定地址。
如果没有指定本地地址,BGP将根据当前的设置尝试猜测本地地址:
如果对等体是iBGP
如果回环地址可用
选择最高的回环地址
如果环回地址不可用
挑选路由器上的任何最高IP地址
如果对等体是eBGP
如果远程对等体的IP不是来自直接连接的网络:
并且没有设置multihop,则抛出一个错误
并且多跳被启用:
如果回环地址可用
选择最高的回环地址
如果环回地址不可用
选取路由器上任何一个最高的IP地址
如果远程对等体的IP来自直接连接的网络:
并且没有设置多跳:
挑选该连接网络中的本地路由器的IP地址
并且多跳被设置:
如果回环地址可用
选择最高的回环地址
如果环回地址不可用
挑选路由器上的任何最高IP地址
除了特定于连接的参数,特定于模板的参数也直接暴露在这个菜单中,以便在简单的情况下更容易配置(当模板没有必要时)。
所有连接特定参数的列表可以在下表中看到:
属性 | 说明 | |
name (string; Default: ) | BGP连接的名称 | |
connect (yes | no; Default: yes) | 是否允许路由器启动连接。 | |
listen (yes | no; Default: yes) | 是否监听进入的连接。 | |
local - 一组与连接的本地侧相关的参数 | ||
.address (IPv4/6; Default::: ) | 本地连接地址。 | |
.port(integer [0..65535]; Default:179 ) | 本地连接端口。 | |
.role(ebgp| ebgp-customer| ebgp-peer| ebgp-provider | ebgp-rs | ebgp-rs-client | ibgp | ibgp-rr | ibgp-rr-client; Default: ) | BGP角色,在大多数常见情况下,应该设置为iBGP或eBGP。关于BGP角色的更多信息可以在相应的RFC草案中找到 https://datatracker.ietf.org/doc/draft-ietf-idr-bgp-open-policy/?include_text=1 | |
.ttl (integer [1..255]; Default:) | 将被记录在发送的TCP数据包中的生存时间(跳数限制)。 | |
remote - 一组与连接的远程端相关的参数 | ||
.address (IPv4/6; Default: | 用于连接或监听的远程地址。 | |
.port(integer [0..65535]; Default:179 ) | 本地连接端口。 | |
.as(integer []; Default: ) | 远程AS号码。如果不指定,BGP将从OPEN消息中自动确定远程AS。 | |
.allow-as() | 允许连接的远程AS号码列表。对于动态对等体配置很有用。 | |
.ttl (integer [1..255]; Default:) | 可接受的最小生存时间,该TCP连接的跳数限制。例如,如果 'ttl=255',那么只有单跳的邻居才能建立连接。这个属性只影响EBGP对等体。 | |
tcp-md5-key (string; Default: ) | 用于用RFC 2385中描述的TCP MD5签名验证连接的密钥。如果不指定,则不使用认证。 | |
templates (name[,name]; Default: default) | 模板名称列表,用于继承参数。对动态BGP对等体很有用。 | |
会话菜单
要查看具有选定模板参数和协商能力的实际活动会话,请参考BGP会话菜单:
[admin@MikroTik] /routing/bgp/session> print
Flags: E - established
0 E name="toR2"
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会话失效时减轻大量路由表的重新计算。
另外,在这个菜单中,有一组针对会话的命令。
| 命令 | 说明 |
|---|---|
| clear | 清除会话标志。例如,为了能够在达到前缀限制后重新建立一个会话,必须清除 "limit-exceeded "标志。可以通过指定"flag"参数来实现,该参数可以取以下值: - 输入-最后通知 - 超限 - 输出-最后通知 - 被拒绝的上限 - 停止 |
| dump-saved-advertisements | 将指定BGP会话中保存的通告转*.pcap文件中。存储数据的文件名由"save-to"参数设置。 |
| refresh | 向指定的BGP会话发送路由刷新。用于触发重新发送来自远程对等体的所有路由。"address-family "参数允许指定为哪个地址族发送路由刷新。 |
| resend | 向指定的BGP会话发送前缀。该命令需要两个参数: - "address-family" - 参数允许指定为哪个地址族重新发送前缀。 - "save-to" - 转载重新发送的信息的pcap文件名,可用于调试目的。 |
| reset | 重置指定的BGP会话。 |
| stop | 停止指定的BGP会话。 |
模板菜单
模板包含所有与BGP协议相关的配置选项。可以作为动态对等体的模板,并将类似的配置应用于一组对等体。注意,这与Cisco设备上的对等体组不一样,在Cisco设备上,对等体组不仅仅是一个普通的配置。
可用的模板参数列表:
属性 | 说明 | |
add-path-out (all | none; Default: ) | ||
address-families (ip | ipv6 | l2vpn | l2vpn-cisco | vpnv4; Default: ip) | 该对等体将交换路由信息的地址族列表。远程对等体必须支持(通常是支持)BGP功能的可选参数,以协商IP以外的任何其他族。 | |
as (integer [0..4294967295]; Default: ) | 32位BGP自治系统编号。值可以用AS-Plain和AS-Dot格式输入。该参数还用于设置BGP邦联,格式如下: confederation_as/as。例如,如果AS是34,联盟AS是43,那么作为配置应该是as=43/34。 | |
as-override (yes| no; Default: no) | 如果设置了,那么在向该对等体发送路由更新之前,BGP AS-PATH属性中的所有远程对等体的AS号都会被替换为本地AS号。这发生在路由过滤和预处理之前。 | |
cisco-vpls-nlri-len-fmt (auto-bits | auto-bytes| bits| bytes; Default: ) | VPLS NLRI长度格式类型。用于与Cisco VPLS兼容。 | |
cluster-id (IP address; Default: ) | 如果这个实例是一个路由反射器:这个实例所属的路由器反射器集群的集群ID。这个属性有助于识别来自本集群中另一个路由反射器的路由更新,避免路由信息的循环。注意,通常一个集群中只有一个路由反射器;在这种情况下,不需要配置 'cluster-id',而是使用BGP路由器的ID。 | |
disabled (yes | no; Default: no) | 模板是否被禁用。 | |
hold-time (time[3s..1h] | infinity; Default: 3m) | 指定与对等体协商时要使用的BGP保持时间值。 | |
input - 一组与BGP输入相关的参数 | ||
.accept-comunities (string; Default: ) | 一个快速的方法来过滤传入的特定社区的更新。允许在传入的信息被解析并存储在内存中之前直接过滤,这样可以大大减少内存的使用。常规的输入过滤链只能拒绝前缀,这意味着它仍然会占用内存,并在/routing路由表中显示为 "未激活,已过滤"。要应用的变化需要会话刷新。 | |
.accept-ext-communities(string; Default: ) | 一种快速的方法来过滤进入的特定扩展社区的更新。允许在传入的消息被解析并存储在内存中之前直接过滤,这样可以大大减少内存的使用。常规的输入过滤链只能拒绝前缀,这意味着它仍然会占用内存,并在/routing路由表中显示为 "未激活,已过滤"。要应用的变化需要会话刷新。 | |
.accept-large-comunities (string; Default: ) | 一个快速的方法来过滤传入的特定大型社区的更新。允许在传入的信息被解析并存储在内存中之前直接过滤,这样可以大大减少内存的使用。常规的输入过滤链只能拒绝前缀,这意味着它仍然会占用内存,并在/routing路由表中显示为 "未激活,已过滤"。要应用的变化需要会话刷新。 | |
.accept-nlri(string; Default: ) | ipv4/6地址列表的名称。一种快速的方法来过滤带有特定NLRI的传入更新。可以在传入的消息被解析并存储在内存中之前直接过滤,这样可以大大减少内存的使用。常规的输入过滤链只能拒绝前缀,这意味着它仍然会占用内存,并在/routing路由表中显示为 "未激活,已过滤"。要应用的变化需要重新启动会话。 | |
.accept-unknown(string; Default: ) | 一种快速的方法来过滤带有特定 "未知 "属性的传入更新。允许在传入的消息被解析并存储在内存中之前直接过滤,这样可以大大减少内存的使用。常规的输入过滤链只能拒绝前缀,这意味着它仍然会占用内存,并在/routing路由表中显示为 "未激活,已过滤"。要应用的变化需要会话刷新。 | |
.affinity(afi | alone | instance | main | remote-as | vrf; Default: ) | 配置输入多核处理。在 路由协议多核支持 文章中阅读更多内容。 | |
.allow-as (integer [0..10]; Default: ) | 表示在AS-PATH中允许自己的AS号码出现多少次,然后再丢弃一个前缀。 | |
.filter (name; Default: ) | 输入前缀的路由过滤链的名称。这发生在NLRIs被处理之后。如果没有指定链,那么BGP默认接受一切。 | |
最佳路径选择
BGP路由器可以从多个供应商那里收到多份全局路由表。
应该有一些方法来比较这些多个BGP路由表,并选择通往目的地的最佳路由,解决方案就是BGP最佳路径选择算法。
只有当路由是有效的,该算法才会对其进行评估。一般来说,在以下情况下,该路由被认为是有效的:
路由的NEXT_HOP是有效的和可到达的
从外部对等体收到的AS_PATH不包含本地AS
该路由没有被路由过滤器拒绝
更多信息请阅读 节点选择和验证
最佳路径算法还比较了仅由 个BGP实例 收到的路由。由不同BGP实例安装的路由通过一般算法进行比较,即比较路由距离,优先选择距离较小的路由。
如果所有的标准都满足,就会采取以下行动:
收到的第一条路径自动被认为是 "最佳路径"。任何进一步收到的路径将与第一个收到的路径进行比较,以确定新的路径是否更好。
优先选择具有最高权重的路径。 这个参数不是BGP标准的一部分,它的发明是为了快速在本地选择最佳路径。参数是路由器的本地参数(在BGP输入中用路由过滤器分配),不能被公布。没有分配WEIGHT的路由,其默认值为0。
优先选择具有最高 LOCAL_PREF 的路径。 这个属性只在一个AS内使用。没有LOCAL_PREF属性的路径,默认值为100。
优先选择具有最短 AS_PATH 的路径。(如果
input.ignore-as-path-len设置为 yes,则跳过)。 每个AS_SET算作1,与集合的大小无关。AS_CONFED_SEQUENCE和AS_CONFED_SET不包括在AS_PATH长度内。优先选择通过聚合或BGP网络在本地产生的路径
优先选择具有最低 ORIGIN 类型的路径。
内部网关协议(IGP)低于外部网关协议(EGP),而EGP低于INCOMPLETE
换言之,IGP < EGP < INCOMPLETE。
优先选择具有最低 多出口判别器 (MED)的路径。
路由器只对具有相同相邻(最左)AS的路径比较MED属性。没有明确MED值的路径以MED为0处理。
优先选择 eBGP 而不是 iBGP 路径
优先选择来自具有最低 路由器ID 的BGP路由器的路由。如果路由带有 ORIGINATOR_ID 属性,则使用 ORIGINATOR_ID 而不是路由器ID。
优先选择具有最短的 路由反射集群列表 的路由。没有群集列表的路由被认为具有长度为0的群集列表。
优先选择来自最低邻居地址的路径
路由过滤器注意事项
在BGP输出时,路由过滤器在BGP本身修改属性之前执行,例如,如果 nexthop-choice 被设置为 force-self,那么路由过滤器中设置的网关将被覆盖掉。
在BGP输入中,路由过滤器被应用于接收到的属性,这意味着,例如,无论 nexhop-choice 的值是什么,设置网关都会起作用。
运行一个以上的实例
为了使最佳路径选择正常工作,BGP路由必须从同一个实例接收。但在某些情况下,有必要运行多个BGP实例,并有各自独立的表。 BGP通过比较配置的本地路由器ID来确定会话是否属于同一实例。
例如,下面的配置将在自己的BGP实例中运行每个对等体
/routing/bgp/connection
add name=inst1_peer remote.address=192.168.1.1 as=1234 local.role=ebgp router-id=1.1.1.1
add name=inst2_peer remote.address=192.168.1.2 as=5678 local.role=ebgp router-id=2.2.2.2
当没有指定 "router-id"时,BGP将从"/routing id "中挑选 "默认 "ID。
VPLS
Sub Menu: /routing/bgp/vpls
该菜单列出了所有配置的基于BGP的VPLS实例。这些实例允许路由器公布VPLS BGP NLRI,并表明路由器属于特定的客户VPLS网络。
基于MP-BGP的自动发现和信令(RFC 4761)。
基于Cisco VPLS BGP的自动发现(草案-ietf-l2vpn-signaling-08)。
支持基于BGP的VPLS的多个导入导出路由目标扩展社区(两者,RFC 4761和draft-ietf-l2vpn-signaling-08)。
| 属性 | 说明 |
|---|---|
| bridge (name) | 动态创建的VPLS接口应添加为端口的网桥名称。 |
| bridge-cost (integer [0..4294967295]) | |
| bridge-horizon (none| integer [0..4294967295]) | 如果设置为无,则不使用桥接水平线。 |
| cisco-id () | 唯一标识符。必须为cisco风格的VPLS信令设置一个参数。在大多数情况下,不应该使用这个参数,任何现代软件都支持RFC 4761风格的信令(见site-id参数)。参数是l2-router-id和RD的合并,例如:10.155.155.1&6550:123 |
| comment (string) | 项目的简短描述 |
| disabled (yes | no) | 定义一个项目是被忽略还是被使用。 |
| export-route-target (list of RTs) | 该设置用一个或多个路由目标来标记BGP NLRI,在远端被 import-route-targets 使用。 |
| import-route-targets (list of RTs) | 该设置用于通过比较从BGP NLRI收到的路由目标,确定BGP NLRI是否与某个特定的VPLS有关。 |
| local-pref (integer[0..4294967295]) | |
| name (string; Default: ) | |
| pw-control-word (default | disabled| enabled) | 启用禁用控制词的使用。在 VPLS Control Word 文章中阅读更多内容。 |
| pw-l2mtu (integer[32..65535]) | 通告中的伪MTU值。 |
| pw-type (raw-ethernet| tagged-ethernet| vpls) | 该参数从v5.16开始可用。允许在NLRI中选择公布的封装方式,只用于比较。它并不影响隧道的功能。 见pw-type使用例子 |
| rd (string) | 指定附加在VPLS NLRI上的值,以便接收的路由器能够区分可能看起来相同的通告。这意味着必须为每个VPLS使用一个独特的路由区分器。没有必要在所有路由器上为某些VPLS使用相同的路由区分器,因为区分器不用于确定某些BGP NLRI是否与特定的VPLS有关(路由目标属性用于此),但必须为不同的VPLS设置不同的区分器。接受3种类型的格式。阅读更多 |
| site-id (integer [0..65535]) | 唯一的网站标识符。每个站点必须有一个唯一的站点ID。必须为RFC 4761风格的VPLS信令设置一个参数。 |
| vrf (name) | VRF表名称。 |
VPN
Sub Menu: /routing/bgp/vpn
Route Distinguisher
路由区分器是一个64位的整数,分为三个部分:类型(2个字节)、管理员和值。
目前,有三种格式类型的定义。
| 2bytes | 2bytes | 2bytes | 2bytes |
|---|---|---|---|
| Type1 | ASN | 4byte value | |
| Type2 | 4-byte IP | value | |
| Type3 | 4-byte ASN | value |
属性
| disabled (yes | no) | ||
| export - 一组与vpnv4出口相关的参数。 | ||
| .filter-chain (name) | 路由过滤链的名称,用于在输出前过滤前缀。 | |
| .filter-select(name) | 选择过滤器链的名称,用于选择要导出的前缀导出。 | |
| .redistribute(bgp | connected | dhcp | fantasy | modem | ospf | rip | static | vpn) | 启用从VRF到VPNv4的指定路由类型的再分配。 | |
| .route-targets(rt[,rt]) | 输出VPNv4路由时添加的路由目标列表。接受的RT格式与路由区分器的格式类似。 | |
| import - 一组与vpnv4导入相关的参数。 | ||
| .filter-chain (name) | 路由过滤链的名称,用于在导入时过滤前缀。 | |
| .route-targets(rt[,rt]) | 将用于导入VPNv4路由的路由目标列表。接受的RT格式与路由区分器的格式类似。 | |
| .router-id(name | ip) | 将用于BGP最佳路径选择算法的BGP实例的路由器ID。 | |
| label-allocation-policy (per-prefix | per-vrf) | ||
| name | ||
| route-distinguisher (rd) | 有助于区分来自多个VRF的重叠路由。每个VRF应该是唯一的。接受3种类型的格式。 阅读更多>> | |
| vrf (name) | 该VPN实例将使用的VRF表的名称。 | |