使用Calico了解网络策略



Calico网络插件通过统一的语法提供了广泛的网络策略,以保护硬件,虚拟机和Pod上的主机。这些策略可以应用在名称空间中,也可以是适用于主机端点的全局网络策略(以保护直接在主机上运行的应用程序-服务器或虚拟机可以直接作为主机)或工作负载端点(以保护在容器或托管的虚拟机中运行的应用程序)。 Calico策略允许您使用诸如preDNAT,untracked和applyOnForward之类的参数对包路径中的各个点应用安全措施。了解这些选项的工作方式可以帮助提高整个系统的安全性和性能。本文介绍了应用于主机端点的这些Calico策略设置(preDNAT,unraracked和applyOnForward)的本质,重点介绍了数据包处理路径(iptabels链)中发生的情况。

本文假定您已了解Kubernetes和Calico网络策略的工作方式。如果没有,我们建议您在阅读本文之前尝试使用Calico 基本网络策略教程主机保护教程。我们还希望您对Linux上iptables有基本的了解

印花布全球网络政策允许您应用一组标签访问规则(应用于主机组和工作负载/吊舱)。如果将异构系统(虚拟机,直接在硬件上的系统或ku​​bernetes基础架构)一起使用,这将非常有用。此外,您可以使用一组声明性策略来保护您的群集(节点),并将网络策略应用于传入流量(例如,通过NodePorts服务或外部IP)。

从根本上讲,当Calico将Pod连接到网络时(请参见下图),它会使用虚拟以太网(veth)接口将其连接到主机。 Pod发送的流量从此虚拟接口到达主机,并像处理来自物理网络接口一样进行处理。默认情况下,Calico将这些接口称为caliXXX。由于流量是通过虚拟接口传输的,因此它会通过iptables传输,就像Pod处于一跳距离之内。因此,当流量来自/来自主机时,将从主机的角度转发。

在运行Calico的Kubernetes节点上,可以按如下所示将虚拟接口(veth)映射到工作负载。在下面的示例中,您可以看到veth#10(calic1cbf1ca0f8)已连接到calico-monitoring命名空间中的cnx-manager- *。

[centos@ip-172-31-31-46 K8S]$ sudo ip a
...
10: calic1cbf1ca0f8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 5
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
...

[centos@ip-172-31-31-46 K8S]$ calicoctl get wep --all-namespaces
...
calico-monitoring cnx-manager-8f778bd66-lz45m                            ip-172-31-31-46.ec2.internal 192.168.103.134/32
calic1cbf1ca0f8
...



鉴于Calico为每个工作负载创建了一个veth接口,它如何应用策略?为此,Calico使用iptables在包处理路径的各个链中创建钩子。

下图显示了处理iptables(或netfilter子系统)中的数据包所涉及的链。数据包通过网络接口到达时,首先会通过PREROUTING链。然后做出路由决策,并基于此,数据包通过INPUT(定向到主机进程)或FORWARD(定向到Pod或网络上的另一个节点)。从本地进程开始,数据包先经过OUTPUT链,然后经过POSTROUTING,然后再通过电缆发送。

请注意,就iptables处理而言,pod也是一个外部对象(连接到veth)。总结一下:

  • 转发的流量(nat,路由到pod或从pod路由)通过PREROUTING-FORWARD-POSTROUTING链。
  • 到本地主机进程的流量通过PREROUTING-INPUT链进行。
  • 来自本地主机进程的流量通过OUTPUT-POSTROUTING链进行。



Calico提供了将策略应用于所有链的策略选项。考虑到这一点,让我们看一下Calico中可用的各种策略设置。下面的选项列表中的数字与上图中的数字相对应。

  1. 工作负载端点(pod)策略
  2. 主机端点策略
  3. ApplyOnForward选项
  4. DNA前政策
  5. 未追踪政策

让我们首先研究策略如何应用于工作负载端点(Kubernetes或OpenStack VM窗格),然后查看主机端点的策略选项。

工作负载端点


工作负载端点策略(1)


这是保护您的kubernetes容器的选项。Calico支持使用Kubernetes NetworkPolicy,但它还提供其他策略-Calico NetworkPolicy和GlobalNetworkPolicy。Calico为每个吊舱(工作负载)创建一个链,并挂钩到INPUT和OUTPUT链,以将工作负载连接到FORWARD链的过滤器表。

主机端点


主机端点策略(2)


除CNI(容器网络接口)外,Calico策略还提供了直接保护主机的功能。在Calico中,您可以通过指定主机接口和端口号(如果需要)的组合来创建主机端点。使用INPUT和OUTPUT链中的过滤器表可以实现该实体的策略应用。从图中可以看出,(2)它们被应用于节点/主机上的本地进程。也就是说,如果您创建了一个适用于主机端点的策略,它将不会影响去往/来自您的Pod的流量。但是它提供了单个界面/语法,可使用Calico策略阻止主机和Pod的流量。这极大地简化了异构网络的策略管理过程。配置主机端点策略以增强群集保护是另一个重要的用例。

