领事+ iptables =:3

在2010年,Wargaming拥有50台服务器和一个简单的网络模型:后端,前端和防火墙。服务器数量增加,模型变得更加复杂:分段,带有ACL的隔离VLAN,然后是带有VRF的VPN,带有ACL到L2的VLAN,从ACL到L3的VRF。头在旋转吗?更多会更有趣。

当服务器开始运行16,000个不费吹灰之力的众多异构网段时,就变得不可能了。因此,他们提出了不同的解决方案。我们采用了Netfilter堆栈,并向其中添加了Consul作为数据源,并获得了快速分布式防火墙。他们替换了路由器上的ACL,并用作外部和内部防火墙。对于动态工具管理,我们开发了BEFW系统,该系统已广泛使用:从控制用户对食品杂货网络的访问到将网段彼此隔离。



一切如何运作,以及为什么您应该仔细研究这个系统,告诉Ivan Agarkov安穆尔)-明斯克公司开发中心维护部门基础设施安全小组的负责人。Ivan是SELinux的狂热者,喜欢Perl,编写代码。作为IB小组的负责人,他定期处理日志,备份和研发工作,以保护Wargaming免受黑客攻击并确保公司中所有游戏服务器的正常运行。


历史参考


在告诉我们如何做之前,我将告诉您我们是如何做到的以及为什么需要它。为此,我们在9年前转移:2010年,只有《战车世界》出现了。 Wargaming大约有50台服务器。


公司服务器的增长图。

我们有一个网络模型。在那个时候,它是最佳的。


2010年的网络模型。

在前端,有坏蛋想破坏我们,但其中有防火墙。后端没有防火墙,但是那里有50台服务器,我们都知道。一切正常。

四年来,服务器机队增长了100倍,达到5000台。出现了第一个隔离的网络-阶段:它们无法投入生产,而且可能会危险的事情在那儿旋转。


2014年的网络模型。

惯性地,使用了所有相同的密封套,并且所有工作都在隔离的VLAN上进行:将ACL写入VLAN,以允许或禁止任何连接。

2016年,服务器数量达到8000台。Wargaming吸收了其他工作室,出现了更多的会员网络。它们似乎是我们的,但不完全是:VLAN通常不适用于合作伙伴,您必须使用具有VRF的VPN,隔离变得更加复杂。混合了ACL分离株。


2016

采用网络模型。到2018年初,汽车车队增加到16,000。有6个细分市场,我们不计算存储财务数据的其余部分(包括封闭部分)。有容器网络(Kubernetes),DevOps,通过VPN连接的云网络,例如,从IVS。有很多规则-很伤人。


2018年的网络模型和隔离方法。

为了进行隔离,我们使用了:L2上具有ACL的VLAN,L3上具有ACL的VRF,VPN等。太多了。

问题


每个人都生活在ACL和VLAN中。通常有什么问题?哈罗德隐藏了痛苦,将回答这个问题。



问题很多,但有五个大问题。

  • 新规则的几何价格上涨每个新规则的添加时间都比前一个规则长,因为您必须首先查看是否已经存在这样的规则。
  • 网段内部没有防火墙段之间以某种方式彼此分离,内部已经没有足够的资源。
  • 该规则已经应用了很长时间。一个本地规则操作员可以在一个小时内完成手写。全球花了几天时间。
  • 审核规则有困难更确切地说,这是不可能的。最早的规则写于2010年,大多数作者不再在公司工作。
  • 对基础设施的控制水平低这是主要的问题-我们不知道发生了什么事。

这是网络工程师在2018年听到的样子:“我们需要更多ACL。”



解决方案


在2018年初,决定对此做一些事情。

集成的价格在不断增长。起点是大型数据中心不再支持隔离的VLAN和ACL,因为设备上的内存已用完。

解决方案:消除了人为因素,并自动提供了最大的访问权限。

新规则适用很长时间。解决方案:加快规则的应用,使其分布和并行。为此,您需要一个分布式系统,以便规则可以单独交付,而每千个系统中没有rsync或SFTP。

网段内部缺少防火墙。当不同的服务出现在同一网络中时,网段内部的防火墙开始向我们飞来。解决方案:使用基于主机的防火墙。几乎到处都是Linux,而iptables到处都是,这不是问题。

审核规则有困难。解决方案:将所有规则放在一个地方进行审查和管理,以便我们可以审核所有内容。

