获取Cloudflare Tunnel下用户真实IP
Cloudflare Tunnel 获取用户真实 IP
参考资料
问题分析
- 部署在内网中,在
80端口部署了PHP的服务器一台。 - 使用了
Cloudflare Tunnel对内网http://127.0.0.1进行了转发,并提供https支持
SSPanel需要拥有https的情况下才可以正常使用,但是使用Cloudflare Tunnel默认的设置的情况下,所有的用户登入请求都会被记录为Tunnel的转发地址(在这种情况下即127.0.0.1)。
在这种情况下,当用户通过Tunnel访问我的网站时,Cloudflare会通过CF-Connecting-IP这个HTTP请求头传递原始访问者的IP地址。因此也就可以通过修改Nginx配置的方法来获取到对应用户的真实IP地址了。
解决方案
先在这里贴上修改了的配置文件和注释
1 | |
对于上面修改的不同配置项的作用如下
set_real_ip_from 127.0.0.1/32;set_real_ip_from指令用于指定哪些IP地址可以设置真实IP地址。- 在这种情况下,
127.0.0.1/32表示本地地址。这是因为Cloudflare Tunnel将流量转发到您的本地服务器,通常表现为来自127.0.0.1(即本地主机)的请求。 - 这条指令告诉Nginx,如果请求来自本地主机(
127.0.0.1/32),则应该考虑使用另一个HTTP头中的IP地址作为访问者的真实IP地址。
real_ip_header CF-Connecting-IP;real_ip_header指令用于指定包含真实客户端IP地址的HTTP头。CF-Connecting-IP是由Cloudflare设置的一个特殊的HTTP头,它包含了发起请求的原始访问者的IP地址。- 通过这个配置,Nginx将使用
CF-Connecting-IP头中的值来重写访问者的IP地址,这样PHP应用程序就可以获取到访问者的真实IP,而不是Cloudflare Tunnel的本地地址。
在PHP FastCGI 配置块中添加的指令:
fastcgi_param REMOTE_ADDR $remote_addr;- 这一行将Nginx内部变量
$remote_addr的值传递给FastCGI进程。由于我们已经使用set_real_ip_from和real_ip_header配置了Nginx,$remote_addr将包含经过Cloudflare处理的真实客户端IP。 - 通过将此参数传递给FastCGI(在这种情况下是PHP-FPM),在PHP应用程序中的
$_SERVER['REMOTE_ADDR']将包含正确的客户端IP地址。
- 这一行将Nginx内部变量
获取Cloudflare Tunnel下用户真实IP
https://halc.top/p/f09b73d7