Kubernetes白名单源范围阻止而不是白名单IP。

12

在 GKE 上运行 Kubernetes

使用 helm 安装最新稳定版的 Nginx 控制器。

除了添加 whitelist-source-range 注释会导致我完全无法访问我的服务之外,一切都正常工作。

Ingress 配置

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: staging-ingress
  namespace: staging
  annotations:
    kubernetes.io/ingress.class: nginx
    ingress.kubernetes.io/whitelist-source-range: "x.x.x.x, y.y.y.y"
spec:
  rules:
    - host: staging.com
      http:
        paths:
        - path: /
          backend:
            serviceName:staging-service
            servicePort: 80

我连接到控制器 pod 并检查了 nginx 配置,发现了这个:

# Deny for staging.com/
geo $the_real_ip $deny_5b3266e9d666401cb7ac676a73d8d5ae {
    default 1;

    x.x.x.x 0;
    y.y.y.y 0;
}

看起来他是把我锁在外面,而不是将这些IP添加到白名单中。但它也锁定了所有其他地址……当我从staging.com主机访问时,我得到了403的错误。

他似乎在把我排除在外,而非将这些IP添加到白名单里。但这也导致了所有其他地址被锁定……当我从staging.com主机访问时,我收到了403错误。

(Note: I have provided two possible translations to account for different interpretations of the original text.)

只是为了澄清,这个配置将锁定来自不是 x.x.x.x 或 y.y.y.y 的 IP 的每个请求。而你发送的请求来自那些 IP,得到了 403 响应? - Jose Armesto
3个回答

16

是的。但我自己想出了解决方法。您的服务必须启用externalTrafficPolicy:Local。这意味着应该使用实际客户端IP而不是内部集群IP。

要完成此操作,请运行kubectl patch svc nginx-ingress-controller -p '{"spec":{"externalTrafficPolicy":"Local"}}'


2
如果这不能完全解决问题,还需要重新启动您的nginx控制器pod。之后应该就可以正常工作了。 - Frank Levering
此外,请注意,如果您的nginx pod在不同的节点上运行,则可能会出现问题。您可以通过将其设置为DaemonSet而不是Deployment,并使用类似的kubectl patch命令来解决此问题。 - parkerfath

8
您的nginx控制器服务必须设置为externalTrafficPolicy: Local。这意味着实际客户端IP将被使用,而不是集群的内部IP。
您需要从kubectl get svc命令中获取真实的服务名称。该服务类似于:
NAME                                          TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                      AGE
nobby-leopard-nginx-ingress-controller        LoadBalancer   10.0.139.37    40.83.166.29   80:31223/TCP,443:30766/TCP   2d

nobby-leopard-nginx-ingress-controller 是您想要使用的服务名称。

完成此操作,运行以下命令: kubectl patch svc nobby-leopardnginx-ingress-controller -p '{"spec":{"externalTrafficPolicy":"Local"}}'

当您设置新的 nginx 控制器时,可以使用以下命令:

helm install stable/nginx-ingress \
  --namespace kube-system \
  --set controller.service.externalTrafficPolicy=Local`

安装完nginx ingress controller后,要让它接受白名单,请按以下步骤操作:

1
Nginx 会针对哪个头信息进行白名单过滤? - Pramod Setlur

1

您不需要使用externalTrafficPolicy: Local,只需设置real_ip_header(通过server-snippet),并使用X-Forwarded-For标头来检索和设置客户端IP,或者其他字段,例如Cloudflare提供了CF-Connecting-IPhttp://nginx.org/en/docs/http/ngx_http_realip_module.html


抱歉,不行。我已经检查过了,你还需要设置externalTrafficPolicy: Local - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接