Ingress获取真实IP
一般情况下,经过ingress的请求会携带headerX-Real-IP,用户可根据header解析出真实访问IP
但是有一种情况,用户请求可能经过多个nginx才达到ingress, 通过上述方法得到的并不是用户的真实IP了(比如现在我模拟云平台nginx->ingress,就无法获取到真实IP)
user->request->nginx->…->ingress->backend
方式一 X-Forwarded-For配置
ps:适用于7层http转发
nginx-ingress官方的建议是开启use-forwarded-headers
查看NGINX Ingress Controller
的ConfigMaps配置文档,可以找到以下配置项
use-forwarded-headers
如果为true,NGINX会将传入的 X-Forwarded-* 头传递给upstreams。当NGINX位于另一个正在设置这些标头的L7 proxy / load balancer
之后时,请使用此选项(咱暂时使用此方案)
如果为false,NGINX会忽略传入的 X-Forwarded-* 头,用它看到的请求信息填充它们。如果NGINX直接暴露在互联网上,或者它在基于 L3/packet-based load balancer 后面,并且不改变数据包中的源IP,请使用此选项。
NGINX Ingress Controller直接暴露互联网也就是Edge模式不能开启为true,否则会有伪造ip的安全问题。也就是k8s有公网ip,直接让客户端访问,本配置不要设为true
forwarded-for-header
设置标头字段以标识客户端的原始IP地址。 默认: X-Forwarded-For
如果 NGINX Ingress Controller 在CDN,WAF,LB等后面,设置从头的哪个字段获取IP,默认是
X-Forwarded-For
这个配置应该和use-forwarded-headers
配合使用
compute-full-forwarded-for
将远程地址附加到 X-Forwarded-For 标头,而不是替换它。
启用此选项后,upstreams应用程序将根据其自己的受信任代理列表提取客户端IP
修改configmap nginx-configuration配置
因为我使用rke部署,因此是修改:kubectl -n ingress-nginx edit cm ingress-nginx-controller
data上加入
data:
compute-full-forwarded-for: "true"
forwarded-for-header: "X-Forwarded-For"
use-forwarded-headers: "true"
方式二 Proxy Protocol 配置实例
适用于4层tcp转发
公有云的负载均衡LB一般都支持Proxy Protocol
查看NGINX Ingress Controller的ConfigMaps配置文档,可以找到如何配置Proxy Protocol
use-proxy-protocol
启用或禁用roxy Protocol,以接收通过代理服务器和负载均衡器(例如HAProxy和Amazon Elastic Load Balancer(ELB))传递的客户端连接(真实IP地址)信息,NGINX Ingress Controller 作为receiver角色 Proxy Protocol配置:
kubectl -n ingress-nginx edit cm ingress-nginx-controller
data上加入
data:
use-proxy-protocol: "true"