ApplyOnForward策略(3)


Calico全局网络策略中的ApplyOnForward选项可用,以使策略能够应用于通过主机端点的所有流量,包括将由主机转发的流量。此流量包括发送到本地Pod或网络上的其他任何位置。Calico要求为使用PreDNAT且未跟踪的策略启用此设置,请参阅以下部分。此外,使用虚拟路由器或软件NAT时,ApplyOnForward可用于跟踪主机流量。

请注意,如果您需要对主机进程和Pod应用相同的网络策略,则不必使用ApplyOnForward选项。您只需要为所需的主机端点和工作负载端点(pod)创建标签。无论端点的类型(主机端点或工作负载)如何,Calico都足够聪明地应用基于标签的策略。

DNA前政策(4)


在Kubernetes中,服务实体的端口可以使用NodePorts选项向外转发,或者(通过使用Calico时)通过群集IP或外部IP选项声明它们向外转发。 Kube-proxy使用DNAT将绑定到服务的传入流量平衡到相应服务的pod上。鉴于此,您如何将策略应用于通过NodePort的流量?为了在DNAT处理流量(主机:端口与相应服务之间的映射)之前应用这些策略,Calico为globalNetworkPolicy提供了一个称为“ preDNAT:true”的参数。

启用pre-DNAT时,这些策略将在DNAT之前的图表中PREROUTING链的mangle表中的(4)中实现。此处不遵守常规的订单策略,因为这些策略的应用沿处理流量的路径更早发生。但是,preDNAT策略尊重它们之间的应用顺序。

使用pre-DNAT创建策略时,请务必注意要处理的流量并允许大多数流量被拒绝,这一点很重要。主机端点策略将不再检查在pre-DNAT策略中标记为“允许”的流量,而在pre-DNAT策略失败时的流量将继续在其余链中流动。
Calico强制要求在使用preDNAT时启用applyOnForward选项,因为根据定义,尚未选择流量的目的地。流量可以定向到主机进程,也可以重定向到Pod或另一个节点。

未追踪的政策(5)


网络和应用程序的行为可能会有很大差异。在某些极端情况下,应用程序可以生成许多短期连接。这可能导致conntrack(Linux网络堆栈的主要组件)的内存不足。传统上,要在Linux上运行此类应用程序,您需要手动配置或禁用conntrack,或编写iptables规则以绕过conntrack。如果您想尽快处理连接,则Calico中的未跟踪策略是一个更简单,更有效的选择。例如,如果您使用大量的内存缓存或作为针对DDOS的另一种保护措施

阅读此博客文章(或我们的翻译))以获取更多信息,包括使用未跟踪策略的性能测试。

当您将Calico globalNetworkPolicy设置为“ doNotTrack:true”选项时,它将成为**未跟踪**策略,并在Linux软件包处理管道的早期阶段应用。如果您查看上面的图,在启动连接跟踪(conntrack)之前,未跟踪的策略将应用于原始表的PREROUTING和OUTPUT链中。当未跟踪策略允许某个程序包时,会将其标记为禁用对此程序包的连接跟踪。它的意思是:

  • 未跟踪的策略将应用于每个程序包。没有连接(或流)的概念。缺乏连接会带来一些重要的后果:
  • , , , ( Calico conntrack, ).
  • untracked workload Kubernetes (pod’), pod’.
  • NAT ( ​​ NAT conntrack).
  • « » untracked- . , , untracked- ( ).
  • 在数据包处理管道的最开始就应用了未跟踪的策略。在创建Calico策略时,了解这一点非常重要。您可以为订单编号为1的广告连播设置策略,为订单编号为1000的未跟踪策略设置。没关系。未跟踪的策略将在Pod的策略之前应用。未跟踪的策略仅尊重彼此之间的执行顺序。

由于doNotTrack策略的目标之一是在Linux软件包处理管道的早期阶段强制执行该策略,因此Calico强制要求在使用doNotTrack时指定applyOnForward选项。参考数据包处理图,请注意,未路由(5)策略在任何路由决策之前应用。流量可以定向到主机进程,也可以重定向到Pod或另一个节点。

摘要


我们研究了Calico中的各种策略选项(主机端点,ApplyOnForward,preDNAT和Untracked)以及它们如何应用于数据包处理。了解他们工作的本质有助于制定有效且安全的政策。使用Calico,您可以使用全局网络策略,该策略适用于标签(一组节点和Pod),并应用具有各种参数的策略。这使安全和网络设计专家可以使用与Calico策略相同的策略语言,方便地立即保护“一切”(端点类型)。


致谢:我要感谢Sean CramptonAlex Pollitt的评论以及宝贵的信息。

All Articles