【问题标题】:IP Blacklisting in IstioIstio 中的 IP 黑名单
【发布时间】:2019-07-14 09:59:23
【问题描述】:

此处解释的 IP 白名单/黑名单示例 https://kubernetes.io/docs/tutorials/services/source-ip/ 使用 source.ip 属性。但是,在 kubernetes(运行在 docker-for-desktop 上的 kubernetes 集群)中,source.ip 返回 kube-proxy 的 IP。建议的解决方法是使用 request.headers["X-Real-IP"],但它似乎不起作用并在 mac 的 docker-for-desktop 中返回 kube-proxy IP。

https://github.com/istio/istio/issues/7328 提到了这个问题并表示:

使用终止客户端连接并打开与您的节点/端点的新连接的代理。在这种情况下,源 IP 将始终是云 LB 的源 IP,而不是客户端的源 IP。

使用数据包转发器,客户端发送到负载均衡器 VIP 的请求最终会到达具有客户端源 IP 的节点,而不是中间代理。

第一类负载均衡器必须在负载均衡器和后端之间使用商定的协议来传递真实的客户端 IP,例如 HTTP X-FORWARDED-FOR 标头或代理协议。 p>

谁能帮助我们如何定义一个协议来从负载均衡器获取客户端 IP?

【问题讨论】:

    标签: kubernetes kubernetes-ingress istio docker-for-mac kube-proxy


    【解决方案1】:

    也许您对 kube-proxy 和 istio 感到困惑,默认情况下 Kubernetes 使用 kube-proxy,但您可以安装 istio,它会为每个 pod 注入一个新代理,以控制到 pod 内服务的双向流量。

    话虽如此,您可以在集群上安装 istio 并仅为您需要的服务启用它,并使用 istio 机制应用黑名单

    https://istio.io/docs/tasks/policy-enforcement/denial-and-list/

    要使用源 IP 创建黑名单,我们必须离开 istio 管理如何获取源 IP 地址并使用从文档中获取的 som 配置:

    apiVersion: config.istio.io/v1alpha2
    kind: handler
    metadata:
      name: whitelistip
    spec:
      compiledAdapter: listchecker
      params:
        # providerUrl: ordinarily black and white lists are maintained
        # externally and fetched asynchronously using the providerUrl.
        overrides: ["10.57.0.0/16"]  # overrides provide a static list
        blacklist: false
        entryType: IP_ADDRESSES
    ---
    apiVersion: config.istio.io/v1alpha2
    kind: instance
    metadata:
      name: sourceip
    spec:
      compiledTemplate: listentry
      params:
        value: source.ip | ip("0.0.0.0")
    ---
    apiVersion: config.istio.io/v1alpha2
    kind: rule
    metadata:
      name: checkip
    spec:
      match: source.labels["istio"] == "ingressgateway"
      actions:
      - handler: whitelistip
        instances: [ sourceip ]
    ---
    

    您可以使用参数providerURL 来维护外部列表。

    还要检查在 istio 的入口网关服务上使用 externalTrafficPolicy: Local

    根据 cmets,我最后的建议是使用不同的入口控制器来避免使用 kube-proxy,我的建议是使用 nginx-controller

    https://github.com/kubernetes/ingress-nginx

    您可以将此入口配置为充当代理的常规 nginx

    【讨论】:

    • 谢谢@wolmi。但是,如果我必须将一组特定的 IP 列入黑名单以访问我的服务,我该怎么做? source.ip 没有给出客户端的 IP,而是入口网关的 IP。
    • 我试过这个。但是,source.ip 始终是相同的,并且是 ingress-gateway 的 IP
    • 谢谢!我试过了,它似乎不适用于 docker-for-mac。 source.ip 现在始终是 kube-proxy IP。在文档中,我看到它仅在 GKE 和 Azure 上受支持。这是否意味着在其他集群上没有解决方案?
    • 你有一个未解决的问题github.com/docker/for-mac/issues/180,但我用一个额外的选项更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-06-03
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多