NGINX Ingress Controller中PROXY协议配置详解
什么是PROXY协议
PROXY协议是一种网络协议,它允许中间服务器或负载均衡器(如HAProxy、ELB等)将客户端的原始连接信息(包括IP地址和端口)传递给后端的服务。在Kubernetes环境中,当NGINX Ingress Controller位于中间服务器或负载均衡器之后时,启用PROXY协议可以帮助我们获取真实的客户端IP地址。
为什么需要PROXY协议
在典型的网络架构中,客户端请求通常会经过多层中间服务器或负载均衡器。如果没有PROXY协议,后端服务看到的客户端IP地址将是最后一个中间服务器的IP地址,而不是真实的客户端IP。这会导致:
- 日志记录不准确
- 基于IP的访问控制失效
- 地理位置服务无法正常工作
- 安全审计困难
配置PROXY协议
要在NGINX Ingress Controller中启用PROXY协议,需要通过ConfigMap进行配置。以下是关键配置项:
基本配置
proxy-protocol: "True"
这个配置项启用PROXY协议支持,它会应用于所有的Ingress和VirtualServer资源。
必要配套配置
启用PROXY协议后,还需要配置以下两个关键参数:
- real-ip-header:必须设置为
proxy_protocol
,告诉NGINX使用PROXY协议头中的IP地址 - set-real-ip-from:指定可信的中间服务器IP地址或子网范围
real-ip-header: "proxy_protocol"
set-real-ip-from: "192.168.0.0/16"
配置示例解析
下面是一个完整的ConfigMap配置示例:
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-config
data:
proxy-protocol: "True"
real-ip-header: "proxy_protocol"
set-real-ip-from: "192.168.0.0/16"
在这个示例中:
proxy-protocol: "True"
启用了PROXY协议支持real-ip-header: "proxy_protocol"
指定使用PROXY协议头set-real-ip-from: "192.168.0.0/16"
表示信任来自192.168.0.0/16子网的连接
注意事项
-
安全考虑:
set-real-ip-from
应该尽可能精确地指定可信中间服务器的IP范围。在生产环境中,不建议设置为0.0.0.0/0
(信任所有IP),这可能导致IP欺骗攻击。 -
TransportServer资源:只有在Ingress Controller启用了TLS Passthrough时,TransportServer资源才支持PROXY协议。
-
日志记录:启用PROXY协议后,NGINX日志中的
$remote_addr
变量将显示真实的客户端IP地址,而不是中间服务器的IP地址。 -
向后传递:NGINX Ingress Controller默认会将真实IP地址通过
X-Real-IP
头传递给后端服务。
实际效果
配置生效后,NGINX的默认日志格式将记录真实的客户端IP:
'$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'
其中$remote_addr
将显示真实的客户端IP地址,而不是中间服务器的IP地址。
最佳实践
-
精确配置可信IP:尽量缩小
set-real-ip-from
的范围,只包含确实需要信任的中间服务器IP。 -
测试验证:配置完成后,应该通过发送测试请求并检查日志来验证真实IP是否正确记录。
-
监控变更:当中间服务器IP变更时,记得更新
set-real-ip-from
配置。 -
考虑使用注解:对于特定Ingress资源,可以考虑使用注解来覆盖全局配置(如果支持)。
通过正确配置PROXY协议,可以确保在复杂的网络架构中,服务始终能够获取到真实的客户端IP地址,这对于日志记录、访问控制和安全审计都至关重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考