获取Cloudflare Tunnel下用户真实IP

Cloudflare Tunnel 获取用户真实 IP

参考资料

问题分析

  1. 部署在内网中,在80端口部署了PHP的服务器一台。
  2. 使用了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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 server {
listen 80;
listen [::]:80;

root /path/to/site/public;
index index.php;
server_name your.domain.com;

+ # 设置 Cloudflare 的真实 IP 地址
+ set_real_ip_from 127.0.0.1/32; # Cloudflare Tunnel 的 IP 地址
+ real_ip_header CF-Connecting-IP;

location / {
try_files $uri /index.php$is_args$args;
}

location ~ \.php$ {
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
+ fastcgi_param REMOTE_ADDR $remote_addr; # 传递真实 IP 地址给 PHP
}
}

对于上面修改的不同配置项的作用如下

  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地址。
  2. 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的本地地址。
  3. 在PHP FastCGI 配置块中添加的指令:

    • fastcgi_param REMOTE_ADDR $remote_addr;
      • 这一行将Nginx内部变量$remote_addr的值传递给FastCGI进程。由于我们已经使用set_real_ip_fromreal_ip_header配置了Nginx,$remote_addr将包含经过Cloudflare处理的真实客户端IP。
      • 通过将此参数传递给FastCGI(在这种情况下是PHP-FPM),在PHP应用程序中的$_SERVER['REMOTE_ADDR']将包含正确的客户端IP地址。

获取Cloudflare Tunnel下用户真实IP
https://halc.top/p/f09b73d7
作者
HalcyonAzure
发布于
2024年1月23日
许可协议