使用CloudFlare时使用真实服务器IP进行cURL

时间:2017-06-06 20:09:39

标签: curl ip cloudflare

我们的合作伙伴已将我们的服务器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?

1 个答案:

答案 0 :(得分:0)

是的,如果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重定向