OKD 4.8 passthrough路由部署nginx日志无法获取真实客户端IP咨询
问题根因
你当前使用的是passthrough TLS终止模式的OKD Route,该模式下Ingress Controller不会解密HTTPS流量,仅做四层TCP流量透传,因此不会向请求注入X-Real-IP、X-Forwarded-For这类携带客户端真实IP的头字段,Nginx侧自然无法读取到真实IP,日志里只会显示转发流量的Ingress Controller节点IP。
注:从你提供的Nginx编译参数可以确认已经内置了http_realip_module模块,无需额外安装扩展,修改配置后直接生效即可。
现有配置不合理点
- Route层使用passthrough模式,无法传递携带真实IP的请求头
- Nginx配置仅设置了
set_real_ip_from,缺少real_ip_header指定真实IP的读取来源,就算有对应请求头也不会替换$remote_addr为真实IP set_real_ip_from直接配置为0.0.0.0/0过于宽松,存在客户端伪造请求头获取非法信任的安全风险
修复方案
方案1:切换Route为reencrypt/edge终止模式(推荐,改动最小)
如果不需要Nginx端持有TLS证书做特殊处理,切换终止模式即可让Ingress Controller自动注入真实IP相关请求头:
- 修改Route配置:
- kind: Route apiVersion: route.openshift.io/v1 metadata: name: app-cname labels: app: app spec: host: "app.dev.com" to: kind: Service name: app weight: 100 port: targetPort: 8080-tcp tls: termination: reencrypt # 不需要Nginx侧做TLS的话也可以选edge模式,后端Nginx可直接监听HTTP端口 insecureEdgeTerminationPolicy: Redirect # reencrypt模式需要补充caCertificate字段,填写Nginx证书的CA根证书内容,edge模式无需该字段
- 修改Nginx配置的http块:
http { # 替换为你实际的OKD Ingress Controller节点IP段,避免IP伪造风险 set_real_ip_from 10.0.0.0/24; real_ip_header X-Forwarded-For; real_ip_recursive on; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 其余原有配置保持不变 }
修改后重启Nginx Pod即可正常打印真实IP。
方案2:保留passthrough模式,启用Proxy Protocol
如果必须保留Nginx侧做TLS终止的逻辑,可通过Proxy Protocol传递真实IP:
- 联系集群管理员调整OKD Ingress Controller配置,开启Proxy Protocol支持
- 修改Nginx配置:
http { # 替换为你实际的OKD Ingress Controller节点IP段 set_real_ip_from 10.0.0.0/24; real_ip_header proxy_protocol; real_ip_recursive on; server { # 监听配置新增proxy_protocol参数 listen 8080 ssl proxy_protocol; listen [::]:8080 ssl proxy_protocol; # 其余原有server配置保持不变 } # 其余原有http配置保持不变 }
修改后重启Nginx Pod即可生效。
内容的提问来源于stack exchange,提问作者DrunkCoder
相关产品推荐
相关产品推荐