对基础架构的控制水平较低。解决方案:清点所有服务及其之间的访问。

这更多是一个管理过程,而不是技术过程。有时我们每周有200-300个新版本,特别是在促销和节假日期间。但是,这仅适用于我们的DevOps的一个团队。有这么多版本,无法看到需要什么样的端口,IP和集成。因此,我们需要经过专门培训的服务经理来采访团队:“那里有什么,为什么要举起呢?”

经过我们的一切努力,2019年的网络工程师开始看起来像这样。



领事


我们决定将在服务经理的帮助下找到的所有内容都放在Consul中,然后从那里编写iptables规则。

我们是如何决定这样做的?

  • 我们收集所有服务,网络和用户。
  • 让我们根据它们创建iptables规则。
  • 自动化控制。
  • ...
  • 利润。

Consul不是远程API;它可以在每个节点上工作并写入iptables。仍然只有自动清除多余的东西,大多数问题都将得到解决!我们将在此过程中完成其余的工作。

为什么要领事?


完善的。在2014-15年度,我们将其用作Vault的后端,我们在其中存储了密码。

不会丢失数据。在使用过程中,领事在任何事故中均不会丢失数据。对于防火墙管理系统而言,这是一个巨大的优势。

P2P通信加速了变化的传播。使用P2P,所有更改都可以很快完成,无需等待数小时。

便捷的REST API。我们还考虑了Apache ZooKeeper,但它没有REST API,您将不得不cru着拐杖。

它用作密钥库(KV)和目录(服务发现)。您可以立即存储服务,目录,数据中心。这不仅对我们方便,而且对附近的团队也很方便,因为在建立全球服务时,我们认为规模很大。

用Go语言编写,它是Wargaming堆栈的一部分。我们喜欢这种语言,我们有很多Go开发人员。

强大的ACL系统。在Consul中,您可以使用ACL来管理写谁和写什么。我们保证防火墙的规则不会与其他任何规则重叠,并且我们对此不会有任何问题。

但是领事有其缺点。

  • 如果您没有企业版,则它不会在数据中心内扩展。它仅由联盟缩放。
  • 非常取决于网络质量和服务器负载。如果网络中存在任何滞后(例如速度不均匀),Consul将无法正常用作繁忙服务器上的服务器。这是由于P2P连接和更新分发模型。
  • 无障碍监控的困难在领事的地位可以说一切都很好,但是他早已死亡。

我们在领事馆运作期间解决了大多数此类问题,因此我们选择了它。该公司已经制定了替代后端的计划,但是我们已经学会了如何处理问题,并且仍然与Consul合作。

领事如何工作


在条件数据中心中,我们安装了三到五台服务器。一两个服务器将无法工作:当数据不匹配时,它们将无法组织仲裁并确定谁是对的,谁是错的。超过五个没有意义,性能将会下降。



客户端以任何顺序连接到服务器:相同的代理,仅带有标志server = false



之后,客户端会收到一个P2P连接列表,并在它们之间建立连接。



在全球范围内,我们正在互连多个数据中心。他们还连接P2P并进行通信。



当我们要从另一个数据中心收集数据时,请求将在服务器之间进行。这种方案称为Serf协议像领事一样的农奴协议是由HashiCorp开发的。

关于领事的一些重要事实


领事有描述他的工作的文件。我只会给出一些值得了解的事实。

领事服务器从选民中选择主人Consul从每个数据中心的服务器列表中选择向导,并且无论服务器数量如何,所有请求都只会发送给该向导。挂起向导不会导致再次当选。如果未选择向导,则任何人都无法满足请求。
您要水平缩放吗?对不起,不行。
到另一个数据中心的请求都从主服务器发送到主服务器,而不管它是到达哪个服务器。除转发请求上的负载外,所选主服务器将承受100%的负载。所有数据中心服务器都具有数据的最新副本,但只有一个答案。
扩展的唯一方法是在客户端上启用陈旧模式。
在陈旧模式下,您可以无仲裁地进行响应。在这种模式下,我们拒绝数据一致性,但是读取速度比平常快一点,并且任何服务器都会响应。自然地,录制仅通过母带进行。

领事不会在数据中心之间复制数据。收集联盟时,每个服务器将只有其自己的数据。对于其他人,他总是求助于其他人。

