使用 CloudFlare 时使用真实服务器 IP 的 cURL

Posted

技术标签:

【中文标题】使用 CloudFlare 时使用真实服务器 IP 的 cURL【英文标题】:cURL with the real server IP while using CloudFlare 【发布时间】:2017-11-07 23:59:56 【问题描述】:

我们的合作伙伴已将我们的服务器 IP 列入白名单,因此我们可以向他们发送带有新客户端数据的 cURL 请求,但他们的 CRM 返回 Error: IP address of a connected platform is not allowed 可能是因为标头包含 CloudFlare IP,而不是我们要求列入白名单的服务器的真实 IP。

有没有办法通过 cURL 请求显示我们的真实服务器 IP?

            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, 'http://clients.domain.com/api');

            curl_setopt($curl, CURLOPT_POST, TRUE);
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);


            $res = curl_exec($curl);
            return $res;

试过了,没有成功:

    curl_setopt($curl, CURLOPT_HEADER, FALSE);
    curl_setopt($curl, CURLOPT_INTERFACE, '1.1.1.1');

还有:

curl_setopt($curl, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: 1.1.1.1, HTTP_X_FORWARDED_FOR: 1.1.1.1"));

编辑:他们的日志显示 IPv6 IP 而不是 IPv4 服务器 IP,它看起来像这样:2a02:7aa0:1201::xxxx:xxxx经过一些调查,似乎这个 IPv6 IP 是由托管公司托管的,并且在将其列入白名单后,一切都开始工作了。 关于为什么 cURL 发送一些奇怪的 IPv6 而不是真正的服务器 IPv4 有什么想法吗?

【问题讨论】:

CloudFlare 是一个入站代理,因此传出的 cURL 请求不会通过 CloudFlare,而是从您服务器的公共 IP 出现。尝试 curl 显示您的 IP 地址的网站,看看是否与您提供的匹配。 是否有任何公共网站可以帮助我,或者我需要自己制作一个脚本? 使用了ifconfig.co,它显示了服务器IP。很奇怪,怎么可能在localhost上运行,在服务器上不行(两个IP都被列入白名单) 如果您和远程服务器拥有 ipv6,现代 Linux 和 windows 将首先使用 ipv6。您可以将 curl 选项 CURLOPT_IPRESOLVE 设置为 CURL_IPRESOLVE_V4 以强制使用 IPv4,这应该可以解决您的问题。您可能希望他们也添加 v6 地址,以防万一由于问题而退回到该地址。 太棒了!非常感谢! 【参考方案1】:

是的,如果clients.domain.com 正在通过 CF 的代理,那么您可以直接连接到服务器,并且可能只是伪造主机头。从 php 7.0.7 开始,可以这样做

curl_setopt_array($ch,array( CURLOPT_URL=>'http://clients.domain.com/api',//to set the host CURLOPT_CONNECT_TO=>'::8.8.8.8:80' )); - 但如果您使用 httpS 连接,请将 :80 替换为 :443

并将8.8.8.8替换为真实服务器的IP(不是cloudflare IP)

或者如果你还没有使用 PHP 7.0.7+,在旧版本中,你可以这样做

curl_setopt_array($ch,array( CURLOPT_URL=>'http://8.8.8.8/api', CURLOPT_HTTPHEADER=>array('Host: clients.domain.com') )); (再次,将8.8.8.8替换为真实服务器的IP,而不是cloudflare IP) 手动设置主机头。不过,我不确定这是否可以与 http 位置重定向和 CURLOPT_FOLLOWLOCATION 一起正常工作,因此您可能必须手动处理位置 http 重定向

【讨论】:

以上是关于使用 CloudFlare 时使用真实服务器 IP 的 cURL的主要内容,如果未能解决你的问题,请参考以下文章

使用 CloudFlare、Heroku 和 RoR 时如何设置真实 IP 地址?

使用了CloudFlare 的CDN,怎么找出网站的真实IP

使用了CloudFlare 的CDN,怎么找出网站的真实IP

如何在CloudFlare下Nginx实现访客真实IP网站日志?

使用了CloudFlare 的CDN,怎么找出网站的真实IP

Cloudflare配置动态dns(ddns)