FRR BGP 协议分析2 -- 创建对等体的命令分析

本文深入解析BGP的基本配置与对等体创建过程,包括BGP对象的创建、router-id设置、地址族初始化及对等体管理。通过分析BGP的代码实现,帮助读者理解BGP的工作原理和配置细节。

本次继续分析BGP最简单的配置的代码实现,这样大家对BGP的框架会有进一步的熟悉:

router bgp 200

bgp router-id 2.2.2.2

 neighbor 3.3.3.3 remote-as 200

 neighbor 3.3.3.3 update-source 2.2.2.2

 

router bgp XX

命令执行函数是router_bgp_cmd,主要完成以下几点:

  1. 根据参数查找bgp 对象是否存在,第一个配置的route bgp XX将作为default,后续带vrf的将作为新的bgp对象
  2. 如果bgp对象不存在,则需要重新创建一个bgp对象,struct bgp *bgp,所有的bgp对象存放在struct bgp_master *bm链表里面,此时BGP 最重要,贯穿全局的顶级结构体struct bgp闪亮登场,后续都会和这个结构体打交道,和bgp相关的几乎都在这里面,也是BGP最大的一个结构体。

 

3、创建bgp对象是bgp_get函数,调用如下的几个函数:

  1. bgp_create 函数会创建新的struct bgp结构,并初始化里面很多的值和数据结构,其中最重要的peer对象,我们在下一个命令在分析
  2. bgp_router_id_set 处理router_id
  3. bgp_address_init 建立 bgp address的HASH ??什么地址?
  4. bgp_tip_hash_init ??
  5. bgp_scan_init 没懂,后续再补充
  6. 处理VRF相关的事情
  7. bgp_handle_socket 创建对应的socket,bgp是使用TCP 建立连接的,建立socker服务端,监听179端口,等待peer端的connect接入,其中会处理和VRF相关的socker创建的细节
  8. listnode_add(bm->bgp, bgp) -》加入全局的bgp链表

 

neighbor 3.3.3.3 remote-as 200

neighbor peer remote-as 命令就是配置一个对等体,peer是指对等体的地址(ipv4,ipv6地址),可以看到,bgp对等体之间是单播通信和OSPF协议的组播是不一样的。

对于路由协议,不管是基于3层的还是2层的,都需要建立自己的寻路数据库,也就是通过邻居找到下一跳,你要走的远,你就得认识更多邻居,以及邻居的邻居,好比一句老话,在家靠父母,出门靠朋友,朋友多路好走,就这么一个道理。

那么话又说回来了,创建对等体呢,就是给自己找邻居,找朋友,不过呢,BGP这个人呢,更像一个干中介的,比如卖房的中介,他自己不建房子,只把建好的房源介绍给要买房的人,同时还维护这个房源信息库,及时更新已经卖掉的房子。

peer_remote_as_vty处理CLI的命令,

如果传给peer的值不是一个合法的地址,那么会被当做是一个peer group/interface名称来处理,如果是合法的,检查下地址是否是本地的,如果不是,peer_remote_as 则开始peer创建的奇妙之旅。

按照国际惯例,查找一下是不是已经为这个peer地址创建了peer,如果peer地址相同,as值不一样,就修改一下peer的as值,如果这个peer已经是某个group的成员,那么就不能成功创建对等体关系了。

如果上面的事情都没有发生,那么就可以创建一个新的对等体了,peer_create负责创我们的peer:

  • 创建一个新的peer结构,并给里面的status赋值为Idle,端口号 BGP_PORT_DEFAULT = 179,初始化大部分的数据结构。
  • 初始化peer的ibuf和obuf来收发报文

  • peer会加入bgp->peer的链表,以及peerhash的HASH表里面
  • 在把peer加入对应的地址族里面

  • 最后,将这个peer加入到定时器任务中:

 

开启start timer定时器,定时器到期后,开始peer的状态机协商,最简单的配置已经分析完成,后面开始BGP 状态机的协商和分析。

