Ingress Nginx:手动设置X-Forwarded-Host后路由异常问题求助
问题解答
这是默认行为吗?
是的,这是ingress-nginx开启use-forwarded-headers: "true"后的默认行为:
- Ingress路由匹配基于请求的原始Host头(即你curl命令里的
www.domain-x.com),只要原始Host匹配Ingress规则,请求就会被路由到对应应用。 - 开启
use-forwarded-headers后,ingress-nginx会优先将请求中的X-Forwarded-Host值传递给后端应用,替换原始Host头,所以应用只能看到www.evil-or-malicious-something.com。
如何实现“拒绝此类请求”的预期效果?
可以通过两种配置方式实现,根据场景选择:
方式1:仅信任合法代理的转发头(推荐)
通过ConfigMap的trusted-proxies配置,指定只有可信来源(如集群内部IP、前端合法代理如ALB/Cloudflare的IP)的X-Forwarded-*头才会被采纳,外部用户手动添加的转发头会被直接忽略。
修改ingress-nginx的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: ingress-nginx-controller namespace: ingress-nginx data: use-forwarded-headers: "true" trusted-proxies: "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" # 替换为你的集群CIDR或可信代理IP段 forwarded-for-header: "X-Forwarded-For"
配置生效后,外部用户手动添加的X-Forwarded-Host不会被应用接收,应用将拿到原始的www.domain-x.com Host头,合法请求仍会正常路由。
方式2:直接拦截不符合条件的请求
如果需要严格拒绝带有自定义X-Forwarded-Host的请求,可以在Ingress资源中添加Nginx规则,检查X-Forwarded-Host是否与原始Host一致,不一致则返回403。
修改你的Ingress资源:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: domain-x-ingress annotations: nginx.ingress.kubernetes.io/server-snippet: | # 当X-Forwarded-Host存在且不等于原始Host时,返回403 if ($http_x_forwarded_host != $host) { return 403; } spec: rules: - host: www.domain-x.com http: paths: - path: / pathType: Prefix backend: service: name: your-app-service port: number: 80
该配置会直接拦截所有X-Forwarded-Host与原始Host不匹配的请求,阻止其到达后端应用。
内容的提问来源于stack exchange,提问作者dom_watson
相关产品推荐
相关产品推荐

