赞
踩
Author:Once Day Date:2023年4月29日
本文是对6WIND官网文档的整理和翻译,仅供学习和研究之用,原始文章可参考下面文档:
高效架构的主要概念是几年前定义的,作为解决互联网流量爆炸所需的高速路由器设计的一部分。现在,这种架构已经扩展到新的服务,如第二层协议、安全性、移动性、多播等。
基于ip的设备可以划分为三个基本元素:数据平面、控制平面和管理平面。
数据平面是网络节点的一个子系统,它接收和发送来自接口的数据包,根据适用协议的要求处理它们,并根据需要发送、丢弃或转发它们的数据。对于它接收到的大部分或所有没有发送到节点本身的数据包,平面从更高级别的处理器卸载数据包转发,它执行所有必要的处理。对于路由功能,它由一组过程(算法)组成,路由器使用这些过程(算法)对数据包做出转发决策,算法分析信息。
控制平面维护数据平面用于数据包处理的信息。维护这些信息需要处理复杂的信令协议。在数据平面上实现这些协议会导致转发性能变差。管理这些协议的一种常用方法是让数据平面检测传入的信令数据包,并将其本地转发给控制平面。控制平面信令协议可以更新数据平面信息,并向数据平面注入出信令报文。由于信令流量在全局流量中只占很小的一部分,因此该体系结构具有良好的性能。对于路由功能,控制平面由一个或多个路由协议组成,这些协议实现路由器之间的路由信息交换,以及路由器将这些信息转换为转发表的算法。RIP、OSPF、BGP就是这类路由协议的代表。在虚拟路由的情况下,在数据平面级别管理转发表的多个实例。数据平面一旦检测到路由报文,就将其转发给控制平面,由控制平面计算新路由、添加路由或删除路由。转发表用这个新信息更新了。当路由协议必须发送报文(例如OSPF Hello报文)时,该报文被注入数据平面进行发送对于IPsec安全功能,用于密钥交换管理的信令协议(如IKE或IKEv2)在控制平面。进入的IKE报文在本地转发到控制平面。IKE协商完成后,位于数据平面的安全关联和策略由控制平面更新。出方向的IKE报文被注入到数据平面,发送到出方向流中。
管理平面提供进入整个系统的管理接口。它包含支持运营管理、管理或配置/供应操作的流程,例如:
可以运行在商业现成的硬件和软件上:
现代网络设备的最后一个概念是商品化。英特尔或Arm最新标准cpu的强大功能,现代PCI网卡的带宽(高达100G)以及Linux网络堆栈的多功能性和功能丰富性,使得从商用现货(COTS,Commercial Off-The-Shelf)硬件和软件构建高性能网络设备成为可能,前提是您有合适的网络堆栈来克服Linux性能限制。
windgate实现了前一节所解释的网络架构。本节概述该体系结构的不同组件,然后在以下部分中对其进行详细描述。即使使用SMP模式下的Linux Networking Stack的有效实现,基于Linux的解决方案也无法扩展,因为所有数据包都由堆栈管理,而Linux体系结构受到操作系统延迟和锁争用的限制。SMP架构不能充分受益于多核的功能。为了超越这个限制,软件架构应该实现一个快速路径。CPU内核在Linux操作系统和控制平面应用处理和快速路径数据平面处理之间调度。
实现特性如下:
系统收包处理流程如下:
异常策略和连续同步机制的结合,使系统可以处理任何类型的数据包(即使是那些不支持或尚未在Fast Path中配置的数据包),并透明地更新Fast Path中的本地信息。其结果是,几乎所有的数据包最终都由快速路径处理,只有一小部分数据包进入操作系统。
不同模块的详细概述可参考下面文档:
6WINDGate软件是模块化的。您可以选择所需的模块族,并在每个模块族中选择应用程序所需的模块。
快速路径通过FPN-SDK接收和发送数据包,FPN-SDK是硬件依赖的6WINDGate DPDK之上的硬件抽象层。6WINDGate DPDK为x86和Arm上的高性能I/ o提供驱动程序和库。它基于来自dpdk.org的开放源码DPDK,除了提供开放源码DPDK的标准特性之外,还提供虚拟化网络和加密附加组件,以及商业支持和维护。FPN-SDK提供零开销api,使Fast Path协议能够在网络上接收和发送数据包,接收和发送数据包到Linux,管理内存以及与多核硬件(如加密引擎,硬件队列等)接口。这些api是使用处理器SDK实现的:
参考文档:’
路由查找算法:
快速路径实现了“运行到完成”模型:一旦一个数据包被分配给一个CPU核心,这个数据包的所有处理都由这个特定的核心执行。如果快速路径可以处理传入的数据包,它将其传递给相关模块,该模块将使用共享内存中的信息执行此处理。如果进入的报文无法在Fast Path级别进行处理,则通过FPVI API将该报文作为异常报文转发给Linux Networking Stack。数据包被注入到Linux网络堆栈中的正确位置,以避免任何进程重复。
快速路径数据包处理负责解析传入数据包,并确定是否可以使用本地内存中的可用信息进行转发。为此,需要进行以下测试,才能实现IPv4转发功能:
首先,Fast Path判断报文是否为IPv4以太类型。如果测试结果是否定的,那么这个数据包就是一个异常数据包,并被转移到6WINDGate Linux网络堆栈中进行处理。
然后,对IPv4报文进行检查,以检测无法在Fast Path级别进行管理的报文,例如校验和错误、IP选项错误或TTL为0的报文。广播/组播数据包以及保留IP目的地址的数据包也会被检测到。如果这样的事件发生,数据包是一个异常,并被转移到6WINDGate Linux网络堆栈进行处理。
一旦完成,如果数据包没有被转移,则执行IP查找以检查路由表中是否有有效条目。6WINDGate IPv4转发快速路径协议中的IP查找是按照M-trie 16/8/8实现的,因此在固定的内存访问次数内查找任何流,从而实现最高的性能。在此阶段,确定:
如果这样的事件发生,数据包是一个异常,并被转移到6WINDGate Linux网络堆栈进行处理。
在这个阶段,快速路径必须执行所需的处理,将ARP条目标记为可达,减少TTL,更新IP数据包校验和并添加以太网类型,然后再排队转发数据包。
这个简单的例子展示了快速路径协议是如何工作的。当然,当包含额外的功能(例如虚拟路由、基于策略的路由、数据包批量等)时,处理变得更加复杂。每个快速路径协议都集成在完整的6WINDGate快速路径架构中,以提供完整的解决方案。这个例子还说明了6WINDGate架构的灵活性,以及如何使用它来逐步添加快速路径协议。快速路径中不支持的协议可以转移到Linux网络堆栈中。只要对应的快速路径协议可用,数据包就可以保持在快速路径级别以进行进一步处理。
快速路径虚拟接口(FPVI)允许在快速路径和Linux网络堆栈之间交换数据包。FPVI使快速路径端口作为netdevice出现在Linux网络堆栈中。FPVI的目的是:
在Linux中提供物理网卡表示,用于配置、监视和流量捕获。
从Linux发送报文到Fast Path(本地产生的流量)。
Fast Path与Linux交换异常报文。
FPVI在Linux中使用TUN/TAP驱动程序实现,在Fast Path中通过FPN-SDK使用DPDK虚拟用户PMD为每个TUN/TAP接口提供虚拟端口。Linux network Stack本地发送的报文直接注入到出流中,由Fast Path处理,使用TUN/TAP Linux驱动程序。FPVI实现的异常策略如下:
对于Basic Exceptions, FPVI通过TUN/TAP Linux驱动的netif_rx函数实现标准处理。
对于特殊例外,在入口路径上,数据包被注入到Linux Networking Stack的正确位置,这要归功于下面解释的eBPF程序。在出口路径上,使用标准的sendmsg() API直接发送数据包。
特殊异常被发送到Linux与一个特定的拖车称为FPTUN,包括有关在快速路径中发生的处理的信息。它们被发送到一个称为FPTUN处理程序的eBPF程序,该程序解析FPTUN预告片并将数据包驱动到Linux网络堆栈中的右钩子中,以便与快速路径已经完成的工作相一致进行进一步处理。
接收到的数据包处理如下(假设所有功能都被激活):
在每个级别,如果数据包不能在快速路径级别处理,则会发生异常。
在应用三层封装(IP隧道,GRE)的情况下,数据包被认为是从一个新接口返回的。如果应用多个封装,则递归地应用它们。
分组处理性能随分配给Fast Path的核数的变化而变化,具体如下:
RSS(接收端缩放)在nic中,根据传入数据包的5元组将数据包分配到几个接收队列中。
无锁,运行到完成的快速路径设计,使每个核心的处理相互独立。
在某些用例中,RSS没有帮助,因为传入数据包的5元组总是相同的(例如IPsec封装)。在这些情况下,处理在软件中的核心之间负载均衡(例如,IPsec加密处理被卸载到空闲核心)。有些模块在设计上不能无锁,因为它们需要在内核之间共享资源(例如QoS或TCP使用共享软件队列)。在这种情况下,性能不会线性扩展。
在官方文档第5章里面有Route转发和IPsec处理的例子,可以自行参考:
如果传入的数据包不能在快速路径级别进行处理,则该数据包将通过FPVI作为异常数据包转发给Linux网络堆栈。
一般来说,通过FPVI发送的数据包在Linux中通过TUN/TAP接收驱动程序接收,并通过标准的Linux Networking Stack进行处理。但是,在某些情况下,不能将原始数据包发送到Linux进行标准处理。例如,对于已经被解密的IPsec数据包,不能进行进一步的处理(例如,没有为被解密的数据包提供路由)。清除包不能发送到标准Linux网络堆栈,因为它们匹配安全策略,因此会被丢弃。
在这种情况下,数据包通过专用的eBPF程序发送到Linux,以在Linux网络堆栈中的正确位置注入它们(在我们的情况下,在进入IPsec处理之后)。由于Fast Path通常比Linux更高效,因此生成许多异常会使Linux超载。
为了控制异常机制,6WINDGate支持自定义Linux中负责处理异常的内核数量,以及对异常通道的速率限制,并对最重要的控制平面数据包进行优先级排序。
缓存管理器(Cache Manager)是在Linux网络堆栈和快速路径之间执行同步的两个软件模块之一。它通过Netlink消息监视由控制平面协议(ARP和NDP条目,三层路由表,安全关联等)执行的内核更新,并与此信息同步快速路径。
由于缓存管理器,当控制平面协议与快速路径集成时,不需要更改它们。缓存管理器是独立于硬件的。它提供了任何需要的信息,以卸载到通往FPC API的快速路径。
快速路径管理器(FPM)是控制平面软件模块,负责快速路径配置。FPM根据通过FPC API与缓存管理器交换的消息更新快速路径表。
更新Fast Path有两种不同的方式:写入共享内存中的表,或者当更新需要触发Fast Path中的事件(例如更改MTU)时,直接向Fast Path应用程序发送消息。
由于有些报文在Fast Path上处理,有些报文在Linux network Stack上处理,所以需要对Linux和Fast Path的统计信息进行汇总。快速路径模块用统计信息更新共享内存。FPS守护进程读取共享内存,并使用Netlink更新Linux内核统计信息。Netlink无法更新某些内核统计信息。
为此,提供了一个可预加载的库,以便使用来自共享内存的快速路径统计信息透明地更新Netlink统计请求。这样,从Linux中读取统计信息的Linux应用程序将接收聚合的Linux Networking Stack + Fast Path统计信息。类似地,对于由Fast Path处理的数据包,必须更新相应的Linux对象状态(ARP项、连接、Linux桥接等)以防止它们过期。当一个条目被命中(hitflag)时,快速路径模块更新共享内存。Hitflags守护进程读取共享内存并使用Netlink更新相应的Linux内核项。Linux应用程序像往常一样从Linux中读取对象状态。
详细信息请参考6WINDGate Linux /快速路径同步模块数据表。请注意,有几个模块没有与Linux同步:
正如在第3节中详细解释的那样,windgate自动将Linux Networking Stack状态与它自己的本地信息同步。该机制基于标准的Linux api,因此可以使用标准的Linux控制平面实用程序来管理系统。我们通常可以认为iproute2配置静态IP地址、路由、邻居,并创建逻辑接口,如VLAN、VXLAN等。6WINDGate产品中提供了所有常见的网络实用程序。
此外,这意味着配置Linux网络堆栈的开源控制平面守护进程也可以按原样使用。6windgate利用这一点嵌入了下面开源组件:
6WINDGate路由控制平面模块允许对各种路由协议进行路由管理。它由来自开源FRR项目的zebra守护进程提供,特点:
集成在6WINDGate中的FRR版本遵循上游版本。6WIND还通过向社区提交bug修复来为这个开源项目做出贡献。详细信息请参阅6WINDGate控制平面路由模块数据表。
6WINDGate安全控制平面模块实现IKEv1和IKEv2协议。它允许协商密钥材料(IPsec sa)以使用IPsec vpn。它基于最新版本的开源strongSwan基于ipsec的VPN解决方案。所有强大的swan功能都支持6WIND。详细信息请参阅6WINDGate控制平面安全模块数据表。
6WINDGate OVS控制平面模块提供虚拟交换、流匹配和数据包操作,通过OpenFlow控制器或命令行进行配置。它基于http://www.openvswitch.org/。
本模块遵循开源版本。控制平面OVS模块提供以下功能:
详细信息请参见6WINDGate控制平面OVS模块数据表。
6WINDGate管理平面包括三个主要组成部分:
引擎和数据存储:YAMS,一个基于python的引擎,配置和监控所有网络组件。YAMS引擎使用YANG模型数据存储。
配置:NETCONF服务器,提供标准API与基于NETCONF的配置工具进行接口。6WIND开发了自己的CLI工具作为NETCONF客户端来配置6WINDGate的功能。
监控/分析:传统的SNMP和sFlow监控服务,以及通过KPI(关键性能指标,Key Performance Indicator)代理收集和流式统计的高级服务。
6WINDGate管理平面组成的业务如下:
NETCONF是IETF标准化的网络管理协议。它定义了安装、操作和删除网络设备配置的机制。它对配置数据和协议消息使用基于可扩展标记语言(Extensible Markup Language, XML)的数据编码。更多信息请参见RFC6241.
YANG是一种用于为NETCONF协议建模数据的语言。YANG模块定义了可用于基于netconf的操作的数据层次结构,包括配置、状态数据、远程过程调用(rpc)和网络管理协议的通知。更多信息请参见RFC 7950。
NETCONF API可以被任何NETCONF客户端用来远程配置和监控路由器,从而实现自动化和编排。
NETCONF / YANG-based引擎,管理引擎由一个基于yang的数据存储和一个NETCONF服务器组成。它支持所有读写配置所需的协议操作:<get>
, <get-config>
, <edit-config>
,<copyconfig>
等。
明确分离配置数据和状态,数据管理引擎为每个特性存储单独的配置和状态数据。与配置部分相比,状态部分包含额外的运行时信息;一般来说,统计数据。可以使用get命令从CLI中的任何地方显示状态数据,这样用户就可以在构建配置时查看当前状态的数据。
VRFS,为了在管理平面和网络平面之间提供高度的隔离,网络配置被原生地分割成vrf。每个VRF都有自己的接口、IP地址、路由表、防火墙等。这种方法确保了良好的服务隔离,并允许将来为给定的VRF定义CPU资源或内存限制。它依赖于Linux网络名称空间(netns)。
与现有Linux Day-1配置的兼容性,Cloud-init可以嵌入到6WINDGate进行Day-1配置,即6WINDGate的初始配置,以启用基本的控制台访问。可以配置管理接口、DHCP、SSH等基本网络服务、SSH密钥的发放等。管理引擎兼容这种cloud-init配置,因为它不涉及网络服务(SSH、DNS、DHCP等)的配置,只要它们没有配置语句。当一个配置语句存在时,它优先于任何现有的外部配置。最后,一个像SSH这样的已知服务将被识别,并且在不必要的情况下不会重新启动。
CLI是与6WINDGate交互的通用用户界面。它可用于配置、监控和故障排除。CLI提供帮助、补全、配置文件管理等功能,通过命令行保存和恢复完整一致的配置。
CLI实际上是一个NETCONF客户端,它与6WINDGate的基于yang的配置引擎通信。它的命令名和语句遵循6WINDGate YANG模型的语法和分层组织。根据YANG模型检查数据一致性,以便及早发现语法错误。配置引擎支持事务和错误回滚。
CLI提供了一些传统的功能,比如补全、历史记录和上下文帮助。用户可以像浏览文件系统一样遍历配置树,例如,“/”跳到配置的根目录,“…”向上移动一层。相对路径和绝对路径可用于引用配置数据,使浏览非常高效。
传统的SNMP监控:
SNMP (Simple Network Management Protocol,简单网络管理协议)是一种internet标准协议,用于收集和组织IP网络中被管理设备的信息。
它以在MIB中组织的受管理系统上的变量的形式公开管理数据(Management Information Base),描述系统状态。然后,管理应用程序可以远程查询这些变量。
6WINDGate SNMP管理模块基于net-snmp (http://www.net-snmp.org)开源项目,提供对SNMP监控的支持。
6windgate支持SNMPv1、SNMPv2c(基于团体字的基本认证)和SNMPv3(基于SNMP用户的认证)。支持的MIB包括标准系统和网络MIB(接口、IP、IPv6、IP转发等)、路由MIB (BGP、OSPF、RIP)、VRRP MIB和6wind开发的IPsec MIB。
数据面分析工具Sflow:
sFlow是一种在包含交换机和路由器的数据网络中监控流量的技术。特别地,它定义了在sFlow agent中实现的流量采样机制,以及将流量测量数据从sFlow agent传递到sFlow Collector的sFlow Datagram的格式。
该模块基于host-sflow,它是sFlow标准的开源实现。它是由6WIND修复的快速路径卸载。
下一代监测:KPIs:
除了传统的监测外,6WINDGate还提供基于时间序列收集和关键绩效指标(kpi)可视化的高级监测解决方案。有了这样的解决方案,就更容易理解过去发生的问题,并将它们与过去的事件联系起来。它甚至可以用来预测未来,因为用户可以直接可视化系统的动态。
6windgate kpi与InfluxDB时间序列数据库和Grafana分析前端预先集成。在6WIND的github上有一个关于InfluxDB/Grafana设置的例子。与其他TSDB或分析前端的集成是可能的。Telegraf用于收集kpi并将其导出到InfluxDB。
kpi使用YANG建模,并使用NETCONF或本地API公开。kpi模块包括:
6WINDGate管理架构可以定制,以扩展6WINDGate管理服务。
YANG Model And Configuration:
Monitoring / Analytics:
6WINDGate开放式架构可以以不同的方式用于扩展监控和分析服务。
首先,用户可以将6WINDGate提供的服务和数据扩展到:
也可以使用不同的工具:
6WINDGate高可用性模块列表如下:
6WINDGate VRRP控制平面模块为一组路由器提供了一种控制虚拟IPv4和MAC地址的方式,包括自动故障切换机制。这样的地址可以被主机用于某些服务访问,例如作为静态默认网关。使用VRRP的好处是服务的可用性更高,而不需要对终端主机进行自动重新配置。windgate集成了开源的keepalived守护进程。
6windGate的快速路径支持由keepalive守护进程创建的macvtap接口的同步。
参考文档:
可以在Bare metal
, Virtual machines
, Containers
等三类设备中使用。
BARE METAL,裸机,原生物理机环境:
虚拟机:
上图显示了如何在虚拟机中使用6WINDGate。每个虚拟机都有自己的专用Linux内核,并嵌入一个完整的6WINDGate实例。建议使用SR-IOV绕过和消除虚拟化环境(本例中为KVM)的性能瓶颈。实际的物理网卡被拆分为多个Eth-VF (Virtual Functions),这些Eth-VF绑定并专用于虚拟机。Fast Path通过6WINDGate DPDK与eth - vf直接交互。
容器中使用:
下图显示了如何在容器中使用6WINDGate。容器是隔离在Linux网络名称空间(netns)中的用户应用程序,共享单个Linux内核。与VM部署类似,建议使用SR-IOV将vf专用于容器实例,以获得最佳性能。
上图显示了如何在虚拟机中使用6WINDGate。每个虚拟机都有自己的专用Linux内核,并嵌入一个完整的6WINDGate实例。建议使用SR-IOV绕过和消除虚拟化环境(本例中为KVM)的性能瓶颈。实际的物理网卡被拆分为多个Eth-VF (Virtual Functions),这些Eth-VF绑定并专用于虚拟机。Fast Path通过6WINDGate DPDK与eth - vf直接交互。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。