<think>我们正在讨论FRRouting (FRR) 中的 `reject-as-sets` 特性。根据用户引用的内容,尤其是引用[1]中提到:“此命令允许拒绝具有AS_SET 或AS_CONFED_SET 类型的incoming and outgoing routes。” 这似乎与之前讨论的Juniper和Cisco中的聚合行为有所不同。在FRR中,`reject-as-sets` 是一个全局命令,用于过滤路由,而不是在聚合路由时控制AS_PATH属性的生成。 让我们重新梳理: 在FRR中,`reject-as-sets` 命令的作用是:拒绝任何包含AS_SET或AS_CONFED_SET属性的路由。这意味着: - 对于传入的路由(incoming routes):如果路由的AS_PATH属性中包含AS_SET或AS_CONFED_SET,则拒绝接受该路由。 - 对于传出的路由(outgoing routes):如果路由的AS_PATH属性中包含AS_SET或AS_CONFED_SET,则拒绝发布该路由。 而之前讨论的Juniper中的`reject-as-set`(注意,Juniper中是`reject-as-set`,没有s)是在路由聚合时禁用AS_SET的生成,即生成聚合路由时不再使用AS_SET属性。 因此,FRR中的`reject-as-sets`实际上是一个路由过滤功能,而Juniper中的`reject-as-set`是聚合行为控制。 现在,针对用户的问题:FRRBGP reject-as-sets的使用、配置及相关信息。 我们可以这样回答: 1. **作用**:FRR中的`reject-as-sets`命令用于全局过滤带有AS_SET或AS_CONFED_SET属性的BGP路由。这些属性通常出现在聚合路由中,但有时也可能出现在其他场景(如路由服务器)。使用该命令可以避免处理这类路由,因为AS_SET是无序的AS集合,可能导致路由振荡或策略匹配困难。 2. **配置方法**:在FRR中,该命令是一个全局BGP命令,配置在BGP路由进程下。 示例配置: ``` router bgp <ASN> bgp reject-as-sets ``` 3. **注意事项**: - 启用后,任何包含AS_SET或AS_CONFED_SET的路由都会被拒绝(无论接收还是发送)。 -命令主要用于避免AS_SET带来的问题,但同时也可能导致某些聚合路由被过滤,因此需要谨慎使用。 - 在需要接收或发送聚合路由且这些聚合路由包含AS_SET的场景下,不应启用此命令。 4. **与聚合生成AS_SET的关系**:在FRR中,如果要控制聚合路由是否生成AS_SET属性,需要在聚合配置中设置。例如,在配置聚合路由时,默认是生成AS_SET的,可以通过`as-set`选项来控制: - 启用AS_SET:`aggregate-address <prefix> as-set` - 禁用AS_SET:`aggregate-address <prefix>`(不添加`as-set`参数) 注意:`bgp reject-as-sets`命令与聚合路由的生成是独立的。即使你在聚合时生成了AS_SET(即使用了`as-set`参数),但由于全局配置了`bgp reject-as-sets`,那么这条聚合路由也会被过滤掉(因为包含AS_SET)。因此,两者不可同时使用。 5. **典型场景**: - 在不需要处理任何包含AS_SET的路由时(比如,你的网络只接受明确AS_PATH的路由,且不进行需要保留AS_SET的聚合)。 - 在希望避免AS_SET导致的路由振荡时。 6. **验证**: 可以使用`show bgp`命令查看路由,如果配置了`reject-as-sets`,则不应该看到任何AS_PATH中包含`{ }`(表示AS_SET)或`( )`(表示AS_CONFED_SET)的路由。 7. **与其他厂商的对比**: - 类似于Juniper的`reject-as-set`聚合选项?不,Juniper的`reject-as-set`是在聚合时控制,而FRR的`reject-as-sets`是全局过滤。 - 在Cisco中,没有直接的等效命令。Cisco可以使用路由策略(route-map)来匹配AS_PATH中的AS_SET并拒绝,但需要手动配置。 8. **示例**: 假设我们有一个BGP路由器,ASN为65000,我们希望拒绝所有带有AS_SET或AS_CONFED_SET的路由。 ``` router bgp 65000 bgp reject-as-sets neighbor 192.0.2.1 remote-as 65001 ``` 这样,从邻居192.0.2.1接收的路由中,如果包含AS_SET或AS_CONFED_SET,将被丢弃;同样,也不会向邻居发送包含这些属性的路由。 9. **注意事项**: - 在路由反射器场景中,通常不建议使用AS_SET,因为反射器可能会反射聚合路由,而AS_SET的变化会引起路由振荡。因此,在RR上配置`reject-as-sets`可以防止这类路由传播[^3]。 现在,根据以上整理,给出回答。 </think>### FRRouting (FRR) 中 `bgp reject-as-sets` 详解 在 FRR 中,`bgp reject-as-sets` 是一个**全局 BGP 命令**,用于过滤包含 `AS_SET` 或 `AS_CONFED_SET` 属性的路由。其核心作用是增强路由稳定性并简化策略管理[^1]。 --- #### 一、**核心功能** 1. **路由过滤机制** - 拒绝接收或发送任何包含 `AS_SET` 或 `AS_CONFED_SET` 的路由 - 阻止因 `AS_SET` 无序性引发的路由振荡(Route Flapping)[^1] - 减少路由更新消息量,降低控制平面负载 2. **与聚合路由的关系** - **不同于** Juniper/Cisco 的聚合配置(如 `aggregate as-set`) -FRR 中,`bgp reject-as-sets` 是全局过滤器,**独立于路由聚合行为** - 即使聚合路由生成 `AS_SET`,此命令仍会将其过滤 --- #### 二、**配置方法** ```bash router bgp 65000 ! 启用全局 AS_SET 过滤 bgp reject-as-sets ! neighbor 192.0.2.1 remote-as 65001 address-family ipv4 unicast ! 可选:在特定地址族下抑制重复更新 bgp suppress-duplicates exit-address-family ``` **关键参数说明**: - `bgp reject-as-sets`:全局拒绝包含 `AS_SET` 或 `AS_CONFED_SET` 的路由 - `bgp suppress-duplicates`:抑制重复路由更新(增强稳定性)[^1] --- #### 三、**工作流程** ```mermaid graph TD A[接收 BGP 路由] --> B{检查 AS_PATH} B -->|包含 AS_SET/AS_CONFED_SET| C[丢弃路由] B -->|不包含| D[正常处理路由] E[发送 BGP 路由] --> F{检查 AS_PATH} F -->|包含 AS_SET/AS_CONFED_SET| G[阻止发送] F -->|不包含| H[正常通告] ``` --- #### 四、**典型应用场景** | **场景** | **配置建议** | **原因** | |-------------------------|-------------------|-----------------------------------| | 路由反射器环境 | 推荐启用 | 避免 AS_SET 在 iBGP 域内传播[^3] | | 需要严格路由策略匹配 | 推荐启用 | 消除 AS_SET 对正则匹配的干扰 | | 对接外部路由服务器 | 推荐启用 | 过滤可能携带 AS_SET 的 IXP 路由 | | 依赖 AS_SET 的聚合场景 | **禁用** | 否则会过滤掉聚合路由 | --- #### 五、**验证与排查** 1. **查看过滤效果** ```bash show bgp ipv4 unicast # 检查路由表是否无 { } 或 ( ) 符号 ``` - `{}` 表示 `AS_SET`,`()` 表示 `AS_CONFED_SET` 2. **监控日志** ```bash debug bgp updates ``` - 观察日志中的 `denied due to AS_SET/AS_CONFED_SET` 条目 --- #### 六、**注意事项** 1. **与聚合命令的冲突** - 若同时使用 `aggregate-address ... as-set`,聚合路由会被本命令过滤 - 解决方案: ```bash ! 禁用聚合中的 AS_SET 生成 → 与 reject-as-sets 兼容 aggregate-address 192.168.0.0/16 ``` 2. **路由反射器特殊需求** - 在 RR 集群中启用可防止 AS_SET 传播到客户端[^3] - 但需确保客户端不依赖 AS_SET 的环路检测能力 3. **厂商兼容性** | **行为** | FRR | Cisco/Juniper | |------------------|-------------------------|-----------------------| | 过滤入口/出口路由| 是 (`bgp reject-as-sets`) | 需手动配置路由策略 | | 控制聚合路由生成 | 需配合 `aggregate-address` | 聚合命令直接控制 | --- ### 相关问题 1. 如何在 FRR 中区分过滤 `AS_SET` 和 `AS_CONFED_SET`? 2. `bgp reject-as-sets` 与 `bgp suppress-duplicates` 如何协同工作? 3. 在 RR 环境中启用 `reject-as-sets` 是否影响路由反射规则? 4. 如何通过路由策略实现类似 `reject-as-sets` 的选择性过滤? [^1]: 拒绝具有 AS_SET 或 AS_CONFED_SET 类型的 incoming and outgoing routes [^2]: 传递 BGP 路由信息 [^3]: Route Reflection 模式减少 BGP Peer 连接数量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值