BGPv4特性探究-8@Flow Specification-RFC8955
个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
- 关于BGP version4相关内容,可参考2006年发布的RFC4271-A Border Gateway Protocol 4;
- 关于BGP Route-Reflect相关内容,可参考2006年发布的RFC4456-BGP Route Reflection:An Alternative to Full Mesh Internal BGP;
- 关于BGP Confederations相关内容,可参考2007年发布的RFC5065-Autonomous System Confederations for BGP;
- 关于BGP可通告Capability相关内容,可参考2009年发布的RFC5492-Capabilities Advertisement with BGP-4;
- 关于4字节AS Number相关内容,可参考2012年发布的RFC6793-BGP Support for Four-Octet Autonomous System Number Space;
自动换行
其他相关资料:
- 关于BGP的Capability Codes详细参数,可参考IANA发布的Capability Codes;
- 关于BGP的其他参数字段的详细内容,可参考IANA发布的Border Gateway Protocol (BGP) Parameters;
- 关于BGP的AFI相关参数,可参考IANA发布的Address Family Numbers;
- 关于BGP的SAFI相关参数,可参考IANA发布的Subsequent Address Family Identifiers (SAFI) Parameters;
- 关于BGP Extended Community Sub-Types,可参考IANA发布的Border Gateway Protocol Extended Communities;
- 关于常用TCP/UDP知名端口的定义,可参考IANA发布的Service Name and Transport Protocol Port Number Registry。
......
Border Gateway Protocol自1989年定义以来已经历过4个版本:1989年RFC1105的Version1,1990年RFC1163的Version2,1991年RFC1267的Version3,1994年RFC1654的Version4。而V4又历经了几次迭代,到目前比较全面完整的是2006年发布的RFC4271。
本文档旨在介绍相关原理,对于不同设备及厂家的实现上不做深究。有意者建议阅读相关资料。个人能力有限,如有疑问欢迎留言指导~
目录
1.相关术语和概念
BGP(Border Gateway Protocol,边界网关协议) 是一个 AS(Autonomous System,自治系统) 间的路由协议。BGP 的主要功能是与其他 BGP 系统交换网络可达性信息。
为便于介绍,在此先介绍一些关于BGP的相关术语:
Autonomous System自治系统
单个路由协议管理下的一组路由器,使用内部网关协议(IGP)和通用度量来确定如何在AS内路由数据包。如果一个AS内运行了多个IGP协议,对于其他AS来说也认为其执行了内部一致的路由规则。
三张处理表/库
1@--Adj-RIB-In:邻居入方向的路由信息表/库。用于描述对等体向自己传输的完整路由信息。该路由表未进行入方向的路由策略。
2@--Adj-RIB-Out:邻居出方向的路由信息表/库。用于描述自己向对等体描述的路由信息,或者放置于Update消息报文中的路由信息。该路由表已进行出方向的路由策略。
3@--Loc-RIB:放置已被本地BGP以便进行选择的路由。该路由表已进行入方向的路由策略。
因此有如下的路由处理过程:
简单来说Adj-RIB-In和Adj-RIB-Out是放置于Update报文中的路由信息。
NLRI
Network Layer Reachability Information,网络层可达信息。放置于Update报文中,主要描述了路由信息或路由的相关属性。
IBGP/EBGP
Internal和External BGP,简单来说为相同AS的对等体关系为IBGP邻居,相反为EBGP。
相关概念:
1@:BGP 使用 TCP 的 179 端口进行相关协议报文的发送和监听。
2@:在建立了完整的 BGP 对等体关系后,BGP 只发送增量更新。而非周期性泛洪或刷新路由表。
因此 BGP 为了使路由有正确的结果需要 TCP 周期保活或使用Route-Refrsh路由刷新。
BGP 提供了如下三种机制进行路由更改:
1@:发送withdraw类型的Update报文,将该路由进行撤销
2@:发送具有相同NLRI的Update报文,进行更新。通过此种方式可以更改路由的属性。
3@:中断BGP连接。
关于 BGP 基本原理的相关内容,可参考博客-BGPv4-原理介绍+报文分析+配置示例。
2.BGP Flow Specification For IPv4
2.1.基本原理
在《RFC8955-Dissemination of Flow Specification Rules》中新定义了 BGP SAFI 133 = Dissemination of Flow Specification rules 和 BGP SAFI 134 = L3VPN Dissemination of Flow Specification rules 两种 SAFI 子地址组类型。通过将数据流的源目的前缀、IP 协议号、TCP 端口号等多元组信息编码入这种新的 BGP NLRI 信息,网络监管者可以实现流量过滤的自动域间协调,缓解 DoS 和 DDoS 攻击或实现 BGP/MPLS VPN 服务上下文中的流量过滤,以及在 SDN 环境中用于流量的集中控制,等多种功能。
经 Flow Specification 扩展的路由信息,路由设备可以将其应用到接口上并通过诸如 ACL 或防火墙技术来控制数据的转发行为。Flow Specification 可被视为携带更详细信息的单播前缀,并且应用到对单播数据的转发过程中。
在《RFC8956-Dissemination of Flow Specification Rules for IPv6》中定义了 IPv6 网络下的 Flow Specification 标准。其基本原理相似,此处不再进行相关介绍。
1@Flow Specifications基本概念:
1@:Flow Specifications 是一个 n 元组策略,由多个可匹配 IP 流量的标准组成。如果给定的 IP 数据包与所有指定的条件匹配,则称为与定义的 FS 匹配。
2@:给定的 FS 标准可能是一系列属性的集合。在《RFC8955-Dissemination of Flow Specification Rules》中定义可进行匹配 IP 数据包的标准有 12 种:Type 1 - Destination Prefix、Type 2 - Source Prefix、Type 3 - IP Protocol、Type 4 - Port、Type 5 - Destination Port、Type 6 - Source Port、Type 7 - ICMP Type、Type 8 - ICMP Code、Type 9 - TCP Flags、Type 10 - Packet Length、Type 11 - DSCP (Diffserv Code Point)、Type 12 - Fragment。
3@:特定的 FS 策略应与 <AFI,SAFI> 及其对应的 RIB 路由信息表相对应。 例如,IPv4 FS 的 <AFI 1 = IPv4,SAFI 133 = Dissemination of Flow Specification rules> 应与 IPv4 Unicast 的 <AFI 1 = IPv4,SAFI 1 = NLRI used for unicast forwarding> 地址族对应。
4@:标准的 BGP 策略是通过 NLRI prefix 或 community 等属性来进行 UPDATE 消息的过滤。BGP FS NLRI-type 也必须满足此动作。
if-match flowspec destination ip-prefix 用来设置一个基于 BGP Flow Specification 路由 NLRI 中的m目的 IP 地址信息的匹配规则。
自动换行
if-match flowspec source ip-prefix 用来设置一个基于 BGP Flow Specification 路由 NLRI 中的源 IP 地址信息的匹配规则。
自动换行
2@Flow Specifications执行顺序:
多条 FS 规则可能匹配中同一条数据流,因此有必要定义 FS 匹配的顺序和具体生效的动作。FS 功能排序不依赖于 BGP 传递 FS 信息的先后顺序,在网络中是一致的。
1@:首先比较不同 FS 信息的最低级别的组件类型。具有最低 numeric type 的 FS 信息具有最高优先级。
2@:对于匹配 destination/source prefix 的 FS 信息,具有更具体前缀的 FS 具有最高优先级。否则选择具有最小 IP 的 FS 具有最高优先级。
3@:对于其他组件类型,除非另有定义,将组件数据转化为 2 进制字符串,随后使用《ISO_IEC_9899-Information technology -- Programming languages -- C》中定义的 memcmp() 函数进行比较。
- 如果组件数据转化的 2 进制字符串长相同,使用具有更小 string (memcmp) 函数值的 FS 信息具有更高优先级。
- 如果组件数据转化的 2 进制字符串长不同,比较其 2 进制数据的公共 prefix。如果公共 prefix 不相同,具有最小公共 prefix 的字符串具有更高优先级。如果公共 prefix 相同,具有最长的字符串具有更高优先级。
C 语言库标准库 <string.h> 中的 int memcmp(const void *str1, const void *str2, size_t n)) 函数用于把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
自动换行
3@Flow Specifications的验证程序:
1@:FS 的地址族类型必须相匹配。也即 FS NLRI SAFI 133 用于验证 SAFI 1 地址族,FS NLRI SAFI 134 用于验证 SAFI 128 地址族
2@:在没有显式配置的情况下,必须验证 FS NLRI。在当且仅当满足以下所有条件时才认为验证通过:
- FS 包含 destination prefix。
- FS 的发起方必须具有可与 FS 信息中 destination prefix 匹配的最佳单播路由。
- 与规则 2 中确定的最佳匹配单播路由相比,没有从不同相邻 AS 接收的“更具体”的单播路由。
3@:如果通过显式配置来允许 FS 信息不包含 destination prefix,那么规则 2 就没有实际意义,必须被忽略。
实际的应用似乎往往是显式匹配不进行验证,而不是显式允许 FS 信息不包含 destination prefix。
peer validation-disable 用于不验证从邻居收到的 FS 路由。
4@:BGP FS 路由的发起方是指 BGP Path Attributes Code 9 = ORIGINATOR_ID 属性中的地址或 BGP peer 的 source IP 地址。
HW 设备对于 FS 路由的验证策略。这里暗含一个策略是只对转发表中的 BGP 路由进行验证。地址族概念是暗含在 BGP 执行动作中的。
5@:建议必须强制检查从 eBGP 邻居收到 FS 路由的 BGP Path Attributes Code 2 = AS_PATH 属性。邻居的 AS Number 必须排列在该属性的最左侧。
route validation-mode include-as 命令用于验证额外验证 FS 路由。如果其 BGP Path Attributes Code 2 = AS_PATH 属性是否包含 AS_SET 和 AS_SEQUENCE 字段。如果验证通过,认为 BGP FS 路由是有效的。不通过则继续验证其 FS 信息中包含 destination prefix。
自动换行
《RFC8955-Dissemination of Flow Specification Rules》认为从 iBGP 邻居收到的 FS 策略已经经过验证。但实际应用时,似乎仍然对 iBGP 邻居发送而来的 FS 路由进行验证。
6@:最佳匹配单播路由可能会随时间变化。因此,每当单播路由发生变化时,都必须执行 FS NLRI 的重新验证。
2.2.编码格式
2.2.1.FS NLRI
此处所介绍的 BGP IPv4 FS 信息使用《RFC4760-Multiprotocol Extensions for BGP-4》中所定义的 MP_REACH_NLRI 进行 FS 路由信息传递。
因此实际上在进行 FS 路由传递之前,需要按照《RFC4760-Multiprotocol Extensions for BGP-4》中的要求首先在 BGP Open 消息阶段进行 <AFI,SAFI> 能力的协商。
BGP Path Attributes Code 14 = MP_REACH_NLRI:携带一组可到达的目标以及用于转发到这些目标的 Next Hop 信息。
Address Family Identifier与 Subsequent Address Family Identifier结合使用:结合使用于标识 Next Hop 中携带的地址必须属于的网络层协议集、 Next Hop 的地址的编码方式以及随后的 NLRI 的定义。 如果允许下 Next Hop 来自多个网络层协议,则 Next Hop 的编码必须提供一种确定其网络层协议的方法。
SAFI:
1-63: Standards Action;
64-127: First Come First Served;
128-240: Some recognized assignments below, others Reserved;
241-254: Reserved for Private Use.《RFC8955-Dissemination of Flow Specification Rules》中仅定义了 <AFI 1 = IPv4,SAFI 133 = Dissemination of Flow Specification rules> 和 <AFI 1 = IPv4,SAFI 134 = L3VPN Dissemination of Flow Specification rules>。IPv6 网络 (AFI = 2) 下的 FS NLRI 行为可参考《RFC8956-Dissemination of Flow Specification Rules for IPv6》。
Length of Next Hop Network Address:描述了下一跳地址长。
Network Address of Next Hop:下一跳信息。
当传递 BGP FS 信息时,Length of Next Hop Network Address 字段必须被置为 0,Network Address of Next Hop 必须被忽略。
Network Layer Reachability Information (NLRI):可变长度字段,它列出了此属性中通告的可行路由的 NLRI。
Flow Specification NLRI for IPv4 由上述部分组成。NLRI length 字段用于标识 NLRI value 字段的长度。
1@:如果 NLRI length 小于 240(0xF0) 字节,则 length 字段可以编码为单个字节。
2@:否则,length 字段被编码为 2 个字节值,其中最高值的半字节值为 0xF。
自动换行
FS NLRI 示例。
自动换行
NLRI Value Encoding:
FS NLRI Value 组件主要包含两种运算符:
1@=Numeric Operator:用于和数字进行匹配。
自动换行
2@=Bitmask Operator:用于和字符进行匹配。end-of-list bit:用于表示是否运算列表的最后,往往置位。
AND bit:置位用于表示逻辑且关系,往往不置位。
length bit:用于表示后续 value 字段的长度。len 00 = 后续长 1 字节;len 01 = 后续长 2 字节;len 10 = 后续长 4 字节;len 11 = 后续长 8 字节。
其余字段表示数字或字符的匹配关系。
1@Type 1 = Destination Prefix 和 Type 2 = Source Prefix:用于表示所进行匹配的 Destination/Source Prefix。以 <type (1 octet), length (1 octet), prefix (variable)> 的形式进行编码。
Prefix 匹配示例。
2@Type 3 = IP Protocol、Type 4 = Port、Type 5 = Destination Port 和 Type 6 = Source Port:用于表示所进行匹配的网络层信息。以 <type (1 octet), [numeric_op, value]+> 的形式进行编码。
网络层信息匹配示例。此处严格匹配 Protocol 6 = TCP,Port 464 = Kerberos 协议的数据包。
3@Type 7 = ICMP Type 和 Type 8 = ICMP Code:用于表示所进行匹配的 ICMP 信息。以 <type (1 octet), [numeric_op, value]+> 的形式进行编码。
ICMP 信息匹配示例。此处严格匹配 ICMP Type 100,ICMP code 0 的数据包。但实际上不存在此类 ICMP 包。
4@Type 9 = TCP Flags:用于表示所进行匹配的 TCP control bits 字段信息。以 <type (1 octet), [bitmask_op, bitmask]+> 的形式进行编码。
TCP Flags 信息匹配示例。此处严格匹配 TCP Flags = 0x0a 的数据包。
5@Type 10 = Packet Length 和 Type 11 = DSCP (Diffserv Code Point):用于表示所进行匹配的数据包特征信息。以 <type (1 octet), [numeric_op, value]+> 的形式进行编码。
6@Type 12 = Fragment:用于表示所进行是否分配。以 <type (1 octet), [bitmask_op, bitmask]+> 的形式进行编码。
IP Fragment 信息匹配示例。此处匹配 DF 不置位也即分片的数据包。
2.2.2.Traffic Filtering Actions
《RFC8955-Dissemination of Flow Specification Rules》中定义的 BGP FS 行为通过使用《RFC4360-BGP Extended Communities Attribute》中定义的 BGP Path Attributes Code 16 = EXTENDED COMMUNITIES 属性来携带被匹配流的具体动作。
Extended Communities
每一种 Extended Community 有 8 字节。其中 Type 字段分为 Type high 和 Type low:
Type high:1字节,主要用于描述 Extended Community 是 Regular 类型还是 Extended 类型。
这一字节的高位 bit 进行了定义又可分为 I-bit (IANA-bit 用于描述是否支持 First Come First Serve) 和 T-bit (Transitive-bit 用于描述是否支持在AS内传递。)。
自动换行
例如在《RFC7153-IANA Registries for BGP Extended Communities》中有区分:
- 0x00 为 Transitive Two-Octet AS-Specific Extended Community;
- 0x01 为 Transitive IPv4-Address-Specific Extended Community;
- 0x02 为 Transitive Four-Octet AS-Specific Extended Community;
- 0x03 为 Transitive Opaque Extended Community;
- 0x06 为 EVPN Extended Community;
等等 Type high 不在进行介绍,感兴趣者可自行查阅资料。
Type low:1字节,主要用于描述每种 Extended Community 的具体类型。
例如有
- 0x0002(RFC4360) 表示 Transitive Two-Octet AS-Specific 的 Route-Target。
- 0x0102(RFC4360) 表示 Transitive IPv4-Address-Specific 的 Route-Target。
- 0x0202(RFC5668) 表示 Transitive Four-octet AS 的 Route-Target。
- 0x0002(RFC5701/RFC7153) 表示 IPv6-Address-Specific Extended Community 下的 Route-Target。其与上述所描述的 Extended Community 最大区别在于IPv6 Address Specific extended community 长度为 20 字节而 IPv4 为 8 字节。该扩展团体属性由新定义的 BGP Path Attribute Type 26 = IPv6 Address Specific Extended Community 携带,用于纯 IPv6 环境。详情可查看《RFC5701-IPv6 Address Specific BGP Extended Community Attribute》。
这里几种 Route-Target 属性的区别是 Value 字段的组成格式不同,通常采用 0x0002 格式下的 Route-Target。这里不在进行进一步介绍,感兴趣者可查阅相关资料。
关于BGP Extended Community 的详细分类,可参考 IANA 发布的《Border Gateway Protocol Extended Communities》
自动换行
Traffic Filtering Action Extended Communities:
1@:匹配 FS 的默认流行为是接收数据包。
2@:所有的 Traffic Filtering Actions 都是 transitive BGP Extended Communities。
3@:一个 FS 路由可以携带多个 Traffic Filtering Action,这种情况下有可能发生不同 Actions 之间的冲突。例如,同时携带了 0x8006 = traffic-rate-bytes 和 0x800c = traffic-rate-packets 两种类型 Actions。但似乎《RFC8955-Dissemination of Flow Specification Rules》未明确说明处理原则。
1@0x8006 = traffic-rate-bytes:编码往往为 2 字节 AS Number + 4 字节 float 值。
- 2 字节 AS Number 往往使用本地 AS Number。该字段是信息性的,不具有实际应用意义。
- 当本地存在 4 字节 AS Numer 时,可取其最低 2 字节进行填充。
- 4 字节 float 值编码遵循《IEEE.754.1985-Standard for Binary Floating-Point Arithmetic》。用于携带最大速率信息,单位为字节每秒。流量速率为 0byte/s 表示丢弃特定流的所有流量。在编码时,流量速率不得为负。解码时,负值必须被视为 0byte/s。
Traffic Filtering Action Extended Communities 0x8006 = traffic-rate-bytes 示例。
2@0x800c = traffic-rate-packets:编码方式与 0x8006 = traffic-rate-bytes 相同,仅 4 字节 float 值表示最大包数,单位为包每秒。
3@0x8007 = traffic-action:编码为 6 字节。目前仅定义了第 6 个字节的最低 2 个 bits。
S-bit:Sample bit。置位时,表示为此 FS 启用流量采样和日志记录。
T-bit:Terminal Action bit。置位时,traffic filtering engine 将评估任何后续 FS。如果未设置,则在评估此 FS 时停止对流量过滤器的评估。其他字段必须置 0 并在解析时忽略。
Traffic Filtering Action Extended Communities 0x8007 = traffic-action 示例。
4@0x8008 = rt-redirect AS-2octe:编码往往为 2 字节 AS Number + 4 字节 float 值。用于允许将流量重定向到其 import policy 中列出的 VRF 路由实例。
5@0x8108 = rt-redirect IPv4:编码往往为 4 字节 IP address + 2 字节 float 值。用于允许将流量重定向到其 import policy 中列出的 VRF 路由实例。
6@0x8208 = rt-redirect AS-4octe:编码往往为 4 字节 AS Number + 2 字节 float 值。用于允许将流量重定向到其 import policy 中列出的 VRF 路由实例。
7@0x8009 = traffic-marking:编码为 6 字节。目前仅定义了第 6 个字节。用于将所匹配的 IP 数据包修改为对应的 DSCP 值。
DSCP:IP 包中的 DSCP 值。
reserved/r:必须置 0 并在解析时忽略。
自动换行
除上述介绍的几种 Traffic Filtering Action Extended Communities 外,目前在 Draft 中存在几种未标准化的 Traffic Filtering Action Extended Communities。感兴趣者可查看相关资料。
1@:《draft-Applying BGP flowspec rules on a specific interface set》中定义 0x0702/0x4702 = Interface-set extended community。
2@:《draft-BGP Flow-Spec Redirect-to-IP Action》中定义 0x080c = Redirect-to-IP Extended Communities。
3@:《draft-Flowspec Indirection-id Redirect》中定义 0x0900 = FlowSpec Redirect to indirection-id Extended Community。
2.3.配置示例
此处配置仅作示例展示,实际使用请参考相关文档。
自动换行
flowspec disable 用来配置在接口上去使能 BGP Flow Specification 功能。
HW 设备接口默认使能 BGP Flow Specification 功能。
flow-interface-group 用于定义部分端口执行特定 BGP Flow Specification 功能的接口。此时可将 flow-interface-group 绑定入对应的 flow-route 规则中。
此时,flow-route 规则中定义的 FS 路由也会携带 flow-interface-group ID 通过 0x0702 = Flowspec Interface-set extended community 向远端传递。
自动换行
在《draft-Applying BGP flowspec rules on a specific interface set》中新定义了 0x0702 = Flowspec Interface-set extended community。该属性可以携带并标识一组接口 Group Identifier,从而将特定的 FS 行为仅应用到这组接口上。
1@:Group Identifier 本身没有任何意义。网络管理员通过事先在本地与 Group Identifier 相关联的接口来实现特定接口的 FS 行为。
2@:使用这种方式时,除包含 Group Identifier 外还必须包含与之对应的过滤规则的方向。
3@:0x0702 = Flowspec Interface-set extended community 编码规范如下图所示。
4 字节 AS Number + outbound-bit(置位表示应用出方向) + inbound-bit(置位表示应用入方向) + 14-bit Group Identifier。
4@:不具有 interface-set 特征的默认 FS 行为应被应用到所有接口上。
自动换行
peer validation-disable 用于不验证从邻居收到的 FS 路由。
配置静态 FS 路由:
当 BGP-Flow 地址族视图下的对等体关系建立成功后,手工创建的 BGP Flow Specification 路由将被自动引入到 BGP 路由表中并发送给 BGP Flow Specification 对等体。
bgp 200
router-id 3.3.3.3
peer 2.2.2.2 as-number 200
peer 2.2.2.2 connect-interface LoopBack1
ipv4-family unicast
undo synchronization
import-route direct
peer 2.2.2.2 enable
ipv4-family flow
peer 2.2.2.2 enable
#
flow-route FlowSpec1
if-match destination 1.1.1.11 255.255.255.255
flow-interface-group 1
apply traffic-rate 100
#
flow-interface-group 1
interface Ethernet1/0/0
#
display bgp flow routing-table 用于查看 FS 路由。
自动换行
display bgp flow routing-table用于具体查看流量过滤规则信息。
更新
本文来自博客园,作者:m风行者,转载请注明原文链接:https://www.cnblogs.com/FengXingZhe008/p/18913251