【问题标题】:What error does cURL throws when we curl a http service which is not reachable over IPv6?当我们 curl 无法通过 IPv6 访问的 http 服务时,cURL 会抛出什么错误?
【发布时间】:2023-03-24 06:48:02
【问题描述】:

我们有一个无法通过 IPv6 发现的服务,因此我们必须始终通过 IPv4 访问它。 我想通过 IPv6 向端口 1234 上的服务发出 Http 请求,我想知道 cURL 抛出的错误代码是什么?

【问题讨论】:

  • 它很可能只是超时?有什么理由你不能尝试一下,看看会发生什么?您也是通过 nam 还是通过 IP 访问它?该名称是否有 AAAA 记录?您访问它的主机是否启用了 IPv6?如果启用它是否没有 IPv6 连接?这种情况听起来可能还有其他问题。
  • 我们为用户设置了云服务,并为用户服务进行健康监控。我们正在升级到 IPv6,可能有些服务无法通过 IPv6 执行 http。所以在更新我们的云服务之前,我无法确定是哪个服务。我通过 cURL 的 curl_easy_setopt() 方法访问它。所有机器都有 IPv6 连接。

标签: curl libcurl pycurl


【解决方案1】:

你可能会运行双栈。因此,curl 尝试 IPv6 连接的唯一方法是向它传递一个 IPv6 地址以进行检查。因此,如果您进行 DNS 查找并获得 AAAA 响应,那么它将通过 IPv6 尝试。如果给它一个 A,它将通过 IPv4 发布。

如果您想强制其中一个,您可以使用 CURLOPT_IPRESOLVE 和值 CURL_IPRESOLVE_V4、CURL_IPRESOLVE_V6 或 CURL_IPRESOLVE_WHATEVER 来选择一个。

在我看来,只有当您的主机查找返回 AAAA 记录并且您无法通过 v6 连接到它时,才会发生当前问题。对我来说,这意味着您正在监视的服务已关闭/损坏。

如果您担心过渡到 V6 会导致问题,您总是可以为每个服务支付 2 个,一个设置了 CURL_IPRESOLVE_V4,一个设置了 CURL_IPRESOLVE_V6。通过这种方式,您可以监控两个协议上的服务。

此外,您可能需要/想要在您的监控服务中设置选项以指示他们是否希望您尝试 IPv6 || IPv4 ||两个都。

【讨论】:

  • 此外,现代 curl 版本还在底层使用快乐眼球方法,这意味着它会尝试连接到 IPv4 和 IPv6(如果可用)并使用连接速度最快的那个。