操作的原子性不能在事务之外得到保证。请记住,不仅您可以更改某些内容。如果您希望有所不同,请使用锁进行交易。

阻塞操作不能保证阻塞。该请求从一个主服务器发送到另一个主服务器,而不是直接发送,因此无法保证例如在另一个数据中心中锁定时该锁定将起作用。

ACL也不保证访问(在许多情况下)。 ACL可能无法工作,因为它存储在联盟的一个数据中心内-ACL数据中心(主DC)中。如果DC无法回答您,则ACL将不起作用。

一个悬停向导将冻结整个联盟。例如,在联盟中有10个数据中心,而在一个中有一个坏的网络,而一个主节点掉线了。与他交流的每个人都围成一个圈:正在发出请求,对此没有答案,线程挂起。仅在一两个小时内,整个联合会就将倒台,这是不可能的。您对此无能为力。

状态,法定人数和选举在单独的线程中处理。重新选择不会发生,状态不会显示任何内容。您问,您有一个现场领事,什么也没发生-没有答案。而且,状态表明一切都很好。

面对这个问题,为了避免这种情况,我们不得不重建数据中心的特定部分。

Consul Enterprise的商业版本没有上述缺点它具有许多有用的功能:投票,分发,缩放。只有一个“但是”-分布式系统的许可系统非常昂贵。

生活技巧:rm -rf /var/lib/consul-治愈所有疾病的药物。如果您不满意,只需删除数据并从副本中下载数据即可。领事很可能会工作。

贝夫


现在让我们谈谈我们向领事添加的内容。

BEFW -的缩写床和 ACK Ë在F的怒火在W所有。创建存储库时必须以某种方式命名产品,以便将第一个测试提交放入其中。这个名字仍然存在。

规则模板


规则以iptables语法编写。

  • -N BEFW
  • -P输入下降
  • -A INPUT -m状态-状态已建立,已建立-j接受
  • -A输入-i lo -j接受
  • -A输入-j BEFW

大家都去BEFW链,除了ESTABLISHEDRELATED和本地主机。模板可以是任何东西,这只是一个例子。

BEFW有什么用?

服务


我们有一个服务,它总是有一个端口,即它在其上工作的节点。从我们的节点,我们可以在本地询问代理并发现我们有某种服务。您还可以放置标签。



在Consul中运行并注册的任何服务都将变成iptables规则。我们有SSH-打开端口22。bash脚本很简单:curl和iptables,不需要其他任何东西。

顾客


如何不对所有人开放访问,而是对所有人开放?通过服务名称,将IP列表添加到KV存储库。



例如,我们希望第十个网络中的每个人都能够访问SSH_TCP_22服务。添加一个小的TTL字段?现在我们有了临时权限,例如一天。

访问权限


我们将服务与客户联系起来:我们为每一个KV存储准备就绪提供服务。现在,我们不让所有人访问,而是选择性地访问。



团体


如果每次我们为访问编写数千个IP,我们都会感到厌倦。让我们提出分组-KV中的一个单独子集。我们将其称为Alias(或组),并根据相同的原理将组存储在此处。



连接:现在,我们可以不专门在P2P上打开SSH,而可以在整个组或几个组上打开SSH。同样,也有TTL-您可以添加到组中并暂时从组中删除。



积分


我们的问题是人为因素和自动化。到目前为止,我们已经这样解决了。



我们使用Puppet,并将与系统(应用程序代码)相关的所有内容都传送给它。 Puppetdb(常规PostgreSQL)存储在此处运行的服务列表,您可以按资源类型找到它们。在那里您可以找到谁去哪里。我们也有一个拉取请求和合并请求系统。

我们编写了befw-sync,这是帮助传输数据的最简单解决方案。首先,将同步cookie转到puppetdb。在此处配置HTTP API:我们询问我们拥有哪些服务,需要完成哪些工作。然后他们向领事提出请求。

有整合吗?是的:他们编写了规则,允许接受拉取请求。需要一些端口或将主机添加到某个组?拉取请求,复查-不再“找到200个其他ACL并尝试对此做一些事情”。

优化


使用空规则链的本地主机ping需要0.075毫秒。



在此链中添加10,000个iptables。结果,ping将增加5倍:iptables是完全线性的,处理每个地址都需要一些时间。



对于将数千个ACL迁移到其中的防火墙,我们有很多规则,这会带来延迟。对于游戏协议,这是不好的。

