获取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