使用 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网站日志?