首页 > 其他分享 >使用 Cloudlfare 获取 IPV4 以及 IPV6 的测试

使用 Cloudlfare 获取 IPV4 以及 IPV6 的测试

时间:2024-10-21 17:21:37浏览次数:8  
标签:Cloudlfare HTTP IP CF CONNECTING IPV4 IPV6 Cloudflare

前言,最近 Cloudflare 的 IP 获取有些变化,导致获取用户的 IP 出现一些问题,经过测试记录一下

以下解释以 PHP 中的 $_SERVER 中的值为例

一般来说,在不使用反向代理的情况下,我们通常使用 REMOTE_ADDR 获取客户端的 IP

REMOTE_ADDR

但是在使用了反向代理之后,我们使用 HTTP_X_FORWARDED_FOR,因为 REMOTE_ADDR 已经是反向代理服务器的 IP

HTTP_X_FORWARDED_FOR

但是众所周知 HTTP_X_FORWARDED_FOR 值是可以伪造的,而它可以以逗号为连接的多个值,所以很不安全

这时候,在使用 Cloudflare 的情况下,Cloudflare 设置 HTTP_CF_CONNECTING_IP 获取 IP

HTTP_CF_CONNECTING_IP

坑来了,注意以下测试数据

细心的管理员会发现,有些用户的 IP 通过 HTTP_X_FORWARDED_FOR 和 HTTP_CF_CONNECTING_IP 获取均为内网 IP ,例如:251.120.126.7

经过推测,应该是电信运营商为用户分配了 IPV6 地址,但同时也分配了 IPV4 地址,只不过为了节省 IP 资源,IPV4 设置为内网 IP ,这时候 HTTP_CF_CONNECTING_IP 值就准确了

怎么办呢?

这个时候 Cloudfalre 请求中设置的 HTTP_CF_CONNECTING_IPV6 就要登场了,因为在以上 HTTP_CF_CONNECTING_IP 为内网地址的情况下,HTTP_CF_CONNECTING_IPV6  会显示真实的 IPV6 地址

HTTP_CF_CONNECTING_IPV6 

所以,如果你有相关业务需求,你可以编写一个函数,以下以 Laravel 框架公共函数来处理。注意,这是在使用 Cloudflare 的情况下,其他 CDN 服务商需要参考对应文档

function getClientIp()
{
    $request = request();

    // 尝试获取IPv4地址
    $ipv4 = $request->header('CF-Connecting-IP');
    if ($ipv4 && filter_var($ipv4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
        return $ipv4;
    }

    // 如果IPv4无效,尝试获取IPv6地址
    $ipv6 = $request->header('CF-Connecting-IPv6');
    if ($ipv6 && filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
        return $ipv6;
    }

    // 如果Cloudflare的头部都无效,尝试使用X-Forwarded-For
    $forwardedIp = $request->header('X-Forwarded-For');
    if ($forwardedIp) {
        $ips = explode(',', $forwardedIp);
        $firstIp = trim($ips[0]);
        if (filter_var($firstIp, FILTER_VALIDATE_IP)) {
            return $firstIp;
        }
    }

    // 最后,使用Laravel的getClientIp方法
    return $request->getClientIp();
}

 

最后感谢 Cloudflare ,致敬!

 

标签:Cloudlfare,HTTP,IP,CF,CONNECTING,IPV4,IPV6,Cloudflare
From: https://www.cnblogs.com/kavo/p/18489901

相关文章

  • 阿里云服务器如何设置IPV6通过appstore的审核
    苹果上架要求:要求支持IPV6only(因为阿里云主机没有IPV6only)确认IPV6是否开启:方式1:使用ifconfig查看自己的IP地址是否含有IPv6地址。方式2.查看服务监听的IP中是否有IPv6格式的地址。(netstat-tuln)开启IPV6:vim /etc/sysctl.confvim/etc/modprobe.d/disable_ip......
  • IPv6
    IPv6的特点IPv6的主要特点如下:更大的地址空间。这是最重要的。IPv6将地址从IPv4的32位增大到128位,IPv6的地址空间是IPv4的\(2^{128-32}=2^{96}\)倍,从长远来看,这些地址是绝对够用的。扩展的地址层次结构。IPv6因为地址空间很大,所以可以划分为更多的层次。灵活的首部格式。IP......
  • Ubuntu搭建ipv6 dhcp 服务器
    Ubuntu搭建DHCPivp6server步骤1、安装DHCPserversudoapt-getinstallisc-dhcp-server2、修改配置文件/etc/dhcp/dhcpd6.confdefault-lease-time2592000;preferred-lifetime604800;optiondhcp-renewal-time3600;optiondhcp-rebinding-time7200;#Enable......
  • 获取IPV4或IPV6地址
    1publicStringgetPodIp(){2try{3StringipButton=Application.getProperty("ipButton","ipv4");4Enumeration<NetworkInterface>networkInterfaces=NetworkInterface.getNetworkInterfaces();5......
  • 中国移动宽带 IPv6 连接到公网,家庭宽带设置服务器(2024年10月)
    摘要:1、中国移动的宽带,已经支持IPv6,需要宽带光猫上做好设置。2、需要从中国移动的服务器上获取公网IPv6地址。 操作:1、确保宽带WAN连接的前缀获取方式:PrefixDelegation网关的默认登录用户名(user)、密码,在设备的背面有写着。 如果不是,就联系客服,询问宽带终端的超级......
  • IPv6详细记录
    一、地址格式书写方式:    使用“:”分隔,16进制表示,共有8组    地址总长为128bit,每一组16bit,也就是4个十六进制的数(四个二进制数表示一个十六进制数)编写格式:    可以省略每一组的前导0    如果一组所有位都为0可以化简为单个0,如果出现连......
  • 华为路由器配置IPV4和IPV6局域网示例
    设计架构图及IP地址如下:PC1和PC2通过DHCP和DHCPV6获取IPV4和IPV6地址,实现图内的所有设备IPV4和IPV6全部互通。1、IPV4配置:R2配置:<Huawei>system-viewEntersystemview,returnuserviewwithCtrl+Z.[Huawei]sysnameR2[R2]interfaceGigabitEthernet0/0/0......
  • Link-local地址是IPv6中一种特殊类型的地址,用于在同一链路(网络段)内进行通信。这些地址
    IPv6的link-local地址定义:Link-local地址是IPv6中一种特殊类型的地址,用于在同一链路(网络段)内进行通信。这些地址的前缀是FE80::/64,并且每个IPv6设备在其网络接口上都会自动生成一个link-local地址。来源:Link-local地址的设计目的是为了支持IPv6设备之间的本地通信,而不需要依......
  • 在 PowerShell 中,有多个命令与 IPv6 相关。以下是一些常用的命令和 cmdlet: 管理和配置
    在PowerShell中,有多个命令与IPv6相关。以下是一些常用的命令和cmdlet:获取网络适配器的IPv6地址:powershellCopyCodeGet-NetIPAddress-AddressFamilyIPv6查看所有网络适配器信息:powershellCopyCodeGet-NetAdapter查看特定网络适配器的IPv6地址:powershell......
  • 华为OD机试真题-IPv4地址转换成整数-2024年OD统一考试(E卷)
     最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,持续跟新。 题目描述存在一种虚拟IPv4地址,由4......