Net Go Easy

使用排障

curl用IPv4能访问、IPv6却失败,怎么排查?

用只影响单次请求的 -4 和 -6 对照地址族,区分目标解析、IPv6路径和代理干扰,不先关闭整个系统的IPv6。

· 更新于

先保证比较的是同一条访问路径

终端里某条命令能打开网站,另一条却连接失败,可以用 IPv4/IPv6 对照缩小范围。但如果两条命令用了不同代理、不同目标或不同网络,结果就不能直接比较。

以下命令适用于带 curl 的 Linux 环境,针对允许直连的普通目标。若单位要求经过代理,不要照搬直连选项,先核对对应网络要求。

1. 复制这段对照命令

把示例根地址换成同一个出错目标:

for family in -4 -6; do
  printf '\n测试 %s\n' "$family"
  curl --disable "$family" --noproxy '*' --connect-timeout 3 --max-time 8 \
    --head --output /dev/null --silent --show-error \
    --write-out 'HTTP=%{http_code} remote=%{remote_ip}\n' https://example.com
  printf 'curl_exit=%s\n' "$?"
done

这段只读 Bash 对照不会改网卡或路由,不跟随重定向,每次请求有时间上限。--noproxy '*' 明确绕过 curl 代理,--disable 排除个人配置文件。若不允许直连,这个条件本身就不成立。它只绕过 curl 的代理选择,不会关闭系统VPN或隧道。

输出中的远端地址可能是内部地址,公开求助时先脱敏。这里的 remote_ip 只描述这次连接,并不揭示所有应用的出口。

2. 按现象往下查

对照结果 更合理的下一步
-4成功,-6提示无法解析 检查目标是否有可用IPv6记录,以及当前解析路径是否返回它
-4成功,-6连接失败或超时 换另一个确认支持IPv6的目标或网络对照,区分目标和本机路径
两个都成功 回到原出错命令,比较代理、目标路径、证书与应用环境
两个都失败 先按普通联网、解析或代理问题排查,不能单独归因于IPv6

同一主机名可能有多个地址。一次成功/失败不等于所有地址、所有时段都一样,也不是对整家服务的可用性评价。

3. 需要临时工作,可以只让这次 curl 用 IPv4

curl --disable -4 --connect-timeout 3 --max-time 10 --head https://example.com

这条没有指定绕过代理,仍可能采用环境中的代理设置。它适合处理当前 curl 的临时选择,不是“让所有应用都只用IPv4”。命令结束后无需恢复系统开关。

如果两次测试的代理条件不同,先看Linux终端代理检查,不要把代理差异误当成地址族差异。

4. DNS成功不等于IPv6路径就通了

可以用域名解析检查脚本确认系统是否取得地址,再回到这两个请求的结果。解析、TCP连接和HTTPS验证是不同环节,拿到地址只是第一步。

若只有当前下载急需完成,在允许直连且IPv4已成功的相同条件下,可给原命令加-4与--noproxy '*'再试一次;如果日常访问必须用代理,保留原代理条件,不照搬绕过选项。

不要先做什么?

不要为了解决单个 curl 请求,直接禁用整个系统IPv6、删除路由或永久改 DNS。先确认失败条件,再按实际管理方式处理;涉及单位网络或服务器配置时,把两组结果交给负责人员。你需要的是定位哪一条路径失败,而不是把所有变量一起改掉。

参考资料

  • curl 使用手册 · 资料日期 2026-10-22