有时候,服务器的网络明明都通,但访问某些网站、仓库或 API 却慢得离谱。
这很可能是因为系统默认使用了“错误的协议栈顺序”——
Linux 默认优先使用 IPv6,而不是 IPv4。如果你想手动调整这个顺序(比如让 IPv4 优先),这篇教程正是为你准备的。
🧠 为什么要调整 IPv6 / IPv4 优先级
Linux 系统在进行 DNS 解析时,会先请求域名的 AAAA(IPv6) 和 A(IPv4) 记录。
默认情况下,它会按照系统内部的优先级(policy table)选择哪种协议先尝试。
这意味着:
如果 IPv6 可用 → 优先使用 IPv6;
即使 IPv6 延迟高、绕路、甚至不通,也会先试 IPv6,导致访问超时;
部分 VPS、Docker 镜像源、Cloudflare / GitHub / ChatGPT 等服务因此异常。
解决办法:调整 gai.conf 文件,修改协议优先顺序。
⚙️ gai.conf 是什么?
/etc/gai.conf 是 Linux 系统中控制地址选择策略的配置文件,
由 glibc 的 getaddrinfo() 函数使用。
你可以通过编辑它,改变系统在选择 IPv4 / IPv6 地址时的优先级。
作用范围:系统级,对所有使用标准网络库的程序生效(curl、apt、wget、docker 等)。
🛠️开始修改 gai.conf
1.打开配置文件
sudo nano /etc/gai.conf(或者用你喜欢的编辑器,例如 vim、vi。)
2.查看默认配置
一般情况下,文件内会有许多被注释掉的行,比如:
# For sites which prefer IPv4 connections change the last line to
# precedence ::ffff:0:0/96 100这句话其实已经告诉我们答案:
如果你想 IPv4 优先,只需要取消注释这一行。
3.设置 IPv4 优先
找到并修改:
#precedence ::ffff:0:0/96 100改成:
precedence ::ffff:0:0/96 100✅ 保存并退出即可,无需重启系统。
这表示:
::ffff:0:0/96表示 IPv4 映射地址;100是它的优先级;数字越大,优先级越高。
系统现在会优先使用 IPv4 地址。
4.如果你想让 IPv6 优先(默认)
如果之前改过,现在想恢复 IPv6 优先,只需要把这行重新注释掉:
#precedence ::ffff:0:0/96 100或者删除整行。
🔍 测试是否生效
使用以下命令检查当前出站 IP:
curl https://ipinfo.io如果返回的是 IPv4 地址(例如 203.x.x.x),代表 IPv4 已被优先使用。
也可以分别测试 IPv4 和 IPv6:
curl -4 https://ifconfig.co
curl -6 https://ifconfig.co💡 常见问题
Q1:修改后要重启网络吗?
不需要。gai.conf 会在每次调用 getaddrinfo() 时被读取,立即生效。
Q2:所有程序都受影响吗?
只要程序使用系统标准的 DNS 解析库(glibc),都会受影响。
比如 apt、curl、wget、ping 等。
但如果某个软件自己实现了解析逻辑(比如某些 Java 程序),可能不受影响。
Q3:IPv6 不通怎么办?
你可以临时关闭 IPv6:
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1不建议长期禁用,优先级调整更优雅。
🧾 示例总结
🧩 总结
Linux 默认 IPv6 优先;
可通过
/etc/gai.conf改为 IPv4 优先;立即生效,对大部分命令行工具和服务生效;
稳定性优先的 VPS、Docker 容器建议开启 IPv4 优先。
🚀 未来 IPv6 会越来越普及,但在网络质量不均的今天,
IPv4 仍然是最稳、最“能打”的选择。
评论区