2

此处解释的 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 标头或代理协议。

有人可以帮助我们如何定义一个协议来从负载均衡器获取客户端 IP 吗?

4

1 回答 1

3

也许您对 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来维护外部列表。

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

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

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

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

于 2019-07-16T07:45:17.333 回答