获取的全是 172 开头的假 IP?Nginx 反代后,Flask 怎么才能拿到真实访客 IP?

📖 背景 监控大屏跑起来了。我想在后台加个日志,记录访客的来源 IP 防刷。 结果一看日志傻眼了:所有记录的 IP 都是 172.18.0.x。 我用的是 Nginx 反代 Flask 容器,request.remote_addr 拿到的全是 Docker 内网 IP,根本不是访客的真实公网 IP。

🔍 原因 小学生版解释: 访客(真实 IP)把信交给了门卫(Nginx)。Nginx 把信转交给里面的收发室(Flask 容器)。 Flask 看到信,问:"谁给的?" Nginx 说:"是我给的(172.18.0.x)"。 真实访客的 IP 根本没写在信封上。Flask 被骗了。

🛠 解决 两步。Nginx 加头,Flask 解析。

  1. Nginx 传递真实 IP 修改 Nginx 配置:
css 复制代码
location / {
    proxy_pass http://dashboard:5000;
    # 告诉 Flask,真实客户端 IP 是什么
    proxy_set_header X-Real-IP $remote_addr;
    # 如果有多层代理,用这个追加
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
  1. Flask 信任 Nginx 的头 修改 Flask 代码(通常是 app.py 或 init.py):
python 复制代码
from flask import Flask, request
from werkzeug.middleware.proxy_fix import ProxyFix

app = Flask(__name__)
# 告诉 Flask:我前面有 1 层代理(Nginx),请从 X-Forwarded 头里取真实 IP
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1)

@app.route('/')
def index():
    # 现在拿到的就是真实公网 IP 了
    return f"Your Real IP: {request.remote_addr}"

✅ 验证效果 重启 Nginx 和 Flask 容器。 用手机(不用 WiFi,用 4G)访问大屏。 看 Flask 日志,或者页面输出: 预期输出:Your Real IP: 你的4G公网IP(不再是 172 开头)。

💣 三个坑 配了 Nginx 忘了配 ProxyFix:Flask 默认出于安全考虑,不信任代理头。少写一行 ProxyFix,拿到的还是内网 IP。

remoteaddrvsremote_addr vs remoteaddrvsproxy_add_x_forwarded_for:X-Real-IP 适合单层代理。如果前面有 Cloudflare 和 Nginx 两层,必须用 X-Forwarded-For 列表,并取第一个 IP。

恶意伪造:代理头是可以伪造的(客户端自己带个假 IP 过来)。如果有严格的安全需求,必须配合 Nginx 的 real_ip_module 模块处理。

相关推荐
小蒜学长1 小时前
基于过程性评价的ai助学平台(代码+数据库+LW)
java·spring boot·后端·微信小程序·过程性评价
陈随易1 小时前
副业搞钱点子之 Umami 统计如何赚钱
前端·后端·程序员
利威尔xu1 小时前
万字详解 | Go 进阶(二)GC 三色标记:STW 从 10ms 压到 40μs,1 次 Full GC 让线上 P99 抖了 3 秒
开发语言·后端·性能优化·golang·高并发
金銀銅鐵2 小时前
[Java] 用 CLI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
tedcloud1233 小时前
Docker Compose 部署 Memos:从安装到备份恢复
linux·开发语言·jvm·后端·docker·容器·rust
木井巳3 小时前
【JavaEE】SpringBoot 统一功能处理: 拦截器、统一返回与全局异常
java·spring boot·后端·spring·java-ee
pan_junbiao3 小时前
Go语言中的空白标识符
开发语言·后端·golang
IT_陈寒4 小时前
SpringBoot性能优化完全指南
前端·人工智能·后端
随性而行3604 小时前
企业微信 Webhook 接收不到消息?网络连通性、URL 签名验签与 API 返回错误码排查指南
java·网络·人工智能·后端·微信·企业微信