先看现象。阿里云 2 核 4G 的 CentOS 7.9,nginx 1.20 用 stream 模块做四层转发到后端 8080,后端应用日志里源 IP 全是 10.0.0.5 这个代理地址,限流和审计都没法做。
把日志和配置对完,能解释这个现象的基本就这几处。四层转发不解析 HTTP 头,后端只能看到代理的连接地址。另一种情况是stream 里没开 proxy_protocol,PROXY 协议头没有传过去。
还有一种情况,后端应用没有启用 PROXY protocol 解析。
另外,前面还有一层 SLB,真实 IP 只留在 X-Forwarded-For 里。
先确认后端收到的源地址
ss -tnp | grep 8080 | head
接着在 stream 的 server 段开启 proxy_protocol
proxy_protocol on;
再往下确认后端应用是否支持 PROXY protocol
grep -i proxy_protocol /etc/app/config.yml
末了重载后抓包确认头部
nginx -t && nginx -s reload && tcpdump -i lo -nn -A port 8080 -c 3
白天有业务在跑,能验证的部分都压到了晚上做。
怎么算真的好了,看的是同一批现象。后端日志里出现客户端真实 IP,限流规则按真实来源生效,抓包里能看到 PROXY TCP4 开头的那一行。
开启 proxy_protocol 后,没适配的后端会直接解析失败,切换前要确认后端版本支持。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
