域名连接ipv6和ipv4连接失败后为什么客户端不快速回退到 IPv4?

社区话题 Linux/macOS 与自动化运维 NPS穿透到本地Minecraft客户端连接服务器 域名连接失败问题 域名连接ipv6和ipv4连接失败后为什么客户端不快速回退到 IPv4?

#1299

追光
管理员

为什么客户端不快速回退到 IPv4?

根因在于 不同系统/程序对 Happy Eyeballs(RFC 8305)算法实现不同。
该算法本意是:IPv6 不可用时能快速回退 IPv4。但某些应用并未实现。

? 典型差异

程序 行为
Java / Minecraft 默认不启用 Happy Eyeballs。先尝 IPv6,超时(30–60 秒)后才试 IPv4 → 表现为卡顿。
传统 nc 串行尝试 IPv6 → 超时 → IPv4,无并行连接。
curl / wget / 浏览器 实现 Happy Eyeballs,IPv4/IPv6 并行连接,谁先成功用谁。

? 为什么 IPv6 连接“超时”?

服务器若:
• 没监听 IPv6 端口;
• 防火墙 DROP 而非 REJECT;

则客户端收不到响应,TCP SYN 会长时间超时。

✅ 解决方案
1. 仅用 IPv4(推荐)

java -Djava.net.preferIPv4Stack=true -jar Minecraft.jar

2. 删除域名 AAAA 记录 → 客户端仅解析 IPv4。
3. IPv6 返回 RST 而非 DROP

ip6tables -A INPUT -p tcp --dport 2443 -j REJECT --reject-with tcp-reset

? 总结
• Java/Minecraft 无 Happy Eyeballs → IPv6 超时再试 IPv4
• IPv6 防火墙 DROP → 连接长时间卡住
• 工具差异大(curl 快、nc 慢)

⚡ 若仅提供 IPv4 服务,请勿发布 AAAA 记录。
“不自动回退”其实是“回退太慢”。