Debian13 IPv4优先 IPv6优先 curl api.myip.la

需求

群友反馈在Deiban13下不能设置IPv4优先
群友反馈Debian13下不能设置IPv4优先

1. 核实问题

a. 判断是否Debian13
cat /etc/os-release

b. 判断是否同时有 ipv4 和 ipv6 出站
curl -4 api.myip.la 
curl -6 api.myip.la 

c. 判断当前是什么出站优先
curl api.myip.la 

d. 设置为 IPv4 优先
bash <(curl -sL https://raw.githubusercontent.com/crazypeace/warp.sh/main/ipv4v6.sh) 4
* 本质上是
echo "precedence ::ffff:0:0/96  100" >> /etc/gai.conf

e. 检测效果
curl api.myip.la 
Debian12 环境下 curl 返回 IPv4
Debian13 环境下 curl 返回 IPv6
Debian12返回IPv4,Debian13返回IPv6

2. curl的版本不同

在与各大GPT交流一番后, GPT提示我用 curl -v 来获取更详细的信息.
curl -v api.myip.la 
curl -v看到Debian13用的是curl 8.14.1

可以发现 
Debian12 使用的是 curl/7.88.1
Debian13 使用的是 curl/8.14.1
并且 Debian13 的 curl/8.14.1 在一开始多了2行 解析IP的结果

我们可以尝试在 Debian12 环境下测试 curl/8.14.1

3. Debian12 用C编译 curl v8.14.1


4. Debian12环境下测试 curl/8.14.1 

Debian12 的 curl/8.14.1 的结果是 返回 IPv6 
curl 8.14.1在Debian12上也返回IPv6

5. Debian13环境下测试 curl/7.88.1

可以看到 Debian13 的 curl/7.88.1 的结果是返回 IPv4
curl 7.88.1在Debian13上返回IPv4

所以可以确定是代码的变化导致结果发生了变化. 而不是Debian12与13的环境差异.

6. 从哪个版本发生的变化

我们可以编译不同版本的 curl 观察是从哪个版本开始出现这个变化.
从 7.88.1 到 8.4.0 行为是一致的.
7.88.1到8.4.0行为一致

8.5.0 在开头出现了解析IP结果. 不过只有 IPv4
8.5.0开头只解析出IPv4

8.6.0 在开头出现了IPv4 和 IPv6的解析结果. 使用 IPv4的结果.
8.6.0开头IPv4和IPv6都有,用IPv4

8.10.0 在开头有IPv4 和 IPv6的解析结果. 使用 IPv6的结果.
这也就是Debian13自带的 版本8.14.1 的行为.
8.10.0用IPv6,就是Debian13自带的行为

7. 翻阅 8.10.0 的change log

8.10.0的change log写了优先ipv6


我对此的阅读理解是, 从这个版本开始, curl 的行为是:
优先使用 IPv6, 不管 gai.conf 中定义了怎样的解析顺序.

群友回复解释happy eyeballs机制
提供的信息源
示意图:经DNS并行竞速IPv4与IPv6连接
(原文是英文, 用浏览器插件翻译)

结论

从 curl/8.10.0 开始, curl 是不能用来测试 VPS 是 IPv4优先还是IPv6优先的.

进一步地, 我猜测, 未来更多的系统和软件都会使用 Happy Eyeballs 策略, 总是优先使用 IPv6, 与系统的 gai.conf 没有关系.

========

相关推荐


评论