【问题标题】:cURL with PHP, possible to determine the IP address cURL will use?cURL 与 PHP,可以确定 cURL 将使用的 IP 地址吗?
【发布时间】:2011-09-15 14:54:05
【问题描述】:

是否可以通过编程方式确定 cURL 在连接到远程服务器时使用的 IP 地址?我有一个使用 cURL 的共享服务器,我需要将 IP 地址作为请求的一部分发送。

我正在与之交谈的服务器需要一个身份验证字符串,该字符串结合了连接 IP 地址和循环密码(例如,我的 $code = SHA1($_SERVER['SERVER_ADDR'] . $passcode) 与 SHA1 进行比较($_SERVER['REMOTE_ADDR'] . $passcode))。当来自 cURL 的传出连接使用与 $_SERVER['SERVER_ADDR'] 中存储的 IP 相同的 IP 时,这可以正常工作,但是 cURL 使用的 IP 地址现在不同并且会定期轮换。

【问题讨论】:

    标签: php curl


    【解决方案1】:

    您可以在调用之前执行此操作以获取您的公共 IP:

    $ch = curl_init('http://whatismyip.org/');
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
    $myIp = curl_exec($ch);
    

    但是:

    • 如果您的公共 IP 有时会在 cURL 会话之间发生变化,那么没有什么可以说它不会在上述会话和您实际需要此数据的下一个会话之间发生变化。
    • 它依赖于实际运行的whatismyip.org(或类似服务)。

    【讨论】:

    • +1,尽管如果没有非常重要的警告,我不会给出它,如果有一个池,不能保证从一个调用到另一个调用的 IP 是相同的。未知单个调用中的多个 cURL 会话是否来自同一个 IP。
    • 目前,这是我正在使用的解决方案,但在我端有一个服务,而不是 whatismyip 来更快地确定 IP 地址并且没有访问限制。不幸的是,每小时有 3,000 个连接,这对我来说不是最有效的解决方案,所以我仍在寻找。
    【解决方案2】:

    您可以强制 curl 使用的 IP,而不是检测它。

    curl_setopt() 使用CURLOPT_INTERFACE 选项 - 将其设置为您希望使用的 IP。

    如果您使用带有 IP 池的服务器(例如云服务器),则建议选择要使用的接口,如果出于安全原因在另一端检测到该接口很重要。

    就个人而言,当 IP 受到限制时,我不得不使用该功能通过 cURL 传输卡支付数据。

    【讨论】:

    • +1 以获得最佳解决方案,但在共享主机上可能无法实现。
    • @DaveRandom:大多数共享托管平台至少有一个可以绑定到托管服务器的主 IP - 尽管并不总是允许您说更改。
    • 我刚刚想到的另一点是,如果他们有多个 IP 地址绑定到单个 NIC,选择接口可能无法保证特定的 IP 地址,即使您通过特定的知识产权。 cURL 仅使用接口引用(如eth0),如果您传递 IP/主机名,它会使用它来获取接口引用。实际上,为数据包分配源 IP 是 NIC 驱动程序的责任,并且无法控制它(至少,不能通过 PHP)。
    • @DaveRandom:是的,原则上完全正确。我发现当我指定 IP 时它往往会起作用,但正如你所说,通过接口的路由处于不同的级别。 iptables 可能会有所帮助,但除非 OP 有专用服务器,否则没有用。
    • @Wige:嗯,好吧,正如 DaveRandom 所说 - 如果有多个 IP 分配给 接口,那么它可以决定使用另一个。网络路由旨在超出用户级应用程序的范围。
    【解决方案3】:

    有一个名为 whatismyip.com 的网站。他们有一个公开可用的 API,只要您不超过他们的限制(例如每小时 5 个请求?),您就可以使用它。试一试不会有什么坏处吧?

    【讨论】:

      【解决方案4】:

      假设 curl 总是在同一台服务器上运行,即使它有多个 NIC,你告诉 curl 使用哪个 IP 也没有关系。

      我会使用 DaveRandom 的技巧来获取您当前使用的 IP,然后将其设置为下一次调用使用

      curl_setopt($ch, CURLOPT_INTERFACE, "XXX.XXX.XXX.XXX");
      

      假设这两个调用足够接近,IP 很有可能仍会绑定到一个接口,通过设置它,您告诉 curl 使用该接口,而不是负载均衡器可能想要使用的任何一个.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2014-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        相关资源
        最近更新 更多