在线EvE是一个有趣的游戏。 这是少数只有一个“服务器”可进入的MMO之一,这意味着每个人都在同一个逻辑世界中玩耍。 她在游戏中发生了一系列激动人心的事件,并且她仍然是一款非常吸引人的游戏:
还有一张广阔的世界地图,所有这些玩家都可以适应。 在其鼎盛时期,EvE在一个世界上拥有63,000个在线玩家,在鼎盛时期达到了500,000个注册付费订阅,尽管这个数字每年都在减少,但这个世界仍然非常庞大。 这意味着从一侧到另一侧的过渡要花费大量的时间(以及由于玩家对分数的依赖而带来的风险)。
该翻译得到专业安全公司EDISON Software的支持,并且还在开发电子医疗验证系统 。您可以使用扭曲模式(在同一系统内)旅行到不同的区域,或者使用跳闸来跳到不同的系统:

所有这些系统结合在一起,创建了一张美丽而复杂的地图:

我一直将这张卡视为一个网络,它是一个相互连接的大型系统网络,以便人们可以通过它们,而且大多数系统都有两个以上的跳闸门。 这让我想到,如果您真的将地图作为网络的想法会发生什么? EvE Internet系统将是什么样?
为此,我们需要了解真正的互联网是如何工作的。 Internet是大量Internet提供程序的集合,所有这些Internet提供程序都使用标准化的唯一Internet提供程序编号进行数字标识,该编号称为自治系统编号或ASN(或简称为AS)。 这些AS需要一种相互交换路由的方法,因为它们将拥有IP地址范围,并且需要一种方法来告诉其他Internet提供商其路由器可以路由这些IP地址。 为此,世界停止在边界网关协议或BGP上。
BGP通过“告诉”其他AS(称为主机)的路由来工作:

BGP从主机接收路由时的标准行为是将BGP传递给它也连接到的所有其他主机。 这意味着节点将自动彼此共享它们的路由表。

但是,仅当您使用BGP将路由发送到内部路由器时,此行为才有用,因为现代Internet彼此之间具有不同的逻辑关系。 代替网络,现代Internet看起来像这样:

但是,将来会安装在线EvE。 谁知道Internet是否依靠此路由方案来获利。 让我们想象一下,事实并非如此,这样我们就可以了解BGP如何在更大的网络中扩展。
为此,我们需要模拟BGP路由器和连接的实际行为。 鉴于EvE的系统数量相对较低,为8000〜,而它们之间的链接为1.38万。 我建议实际上不可能使用真正的BGP和网络来运行8000个虚拟机,以弄清这些现实系统一起充当网络时的外观。

但是,我们没有无限的资源,因此在使用磁盘空间和内存时,我们都需要找到一种制作最小的Linux映像的方法。 为此,我提请注意嵌入式系统,因为嵌入式系统通常必须在资源非常低的环境中工作。 我遇到了
Buildroot ,几个小时后,我得到了一个小的Linux映像,其中仅包含该项目正常工作所需的内容。
$ ls -alh total 17M drwxrwxr-x 2 ben ben 4.0K Jan 22 22:46 . drwxrwxr-x 6 ben ben 4.0K Jan 22 22:45 .. -rw-r--r-- 1 ben ben 7.0M Jan 22 22:46 bzImage -rw-r--r-- 1 ben ben 10M Jan 22 22:46 rootfs.ext2
该映像包含引导linux,它也具有:*
Bird 2 BGP守护程序*
tcpdump和用于网络调试的My Traceroute(mtr)*用于基本Shell和系统实用程序的
busybox可以使用以下几个选项在qemu中轻松运行此映像:
qemu-system-i386 -kernel ../bzImage \ -hda rootfs.ext2 \ -hdb fat:./30045343/ \ -append "root=/dev/sda rw" \ -m 64
为了在网络上工作,我决定使用qemu中未记录的功能(在我的版本中),在该功能中,您可以将两个qemu进程相互引导,并使用UDP套接字在它们之间传输数据。 这很方便,因为我们计划提供大量的链接,所以使用通常的
TUN / TAP适配器方法会很快导致混乱。
由于此功能部分未记录,因此其操作存在一些问题。 我花了很长时间才了解到命令行上的网络名称对于连接的两端应该是相同的。 后来发现,此功能已被很好地记录下来,就像通常发生的那样。 进行更改需要时间才能获得较早版本的发行版。
一旦工作成功,我们就会获得几个可以互相发送数据包的虚拟机,系统管理程序将它们作为UDP数据报发送。 由于我们将启动大量此类系统,因此我们需要一种快速的方法来使用先前创建的配置对其进行配置。 为此,我们可以使用方便的qemu功能,该功能允许您在虚拟机管理程序上建立目录并将其转换为FAT32虚拟文件系统。 这很有用,因为它允许我们为计划启动的每个系统创建一个目录,并且每个qemu进程都指向该目录,这意味着我们可以为集群中的所有虚拟机使用相同的引导映像。
由于每个系统都有64 MB的RAM,并且我们计划使用8000〜VM,因此我们当然需要相当数量的RAM。 为此,我将3 m2.xlarge.x86与packet.net一起使用,因为它们提供256 GB的RAM和2x Xeon Gold 5120,这意味着它们提供了不错的支持。

