云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

网站服务器_波多野结衣百度云_企业级

小七 141 0

魔力运输:Cloudflare规模的网络功能

今天,我们发布了Cloudflare Magic Transit,它使Cloudflare的网络可用于Internet上的任何IP流量。到目前为止,Cloudflare主要运行代理服务:我们的服务器终止与Internet用户的HTTP、TCP和UDP会话,并通过他们与源服务器创建的新会话传递这些数据。使用Magic Transit,我们现在也在IP层上运行:除了终止会话外,我们的服务器还在逐包应用一套网络功能(DoS缓解、防火墙、路由等)基础。完毕在过去的九年里,我们已经建立了一个强大的、可扩展的全球网络,目前覆盖了90多个城市的193个国家和不断增长。所有Cloudflare客户都从这一规模中受益,这要归功于两项重要技术。首先是选播联网。Cloudflare是anycast的早期采用者,使用这种路由技术在我们的数据中心中分布互联网流量。这意味着任何数据中心都可以处理任何客户的流量,我们可以在不需要获取和提供新IP地址的情况下启动新的数据中心。第二种技术是同质服务器架构。我们每个边缘数据中心的每台服务器都能够运行每项任务。我们将服务器构建在普通硬件上,通过向现有数据中心添加新服务器,可以轻松快速地提高我们的处理能力。由于没有专门的硬件可依赖,这也使得我们在使用现代Linux内核来突破网络的局限性方面发展了一门专业技术技术。魔法Transit使用相同的技术构建在同一个网络上,这意味着我们的客户现在可以在Cloudflare规模上运行其网络功能。我们快速、安全、可靠的全球优势成为我们客户的优势。为了探索这是如何工作的,让我们跟随一个包从互联网上的用户到一个神奇的运输客户的旅程网络。放置我们的DoS缓解措施…为你工作!在发布的博客文章中,我们描述了acmecorp的一个示例部署。当Acme将其IP前缀203.0.113.0/24带到Cloudflare时,我们开始向我们的传输提供商、对等方和全球每个数据中心的互联网交换机宣布该前缀。此外,Acme停止向他们自己的isp公布前缀。这意味着Internet上任何目标地址在Acme前缀内的IP数据包都将被传递到附近的Cloudflare数据中心,而不是Acme的数据中心路由器。让比如说,我想通过位于伊利诺伊州香槟市Cloudflare办公室的电脑访问Acme在203.0.113.100上的FTP服务器。我的计算机生成一个目标地址为203.0.113.100的TCP SYN数据包并将其发送到Internet。多亏了anycast,数据包最终到达了Cloudflare位于芝加哥的数据中心,这是距离Champaign最近的数据中心(就互联网路由距离而言)。数据包到达数据中心的路由器,路由器使用ECMP(等成本多路径)路由来选择应该由哪个服务器来处理数据包,并将数据包发送给选定的服务器服务器。一次在服务器端,数据包通过我们基于XDP和iptables的DoS检测和缓解功能。如果这个TCP SYN包被确定是攻击的一部分,它将被丢弃,这将是攻击的结束。对我来说幸运的是,这个包裹被允许通过。所以到目前为止,这看起来和Cloudflare网络上的任何其他流量完全一样。由于我们在运行全球选播网络方面的专业技能,我们能够将神奇的传输客户流量吸引到每个数据中心,并应用保护Cloudflare多年的DoS缓解解决方案。我们的DoS解决方案处理了一些有史以来最大的攻击,包括2018年942Gbps的SYN洪水。下面是一个最近的SYN洪流每秒3亿包的截图。我们的架构允许我们扩展以阻止最大的攻击。网络用于隔离和控制的名称空间上述内容看起来与所有其他Cloudflare流量的处理方式相同,但这就是相似之处的结束之处。对于我们的其他服务,TCP SYN包现在将被调度到本地代理进程(例如,我们基于nginx的HTTP/S堆栈)。对于Magic Transit,我们希望动态地提供和应用客户定义的网络功能,如防火墙和路由。我们需要一种方法来快速启动和配置这些网络功能,同时提供网络间隔离。为此,我们求助于网络名称空间。名称空间是一组Linux内核特性的集合,用于创建可在一组进程之间共享的系统资源的轻量级虚拟实例。名称空间是Linux中容器化的基本构建块。值得注意的是,Docker是基于Linux命名空间构建的。网络名称空间是Linux网络堆栈的一个独立实例,包括它自己的网络接口(带有自己的eBPF钩子)、路由表、netfilter配置等等。网络名称空间为我们提供了一种低成本的机制,可以独立地快速应用客户定义的网络配置,所有这些配置都具有内置的Linux内核特性,因此用户空间数据包转发或代理。什么时候一个新客户开始使用魔法运输,我们在边缘网络的每台服务器上为该客户创建了一个全新的网络名称空间(我有没有提到每台服务器都可以运行每项任务?)。我们构建了一个在服务器上运行的守护进程,负责管理这些网络名称空间及其配置。这个守护进程不断地从Quicksilver读取配置更新,Quicksilver是我们全球分布的密钥值存储,并在客户的命名空间中为防火墙、路由等应用客户定义的配置。例如,如果Acme希望设置一个防火墙规则以允许FTP流量(TCP端口20和21)到203.0.113.100,则该配置将通过Quicksilver全局传播,Magic Transit守护程序通过向Acme customer命名空间添加nftables规则来应用防火墙规则:#在Acme的命名空间内应用nftables规则$sudo ip netns exec acme_namespace nft add rule inet filter预路由ip daddr 203.0.113.100 tcp dport 20-21 accept让客户的流量到达其网络名称空间需要在默认网络名称空间中进行一些路由配置。创建网络名称空间时,还会创建一对虚拟以太网(veth)接口:一个在默认名称空间中,一个在新创建的名称空间中。这个接口对创建了一个"虚拟线",用于将网络流量传送到新的网络名称空间。在默认的网络名称空间中,我们维护一个路由表,该表将Magic Transit客户的IP前缀转发给对应于这些客户名称空间的veth。我们使用iptables来标记发送给Magic Transit客户前缀的包,并且我们有一个路由规则,指定这些特别标记的包应该使用Magic Transit路由表(为什么要在iptables中标记包并维护一个单独的路由表?隔离。通过保持Magic Transit路由配置的分离,我们降低了意外修改默认路由表的风险,从而影响了非Magic Transit通信流如何通过我们的边缘。)网络名称空间提供了一个轻量级环境,Magic Transit客户可以独立地运行和管理网络功能,从而使我们完全控制客户的手.GRE+anycast=magicaf在通过边缘网络功能之后,TCP SYN包最终准备好返回客户的网络基础设施。因为Acme Corp.在Cloudflare的托管设施中没有网络足迹,所以我们需要通过公共网络传输他们的网络流量互联网。这个带来了一个问题。TCP SYN数据包的目标地址是203.0.113.100,但Internet上唯一公布IP前缀203.0.113.0/24的网络是Cloudflare。这意味着我们不能简单地将这个包转发到互联网上,它会自动返回给我们!为了将这个包传递给Acme,我们需要使用一种称为隧道。隧道是一种从一个网络通过另一个网络传输流量的方法。在我们的例子中,它涉及到将Acme的IP包封装在可以通过Internet传送到Acme路由器的IP包中。有许多常见的隧道协议,但通用路由封装(GRE)由于其简单性和广泛的供应商而经常被使用支持.GRE隧道端点配置在Cloudflare的服务器上(在Acme的网络名称空间内部)和Acme的路由器上。然后,Cloudflare服务器将发往203.0.113.0/24的IP包封装在发送给Acme路由器的可公开路由IP地址的IP包中,后者将这些包拆封并发送到Acme的内部网络。现在,我在上图中省略了一个重要的细节:GRE的Cloudflare端的IP地址隧道。配置GRE隧道需要为每端指定一个IP地址,通过隧道发送的数据包的外部IP报头必须使用这些特定地址。但是Cloudflare有数千台服务器,每台服务器都可能需要通过隧道向客户发送数据包。那么,客户需要与多少个Cloudflare IP地址(和GRE隧道)通信?答案是:只有一个,多亏了选播。云闪将anycast IP地址用于GRE隧道端点,这意味着任何数据中心中的任何服务器都能够为同一GRE隧道封装和取消封装数据包。这怎么可能?隧道不是点对点的连接吗?GRE协议本身是无状态的,每个包都是独立处理的,不需要隧道端点之间的任何协商或协调。虽然隧道技术上是绑定到IP地址的,但它不需要绑定到特定的设备。任何可以剥离外部报头然后路由内部包的设备都可以处理通过隧道发送的任何GRE包。实际上,在选播上下文中,"隧道"一词是m