使用Istio和Envoy sidecar并使用custon nginx作为负载均衡器来保留客户端IP

时间:2019-08-27 13:56:08

标签: nginx istio envoyproxy

我的设置是作为负载均衡器的常规Nginx(不是ingress-nginx),并且负载均衡器指向充当api网关的服务。问题在于,现在我正在实施Istio,已附加到我的nginx上的特使代理正在删除我的客户端IP,因此我无法将IP白名单与Nginx配置文件一起使用,例如:

allow xxx.xxx.xxx.xxx;
deny all;

因为我的Nginx正在从Envoy Sidecar接收127.0.0.1。

如何告诉Envoy向我的Nginx发送真实IP?或者如何在不使用入口组件的情况下使用Istio处理IP白名单?

1 个答案:

答案 0 :(得分:0)

例如,如果您已如下定义服务,网关和虚拟服务。我假设您使用的是istio默认控制器,而不是nginx,因为您说的是使用简单的nginx而不是nginx入口控制器:

---
kind: Service
apiVersion: v1
metadata:
  name: api
  labels:
    app: api
spec:
  selector:
    app: api
  ports:
    - port: 5000
      protocol: TCP
      targetPort: 5000
      name: http
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: api-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
    hosts:
    - "primeratest.redacted.co"
  - port:
      number: 80
      name: http
      protocol: HTTP
    tls:
      httpsRedirect: true
    hosts:
    - "primeratest.redacted.co"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: api
spec:
  hosts:
  - "primeratest.redacted.co"
  gateways:
  - api-gateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: api
        port:
          number: 5000

如果在istio-ingressgateway服务中添加 externalTrafficPolicy:Local ,然后在nginx conf中添加带有 $ http_x_forwarded_for 的标头,它将起作用。

在入口网关服务中

设置 externalTrafficPolicy:本地会导致真实客户端IP通过。 Envoy不支持过滤 x-forwarded-for ,需要添加它。

这里也讨论了基于IP的过滤作为一种可能的解决方法:filtering-forwarder

有用的文档:white-black-listing

有用的文章:whitelists