我使用
另一个开源项目以JSON形式创建了一个EvE映射,然后基于此数据创建了一个自定义配置程序。 在仅对几个系统进行了几次测试运行之后,我证明了它们可以从VFAT中进行配置,并就此彼此建立BGP会话。

因此,我朝着加载宇宙迈出了决定性的一步:

最初,我试图在一个大事件中启动所有系统,但是不幸的是,这导致了系统加载方面的巨大爆炸,因此之后,我切换为每2.5秒启动一次系统,最终48个系统内核负责了这一工作。

在启动过程中,我发现您会看到所有虚拟机上的CPU使用率出现“爆炸性”变化,后来我发现它们是Universe彼此连接的很大一部分,因此在新连接的虚拟机的两侧都产生了大量的BGP流量。汽车。

root@evehyper1:~/147.75.81.189# ifstat -i bond0,lo bond0 lo KB/s in KB/s out KB/s in KB/s out 690.46 157.37 11568.95 11568.95 352.62 392.74 20413.64 20413.64 468.95 424.58 21983.50 21983.50
最后,我们看到了一些非常惊人的BGP路径,因为每个系统都发布/ 48个IPv6地址,所以您可以看到到达每个系统以及到达该位置所必须经过的所有其他系统的路由。
$ birdc6 s ro all 2a07:1500:b4f::/48 unicast [session0 18:13:15.471] * (100) [AS2895i] via 2a07:1500:d45::2215 on eth0 Type: BGP univ BGP.origin: IGP BGP.as_path: 3397 3396 3394 3385 3386 3387 2049 2051 2721 2720 2719 2692 2645 2644 2643 145 144 146 2755 1381 1385 1386 1446 1448 849 847 862 867 863 854 861 859 1262 1263 1264 1266 1267 2890 2892 2895 BGP.next_hop: 2a07:1500:d45::2215 fe80::5054:ff:fe6e:5068 BGP.local_pref: 100
我在Universe中的每个路由器上拍摄了路由表的快照,然后描绘了用于访问其他系统的常用系统,但是此图像很大。 这是出版物中的一个小版本,如果单击某个图像,请记住
,该图像很可能导致您的设备内存不足
在那之后,我想,您还能映射到BGP路由网络吗? 您能否使用较小的模型来测试路由配置在大型网络上的工作方式?
我准备了一个显示伦敦地铁系统的文件来验证这一点 :

由于大多数站点只有一条“传输线”,因此TFL系统要小得多,并且具有更多的跳变,并且只有一个方向,但是我们可以从中学到一件事,可以使用它与
BGP MED安全地玩。
但是,当我们将TFL卡视为BGP网络时,存在一个问题,在现实世界中,每个停靠点之间的时间/延迟都不相同,因此,如果我们模拟此延迟,我们将无法尽可能快地绕过系统,因为我们只看最少的车站。

但是,由于《信息自由法》(FOIA),发送给
TFL的请求为我们提供了从一个站点转移到另一个站点所需的时间。 它们是在BGP路由器配置中生成的,例如:
protocol bgp session1 { neighbor 2a07:1500:34::62 as 1337; source address 2a07:1500:34::63; local as 1337; enable extended messages; enable route refresh; ipv6 { import filter{ bgp_med = bgp_med + 162; accept; }; export all; }; } protocol bgp session2 { neighbor 2a07:1500:1a::b3 as 1337; source address 2a07:1500:1a::b2; local as 1337; enable extended messages; enable route refresh; ipv6 { import filter{ bgp_med = bgp_med + 486; accept; }; export all; }; }
在
session1
两个站点之间
session1
时间间隔为1.6分钟,从该站点到另一站点
session1
时间间隔为4.86分钟。 该号码被添加到它所经过的每个站点/路由器的路由中。 这意味着网络上的每个路由器/站点都知道是时候通过每个路由到达每个站点了:

这意味着traceroutes可以准确确定您如何在伦敦旅行,例如到达我的帕丁顿车站:

我们还可以通过模拟维护或滑铁卢站的事故来与BGP一起玩:

整个网络会立即选择下一条最快的路线,而不是经过站数最少的路线。

这就是BGP MED在路由中的魔力!
所有这些的代码已经可用。 您可以使用相当简单的JSON方案创建自己的网络结构,也可以仅在线使用EvE或TFL,因为它们已经在存储库中。
您可以在这里找到所有代码