php如何取到客户端的真实ip的

最近对php项目获取真实ip的部分感兴趣,于是想看一看。项目的架构是这样的:
客户端--->阿里云clb--->nginx--->php-fpm
先看现象,php代码中是直接通过$_SERVER['REMOTE_ADDR']取到了真实的ip的。

第一步

先在nginx所在机器抓包,发现请求的包是这样的:

11:01:12.694050 IP 100.122.16.123.29652 > iZm5e57xg6txyi26htw99w1.http: Flags [P.], seq 0:730, ack 1, win 55, options [nop,nop,TS val 3305100269 ecr 794613098], length 730: HTTP: GET /test

100.122.16.123是阿里云的clb,也就是说数据包到达nginx时,只会取到100.122.16.123这个ip,nginx如何拿到真实ip呢?通过wireshark视图化数据包可以看到,原来clb在代理过程中给请求的header加上了X-Forwarded-For,这里面有客户端的真实ip。

第二步

nginx是如何把ip传给php-fpm进程的呢,在nginx的配置文件发现了这个:
fastcgi_param REMOTE_ADDR $remote_addr;
这也就是php-fpm可以通过$_SERVER['REMOTE_ADDR']取到真实的ip的原因了。但是$remote_addr这个变量又是怎么来的呢?在nginx的配置文件又发现了这个:

set_real_ip_from 100.64.0.0/10;
real_ip_header X-Forwarded-For;

nginx会通过这个配置读取名为X-Forwarded-For的header头,然后赋值给$remote_addr。

参考资料

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
梦想星辰大海

还要考虑客户端伪造X-Forwarded-For的情况

9个月前 评论
xing393939 (楼主) 9个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!