反向代理以后,和应用建立连接的是 Nginx,应用看到的来源地址自然是 Nginx 所在的地址。需要 Nginx 把真实 IP 放在请求头里转发给应用:
Nginx
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}应用这边读取这些请求头。很多框架有专门的设置,比如 Express 的 app.set("trust proxy", 1),设置后 req.ip 就是真实 IP。
如果 Nginx 前面还有 CDN,$remote_addr 拿到的是 CDN 节点的地址。这时要用 realip 模块,从 CDN 传来的请求头里取出用户 IP:
Nginx
set_real_ip_from 10.0.0.0/8; # 换成 CDN 公布的回源 IP 段
real_ip_header X-Forwarded-For;
real_ip_recursive on;注意安全:X-Forwarded-For 可以被客户端伪造,只能信任来自你自己的代理或 CDN 的那部分。不要直接拿请求里原始的 X-Forwarded-For 做限流或者风控判断。
正在读取登录状态…
暂无讨论,说说你的看法吧