等风起

如果当誓时

All at vows.


获取Cloudflare Tunnel下访客真实IP


背景介绍

假定局域网环境中,我们在 80 端口部署一个 PHP 网站,并且使用 Cloudflare Tunnel 将内网地址 http://127.0.0.1 转发至外网。然而,这种设置会导致所有访客的访问请求都显示为 Tunnel 所在的内网IP地址(如 127.0.0.1)。

为了获取访客的真实 IP,Cloudflare 提供了 CF-Connecting-IP 这个 HTTP 请求头。通过调整 OpenResty 配置,我们可以提取并使用这个头中的真实 IP。

解决方案

以下是修改后的 OpenResty 配置文件:

server {
    listen 80 ; 
    server_name your.domain.com; 
    index index.php; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Host $server_name; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 

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

    location ^~ /.well-known/acme-challenge {
        allow all; 
        root /usr/share/nginx/html; 
    }
    error_page 404 /404.html; 
    location ~ [^/]\.php(/|$) {
        fastcgi_pass 127.0.0.1:9000; 
        include fastcgi-php.conf; 
        include fastcgi_params; 
        set $real_script_name $fastcgi_script_name; 
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
            set $real_script_name $1; 
            set $path_info $2; 
        }
        fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; 
        fastcgi_param SCRIPT_NAME $real_script_name; 
        fastcgi_param PATH_INFO $path_info; 
+       fastcgi_param REMOTE_ADDR $remote_addr;  # 传递真实 IP 地址给 PHP 
    }
}

配置说明

  1. set_real_ip_from 127.0.0.1/32;

    • 该指令用于指定哪些 IP 地址可以设置真实 IP。
    • 127.0.0.1/32 表示本地地址,因为 Cloudflare Tunnel 将流量转发到本地服务器。
  2. real_ip_header CF-Connecting-IP;

    • 指定包含真实客户端 IP 的 HTTP 头。
    • CF-Connecting-IP 是 Cloudflare 设置的头,包含原始访问者的 IP。
  3. PHP FastCGI 配置

    • fastcgi_param REMOTE_ADDR $remote_addr; 将 OpenResty 的 $remote_addr 传递给 FastCGI,确保 PHP 应用程序获取到正确的客户端 IP。

通过这些配置,即可在使用 Cloudflare Tunnel 时获取访客的真实 IP 地址。









除另有声明外,本博客文章均采用 知识共享许可协议 - 署名标示 4.0(CC BY 4.0)进行授权许可。 Made with by AsVow

最近的文章

PVE LXC下安装 OpenWRT 记录

前言 本文介绍笔者通过 Proxmox VE (PVE) LXC 安装 OpenWRT的折腾记录 前提条件 确保PVE系统已经安装了以下工具: apt install squashfs-tools 下 ……

openwrt笔记 继续阅读
更早的文章

luci-app-tailscale插件编写的爬坑记录

背景 一直以来笔者都用OpenWrt的ZeroTier服务进行组网,最近网络环境不太稳定,经常出现内网无法连接的情况。于是笔者打算使用Tailscale作为替代方案。现有的LuCI插件不能完全满足如 ……

js笔记 继续阅读