Istio中的IP黑名单

时间:2019-07-14 09:59:23

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

https://kubernetes.io/docs/tutorials/services/source-ip/此处说明的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吗?

1 个答案:

答案 0 :(得分:2)

也许您对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

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

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

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