我的设置是作为负载均衡器的常规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白名单?
答案 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。