EKS 阻止特定的外部 IP 查看 nginx 应用程序

问题描述

我有一个 EKS 集群,在命名空间 gitlab-managed-apps 上部署了 Nginx。从 ALB 入口向公众公开应用程序。我试图阻止特定的公共 IP(例如:x.x.x.x/32)访问网页。我尝试了 Calico 和 K8s 网络策略。没有什么对我有用。我在网络策略方面的知识有限的情况下创建了这个 Calico 策略,但它阻止了访问 Nginx 应用程序的所有内容,而不仅仅是 x.x.x.x/32 外部 IP。向所有人展示来自 ALB 的 504 网关超时

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
Metadata:
  name: ingress-external
  namespace: gitlab-managed-apps
spec:
  selector:
    app == 'Nginx'
  types:
    - Ingress
  ingress:
    - action: Deny
      source:
       nets:
       - x.x.x.x/32

解决方法

试试这个:

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: ingress-external
  namespace: gitlab-managed-apps
spec:
  selector:
    app == 'nginx'
  types:
    - Ingress
  ingress:
    - action: Deny
      source:
       nets:
       - x.x.x.x/32
    - action: Allow

calico docs 建议:

如果一个或多个网络策略应用于包含入口规则的 pod,则只允许这些策略明确允许的入口流量。

所以这意味着默认情况下拒绝任何流量,并且只有在您明确允许时才允许。这就是为什么添加附加规则 action: Allow 应该允许所有其他与上一条规则不匹配的流量。

还要记住docs提到的规则:

单个规则匹配一组数据包并对它们应用一些操作。 当指定多个规则时,它们会按顺序执行

因此默认的 Allow 规则必须遵循特定 IP 的 Deny 规则,而不是相反。