但是,如果我们将10,000个地址放入ipset ping中,甚至会减少。



关键是,ipset的“ O”(算法复杂度)始终为1,无论有多少规则。没错,这是有限制的-规则不能超过65535个,现在,我们可以忍受:您可以将它们组合,扩展它们,将两个ipset合并为一个。

存储


迭代过程的逻辑延续是在ipset中存储该服务的客户信息。



现在,我们具有相同的SSH,并且我们不会立即写入100 IP,但是我们将名称ipset设置为与之通信,并遵循以下规则DROP您可以重做规则“谁不在这里,那就是DROP”,但更清楚。

现在我们有了规则和集合。主要任务是在编写规则之前进行设置,因为否则iptables将不会编写规则。

一般方案


以图表的形式,我所说的一切看起来都是这样。



提交给Puppet,一切都发送到主机,服务在这里,ipset在那,并且没有注册的人是不允许的。

允许否认


为了快速拯救世界或迅速关闭某人,在所有链的开头,我们设置了两个ipset:rules_allowrules_deny怎么运行的?

例如,有机器人的人会在我们的网络上创建负载。以前,有必要通过日志查找其IP,并将其提交给网络工程师,以便他们找到流量的来源并禁止它。现在看起来不一样了。



我们运送到领事,等待2.5 s,您就完成了。由于领事通过P2P进行快速分发,因此它可以在世界上的任何地方工作。

一旦我完全停止了WOT,就对防火墙犯了错误。rules_allow-这是我们针对此类情况的保险。如果我们在某处的防火墙上犯了一个错误,某处的某物被阻止了,我们总是可以发送一个条件0.0/0来快速提升一切。然后,我们将动手修理所有东西。

其他套


您可以在space中添加任何其他集合$IPSETS$



做什么的?例如,有时有人需要一个ipset来模拟集群某些部分的断开连接。每个人都可以带上任何套服,叫他们,它们将从领事馆带走。同时,这些集合既可以参与iptables规则,又可以像团队一样NOOP:守护程序将支持一致性。

用户数


它曾经是这样的:一个用户连接到网络并通过域接收参数。直到下一代防火墙,思科才能够了解用户在哪里以及IP在哪里。因此,仅通过主机名计算机授予访问权限。

我们做了什么?收到地址时已楔入。通常是dot1x,Wi-Fi或VPN-一切都通过RADIUS进行。对于每个用户,请按用户名创建一个组,并在其中放入一个带有TTL的IP,该IP等于其dhcp.lease-一旦过期,该规则就会消失。



现在,我们可以通过用户名打开对服务以及其他组的访问。当主机名更改时,我们摆脱了主机名的困扰,并减轻了网络工程师的负担,因为他们不再需要Cisco。现在,工程师自己规定访问服务器的权限。

绝缘


同时,我们开始拆卸绝缘材料。服务经理进行了盘点,我们分析了所有网络。我们将它们分解为相同的组,并在必要的服务器上添加了这些组,例如拒绝。现在,生产中的rules_deny进入了相同的阶段隔离,但生产本身中没有。



该方案快速简便地工作:从服务器上删除所有ACL,卸载硬件,减少隔离VLAN的数量。

完整性控制


以前,有一个特殊的触发器对我们有用,它会在有人用手更改防火墙规则时通知。我写了一个庞大的防火墙规则检查器,这很困难。现在,完整性控制BEFW。他热情地确保自己制定的规则不会改变。如果有人更改了防火墙规则,他将把所有内容退回。“我迅速在这里提出了一个代理,可以在家工作”-不再有这种选择。

BEFW从服务中控制ipset,并在befw.conf中列出BEFW链中的服务规则。但是不遵循其他链和规则以及其他ipset。

事故保护


BEFW总是将最后成功的状态直接保存在state.bin的二进制结构中。如果出了什么问题,它总是回滚到此state.bin。



当领事不发送数据或有人犯了错误并且使用了无法应用的规则时,这就是领事的不稳定保险。为了使我们没有防火墙,如果在某个阶段发生错误,BEFW将回滚到最后一个状态。

在紧急情况下,这保证了我们将继续使用有效的防火墙。我们打开所有灰色网络,希望管理员能来解决它​​。有一天,我将在配置中使用它,但现在我们只有三个灰色网络:10 / 8、172 / 12和192.168 / 16。作为我们领事的一部分,这是有助于进一步发展的重要功能。

