移动端动态IP白名单需通过可信代理还原真实IP、运营商网段范围匹配、geo模块热更新及二次认证四层机制实现;核心是可控来源而非固定IP。

移动端动态IP无法直接写死进白名单,必须通过可更新、可识别、可绕过回环的机制来适配。核心不是“固定IP”,而是“可控来源”——比如可信代理出口、客户端标识、或带验证的临时凭证。
用可信代理链还原真实用户IP
大多数移动App请求会经过CDN、运营商网关或自建API网关,这些中间层会携带 X-Forwarded-For 或 X-Real-IP 头。Nginx需启用 real_ip_module 还原真实IP:
- 在
http或server块中配置可信代理地址:set_real_ip_from 10.10.0.0/16;(填你实际的CDN/网关网段) - 指定头部字段:
real_ip_header X-Forwarded-For;(确保后端或网关确实设置了该头) - 验证是否生效:在日志中加
$realip_remote_addr字段,对比$remote_addr是否已变成手机真实出口IP
对动态IP做“范围级白名单”而非“地址级白名单”
运营商给移动设备分配的IP通常集中在特定网段(如中国移动 111.0.0.0/8、中国联通 120.0.0.0/8),可查公开IP段库(如APNIC、CNNIC)或从自身访问日志聚类提取:
- 分析
access.log中高频出现的移动IP前缀:awk '{print $1}' logs/access.log | cut -d. -f1,2,3 | sort | uniq -c | sort -nr | head -20 - 在
location /api/mobile/中允许整个网段:allow 111.0.0.0/8;、allow 120.100.0.0/16; - 配合
deny all;放在最后,确保只放行已知运营商出口
用 geo 模块+外部文件支持热更新
当移动IP段频繁变动(如新增5G切片出口),硬编码配置难以维护。推荐用 geo 模块解耦逻辑与数据:
- 在
http块顶部定义:geo $is_mobile_allowed { default 0; include /etc/nginx/mobile-whitelist.map; } - 外部文件
/etc/nginx/mobile-whitelist.map内容示例:111.0.0.0/8 1; 120.100.0.0/16 1; 2409:8a00::/32 1; - 在 location 中拦截:
if ($is_mobile_allowed = 0) { return 403; } - 更新文件后只需
nginx -s reload,无需重启进程,适合脚本自动拉取最新IP段
补充:对关键操作加二次验证(不依赖IP)
纯IP白名单对移动场景天然脆弱——换网络、切基站、启热点都会变IP。建议敏感路径(如支付回调、账号管理)叠加轻量认证:
- 要求请求带有效 JWT Token 或 签名时间戳+AppKey,由Nginx的 lua模块 或后端统一校验
- 对未携带凭证的请求,即使IP在白名单内也返回
401 Unauthorized - 保留IP白名单作为第一道网关过滤(防扫描),凭证作为第二道业务准入(防越权)











