了解使用 Calico 的网络策略实施选项

了解使用 Calico 的网络策略实施选项

Calico 网络插件提供了广泛的网络策略和统一的语法来保护硬件主机、虚拟机和 Pod。 这些策略可以应用在命名空间内,也可以是应用到的全局网络策略 主机端点 (保护直接在主机上运行的应用程序 - 主机可以是服务器或虚拟机)或 工作负载端点 (保护在容器或托管虚拟机中运行的应用程序)。 Calico 策略允许您使用 preDNAT、unraracked 和 applyOnForward 等选项在数据包路径中的各个点应用安全措施。 了解这些选项的工作原理有助于提高整个系统的安全性和性能。 本文解释了应用于主机端点的这些 Calico 策略选项(preDNAT、unraracked 和 applyOnForward)的本质,重点是数据包处理路径(iptabels 链)中发生的情况。

本文假设您对 Kubernetes 和 Calico 网络策略的工作原理有基本了解。 如果没有,我们建议尝试一下 网络策略基础教程 и 主机保护教程 在阅读本文之前使用 Calico。 我们也希望您对工作有基本的了解 iptables的 在linux中。

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

从根本上讲,当 Calico 将 Pod 连接到网络时(见下图),它会使用虚拟以太网接口 (veth) 将其连接到主机。 Pod 发送的流量从该虚拟接口到达主机,并以与来自物理网络接口相同的方式进行处理。 默认情况下,Calico 将这些接口命名为 caliXXX。 由于流量来自虚拟接口,因此它会通过 iptables,就好像 Pod 距离一跳一样。 因此,当流量传入/传出 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 的网络策略实施选项

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

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

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

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

了解使用 Calico 的网络策略实施选项

Calico 提供策略选项,允许您在所有链上应用策略。 考虑到这一点,让我们看看 Calico 中可用的不同策略配置选项。 下面选项列表中的数字与上图中的数字相对应。

  1. 工作负载端点 (pod) 策略
  2. 主机端点策略
  3. 应用转发选项
  4. DNAT 前政策
  5. 未跟踪的政策

我们首先了解如何将策略应用于工作负载端点(Kubernetes Pod 或 OpenStack VM),然后查看主机端点的策略选项。

工作负载端点

工作负载端点策略 (1)

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

主机端点

主机端点策略 (2)

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

ApplyOnForward 政策 (3)

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

请注意,如果您需要对主机进程和 Pod 应用相同的网络策略,则不需要使用 ApplyOnForward 选项。 您所需要做的就是为所需的主机端点和工作负载端点 (pod) 创建标签。 Calico 足够智能,可以根据标签实施策略,无论端点类型(主机端点或工作负载)如何。

PreDNAT 政策 (4)

在 Kubernetes 中,可以使用 NodePorts 选项向外部公开服务实体端口,或者可选地(使用 Calico 时)通过使用 Cluster IPs 或External IPs 选项通告它们。 Kube-proxy 使用 DNAT 将绑定到服务的传入流量平衡到相应服务的 pod。 鉴于此,如何对通过 NodePort 的流量实施策略? 为了确保在 DNAT(主机:端口和相应服务之间的映射)处理流量之前应用这些策略,Calico 为 globalNetworkPolicy 提供了一个名为“preDNAT: true”的参数。

当启用 pre-DNAT 时,这些策略将在图中的 (4) 处(在 PREROUTING 链的 mangle 表中)立即在 DNAT 之前实施。 这里不遵循通常的策略顺序,因为这些策略的应用在流量处理路径中发生得更早。 然而,preDNAT 策略尊重它们之间的应用顺序。

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

未跟踪的政策 (5)

网络和应用程序的行为可能存在很大差异。 在某些极端情况下,应用程序可能会生成许多短期连接。 这可能会导致 conntrack(Linux 网络堆栈的核心组件)耗尽内存。 传统上,要在 Linux 上运行这些类型的应用程序,您必须手动配置或禁用 conntrack,或者编写 iptables 规则来绕过 conntrack。 如果您想尽快处理连接,Calico 中的未跟踪策略是一个更简单、更高效的选项。 例如,如果您使用大量 memcache中 或作为额外的保护措施 DDOS.

读这个 博客文章我们的翻译)了解更多信息,包括使用未跟踪策略的性能测试。

当您在 Calico globalNetworkPolicy 中设置“doNotTrack: true”选项时,它会成为**未跟踪**策略,并在 Linux 数据包处理管道中很早就应用。 从上图可以看出,在连接跟踪 (conntrack) 启动之前,未跟踪的策略会应用到原始表中的 PREROUTING 和 OUTPUT 链中。 当未跟踪策略允许某个数据包时,它会被标记为禁用该数据包的连接跟踪。 它的意思是:

  • 未跟踪策略是针对每个数据包应用的。 没有连接(或流)的概念。 缺乏联系会产生几个重要的后果:
  • 如果您希望同时允许请求和响应流量,则需要针对入站和出站的规则(因为 Calico 通常使用 conntrack 将响应流量标记为允许)。
  • 未跟踪策略不适用于 Kubernetes 工作负载 (pod),因为在这种情况下,无法跟踪 pod 的传出连接。
  • NAT 无法正确处理未跟踪的数据包(因为内核将 NAT 映射存储在 conntrack 中)。
  • 当通过未跟踪策略中的“允许所有”规则时,所有数据包将被标记为未跟踪。 这几乎总是不是您想要的,因此对未跟踪策略允许的数据包进行严格筛选(并允许大多数流量通过正常的跟踪策略)非常重要。
  • 未跟踪的策略在数据包处理管道的最开始应用。 创建 Calico 策略时了解这一点非常重要。 您可以拥有 order:1 的 pod 策略和 order:1000 的未跟踪策略。 没关系。 Untracked 策略将在 pod 的策略之前应用。 未跟踪的策略仅尊重它们之间的执行顺序。

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

结果

我们研究了 Calico 中的各种策略选项(主机端点、ApplyOnForward、preDNAT 和 Untracked)以及它们如何沿着数据包处理路径应用。 了解它们的工作原理有助于制定有效且安全的政策。 通过 Calico,您可以使用应用于标签(一组节点和 Pod)的全局网络策略,并应用具有各种参数的策略。 这使得安全和网络设计专业人员能够使用单一策略语言和 Calico 策略,方便地同时保护“所有内容”(端点类型)。

致谢:我要感谢 肖恩·克兰普顿 и 亚历克萨·波利塔 以获取他们的评论和有价值的信息。

来源: habr.com

添加评论