这个文章放在云笔记里面半年多了, 出现问题场景是我们从 `迁移至
阿里云` 之后;
优化 api服务
发现有大量用户通过 X-Forwarded-For
仿造客户端IP 从而跨过我们后端对IP做的频率限制.
原理很简单 一般公司服务器都是 在服务最前端放 slb/lvs
这种负载均衡服务, 用户请求的IP 插入 X-Forwarded-For
前面
我们使用加速通道 多层的代理 ;
后端按照如下顺序获取客户端的真实IP
HTTP_ALI_CDN_REAL_IP;
HTTP_CF_CONNECTING_IP;
HTTP_X_CONNECTING_IP;
XXXX_Client_IP;
USER_REAL_IP; (通过nodejs 将用户的真实ip 透传给用户中心内网)
上述变量详解HTTP_ALI_CDN_REAL_IP
链路配置了阿里云CDN,则阿里云CDN会传递此变量给后端,变量内的值就是客户端的真实IP地址。HTTP_CF_CONNECTING_IP
如上,该值是cloudflare提供的客户端真实IP地址。HTTP_X_CONNECTING_IP
如上,该值是加速乐提供的客户端真实IP地址。XXXX_Client_IP
该值适用场景是SLB-->Nginx
直连情况下,Nginx层启用了递归搜索。并且需要OP手动添加上层SLB
的IP段为信任IP,通过判断X-Forwarded-For
内最右侧的一个非信任IP值认定为客户端的真实IP地址并把此IP赋值给remote_addr
,再由remote_addr
赋值给XXXX_Client_IP
。后端配置该配置前,请先跟OP确认上层是否配置。
XXXX_Client_IP
后端的应用服务(proxy_pass
)赋值变量:
location / {
... ...
proxy_set_header XXXX_Client_IP $remote_addr;
... ...
}
转发到后端的FastCGI
服务(fastcgi_param
)赋值变量:
location ~ \.php$ {
... ...
fastcgi_param XXXX_Client_IP $remote_addr;
... ...
}
下面是客户端代理的IP 捕获文章 与 上文没有关系 ...
参考地址: https://www.cnblogs.com/rendd/p/6183094.html
1、没有代理服务器
HTTP_X_FORWARDED_FOR
= 没数值或不显示 (X-Forwarded-For)REMOTE_ADDR
= 客户端IP
$ip = $_SERVER['REMOTE_ADDR'];
2、透明代理
REMOTE_ADDR
= 最后一个代理服务器 IPHTTP_X_FORWARDED_FOR
= 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215)
这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
三、使用普通匿名代理服务器,
REMOTE_ADDR
= 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR
= 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215)
这样就隐藏了客户端的真实ip,但服务器会知道客户端是通过代理服务器去访问的。
四、使用欺骗性代理服务器,
REMOTE_ADDR
= 代理服务器 IP
HTTP_X_FORWARDED_FOR
= 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.163, 203.129.72.215)
服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假ip。
五、使用高匿名代理,
REMOTE_ADDR
= 代理服务器 IPHTTP_X_FORWARDED_FOR
= 没数值或不显示
使用这种代理时,不同浏览器不同设备会返回不同的ip头信息,因此PHP使用$_SERVER["REMOTE_ADDR"]
、$_SERVER["HTTP_X_FORWARDED_FOR"]
获取的值可能是空值也可能是“unknown”值。
上面 五类IP获取方式 总结下 前2种都是可以真实获取客户端IP 后面 3种方式 基本服务端是抓瞎的. 主要介绍的是纯客户端的捕捉ip
方式