: - BEFW. . GitHub.


我将告诉您我们遇到的错误。

ipset添加设置0.0.0.0/0。如果添加到ipset 0.0.0.0/0会发生什么?是否会添加所有IP?是否可以打开互联网?

不,我们遇到了一个错误,使我们损失了两个小时的停机时间。此外,该漏洞自2016年以来一直未起作用,它位于RedHat Bugzilla中,编号为1297092,但我们是偶然发现的-来自开发人员的报告。

现在BEFW有了一条严格的规则,它0.0.0.0/0变成了两个地址:0.0.0.0/1128.0.0.0/1

ipset恢复集<文件。 ipset告诉您什么restore?您认为它像iptables一样起作用吗?恢复数据?

没什么-他会合并,并且旧地址不会消失,您也无法关闭访问权限。

测试隔离时,我们发现了一个错误。现在有一个相当复杂的系统- 然后而不是restore执行该系统。交换结束时:为了实现原子性,因为如果您先执行该操作,然后此时有一些软件包到达,则它将被丢弃,并且会出问题。因此,有一点黑魔法。领事kv get -datacenter = other。就像我说的,我们认为我们正在请求一些数据,但是我们将得到数据或错误。我们可以在本地通过领事来完成此操作,但是在这种情况下,两者都会挂起。 本地Consul客户端是HTTP API的包装器。但是它只是挂起,并且无论如何都不会回答Ctrl + C或Ctrl + Zcreate temprestore flush temprestore tempflush



kill -9在相邻的控制台中。我们在构建大型集群时遇到了这一问题。但是我们仍然没有解决方案,我们正在准备纠正领事中的错误。

领事馆长没有回应。我们数据中心的主管没有回应,我们认为:“也许重新选择算法现在可以工作了?”

不,它不起作用,监视也不会显示任何内容:领事会说有一个承诺指标,已经找到一个领导者,一切都很好。

我们该如何应对?service consul restart每小时都有cron。如果您有50台服务器-没什么大不了的。当将有16,000时,您将了解它是如何工作的。

结论


结果,我们获得了以下优势:

  • 所有Linux机器的100%覆盖率。
  • 速度。
  • 自动化
  • 使铁和网络工程师摆脱奴隶制。
  • 集成机会几乎是无限的:即使使用Kubernetes,甚至使用Ansible,甚至使用Python。

缺点:领事,我们现在和谁住在一起,而且犯错的代价很高。例如,一次在下午6点(俄罗斯的黄金时段),我在网络列表中做出了某些裁定。那时我们正在BEFW建造隔热材料。我在某个地方弄错了,看来,我戴错了口罩,但是一切都在两秒钟后掉落。监控点亮,值班人员进来:“一切都在我们身边!” 部门负责人向企业解释为什么会发生这种情况时,他变成了灰色。

错误的代价很高,以至于我们想出了自己的复杂预防程序。如果您要在大型生产中实施它,则不需要通过Consul向每个人提供主令牌。结局很糟。

成本。我独自编写了400个小时的代码。为了支持我的4人团队,每个月要花费10个小时。与任何新一代防火墙的价格相比,它是免费的。

计划。长期计划是寻找替代或替代领事的运输方式。也许是卡夫卡之类的。但是在未来的几年中,我们将继续担任领事。

近期计划:与Fail2ban集成,与监视,与nftables集成,可能与其他发行版,指标,高级监视,优化。Kubernetes的支持也在计划中,因为现在我们有几个集群和需求。

另一个计划:

  • 搜索交通异常;
  • 网络地图管理;
  • Kubernetes支持;
  • 组装所有系统的包装;
  • 网页界面

我们一直在努力扩展配置,增加指标和优化。

加入项目。该项目原来很酷,但是不幸的是,这仍然是一个人的项目。来到GitHub并尝试做一些事情:提交,测试,提供一些东西,进行评估。

同时,我们正在为将于4月6日至7日在圣彼得堡举行的Saint HighLoad ++做准备,并且我们邀请高负载系统的开发人员提交报告经验丰富的演讲者已经知道该怎么做,我们建议演讲的新手至少应该尝试以发言人身份参加会议有很多好处。其中,你可以阅读,例如,在结束这篇文章

Source: https://habr.com/ru/post/undefined/


All Articles