ITPub博客

首页 > 数据库 > 数据库开发技术 > 流量又被恶意占满了,不要急,一个策略就搞定

流量又被恶意占满了,不要急,一个策略就搞定

原创 数据库开发技术 作者:云原生AI百宝箱 时间:2023-08-28 23:39:38 0 删除 编辑

点击上方蓝字 👆关注公众号,别让消息溜走

后台回复【加群】,与牛人互动不停


如果你希望在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量, 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略(NetworkPolicy)。NetworkPolicy 是一种以应用为中心的结构,允许你设置如何允许 Pod 与网络上的各类网络“实体” (我们这里使用实体以避免过度使用诸如“端点”和“服务”这类常用术语, 这些术语在 Kubernetes 中有特定含义)通信。 NetworkPolicy 适用于一端或两端与 Pod 的连接,与其他连接无关。

Pod 可以通信的 Pod 是通过如下三个标识符的组合来辩识的:

  1. 1. 其他被允许的 Pods(例外:Pod 无法阻塞对自身的访问)

  2. 2. 被允许的名字空间

  3. 3. IP 组块(例外:与 Pod 运行所在的节点的通信总是被允许的, 无论 Pod 或节点的 IP 地址)

在定义基于 Pod 或名字空间的 NetworkPolicy 时, 你会使用选择算符来设定哪些流量可以进入或离开与该算符匹配的 Pod。另外,当创建基于 IP 的 NetworkPolicy 时,我们基于 IP 组块(CIDR 范围)来定义策略。

NetworkPolicy 是一个 Kubernetes 对象,它允许使用 IP 地址、端口、协议和标签等各种因素创建策略来限制命名空间中 pod 与外部实体之间的通信。

该ingress部分定义流入流量规则,而该egress部分定义流出流量规则。NetworkPolicy 根据podSelector标签选择 Pod、使用namespaceSelector在特定命名空间中选择Pod,以及指定ipBlock设置允许或拒绝访问 Pod 的IP 地址块。

入口和出口流量

入口流量是指定向到Kubernetes 集群中的一个 Pod 或一组 Pod 的传入网络流量。例如,如果集群外部的用户向集群内的 Pod 发送请求,则该流量将被视为该 Pod 的入口流量。

另一方面,出口流量是指Kubernetes 集群中一个或一组 pod 的传出网络流量。例如,如果集群中的 Pod 向集群外部的服务或外部端点发送请求,则该流量将被视为来自该 Pod 的出口流量。

网络策略

默认情况下,Kubernetes集群允许pod之间和外部访问不受限制的通信,这可能会带来安全风险,特别是在多个应用程序和团队共存的多租户环境中。

NetworkPolicy是一个Kubernetes 对象,允许你创建策略来定义 Pod 如何相互通信以及如何与特定命名空间内的外部实体通信。NetworkPolicy 规则可以基于 IP 地址、端口、协议和标签等各种因素,使你能够根据安全要求将流量限制到特定 Pod 或 Pod 组。

简称:netpol

$ kubectl api-resources 
NAME SHORTNAMES APIVERSION NAMESPACED KIND 
networkpolicies   netpolnetworking.k8s.io/v1        true NetworkPolicy

网络策略示例

pod选择器

该podSelector字段根据标签选择 Pod,并确定策略适用于哪些 Pod。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-network-policy
spec:
  podSelector:
    matchLabels:
      name: backend
  policyTypes:    
    - Ingress    
    - Egress
  ingress:
    - from:
        - podSelector:
            matchLabels:
            name: frontend
      ports:
        - port: 8080
          protocol: TCP
  egress:
    - to:
        - podSelector:
            matchLabels:
            name: database
      ports:
        - port: 5432
          protocol: TCP

在这种情况下,此 NetworkPolicy 的目标是标签为name: backend的 pod 。

ingress部分表示允许--来自8080端口且带有标签为name: frontend的pod的传入流量规则。

egress部分表示允许--到达5432端口且带有标签为name: database的pod的传出流量规则。

命名空间选择器

namespaceSelector是一个允许你选择特定名称空间并将网络策略规则应用于这些名称空间内的所有 pod 的字段。

...
ingress:
  - from:
      - namespaceSelector:
          matchLabels:
          name: namespace1
    ports:
      - port: 8080
        protocol: TCP
...

在这种情况下,它允许来自 带有namespace1标签的命名空间中 pod 的流量。

ip块

ipBlock选择器将选择特定的 IP CIDR 范围以用作入站流量来源或出站流量目的地。这些应该是集群外部 IP,因为 Pod IP 存在时间短暂的且随机产生。

...
ingress:
  - from:
      - ipBlock:
          cidr: 192.168.0.0/16
    ports:
      - port: 8080
        protocol: TCP
...

在本例中,该ipBlock字段指定CIDR块为192.168.0.0/16。这表示,仅当源 IP 地址位于此 CIDR 块内时, 才允许连接到 default 名字空间下的带有 name=backend 标签的所有 Pod 的 8080 TCP 端口 。

综合示例

下面是一个 NetworkPolicy 的综合示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.1.0/24
        - namespaceSelector:
            matchLabels:
              project: myproject
        - podSelector:
            matchLabels:
              role: frontend
      ports:
        - protocol: TCP
          port: 6379
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 5978

除非选择支持网络策略的网络解决方案,否则将上述示例发送到API服务器没有任何效果。

spec:NetworkPolicy 规约 中包含了在一个名字空间中定义特定网络策略所需的所有信息。

podSelector:每个 NetworkPolicy 都包括一个 podSelector, 它对该策略所适用的一组 Pod 进行选择。示例中的策略选择带有 "role=db" 标签的 Pod。空的 podSelector 选择名字空间下的所有 Pod。

policyTypes:每个 NetworkPolicy 都包含一个 policyTypes 列表,其中包含 Ingress 或 Egress 或两者兼具。policyTypes 字段表示给定的策略是应用于进入所选 Pod 的入站流量还是来自所选 Pod 的出站流量,或两者兼有。 如果 NetworkPolicy 未指定 policyTypes 则默认情况下始终设置 Ingress; 如果 NetworkPolicy 有任何出口规则的话则设置 Egress。

ingress:每个 NetworkPolicy 可包含一个 ingress 规则的白名单列表。每个规则都允许同时匹配 from 和 ports 部分的流量。示例策略中包含一条简单的规则:它匹配某个特定端口,来自三个来源中的一个,第一个通过 ipBlock 指定,第二个通过 namespaceSelector 指定,第三个通过 podSelector 指定。

egress:每个 NetworkPolicy 可包含一个 egress 规则的白名单列表。每个规则都允许匹配 to 和 port 部分的流量。该示例策略包含一条规则, 该规则将指定端口上的流量匹配到 10.0.0.0/24 中的任何目的地。

所以,该网络策略示例的具体作用有:

  1. 1. 隔离 default 名字空间下 role=db 的 Pod (如果它们不是已经被隔离的话)。

  2. 2. (Ingress 规则)允许以下 Pod 连接到 default 名字空间下的带有 role=db 标签的所有 Pod 的 6379 TCP 端口:

  • • default 名字空间下带有 role=frontend 标签的所有 Pod

  • • 带有 project=myproject 标签的所有名字空间中的 Pod

  • • IP 地址范围为 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 (即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)

  • 3. (Egress 规则)允许 default 名字空间中任何带有标签 role=db 的 Pod 到 CIDR 10.0.0.0/24 下 5978 TCP 端口的连接。

  • 原文作者:云原生AI百宝箱;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论

    注册时间:2023-06-25

    • 博文量
      70
    • 访问量
      34368