简介
双栈网络指的是设备同时支持 IPv4 和 IPv6 协议栈。现代操作系统(如 Debian)和浏览器通常默认优先使用 IPv6,只有当 IPv6 连接失败时才会“退而求其次”用 IPv4。这听起来很智能,但在实际场景中可能会遇到问题:
- 服务兼容性:某些老旧服务或内网应用只支持 IPv4,IPv6 优先可能导致连接失败
- 网络性能:部分网络环境下,IPv6 的延迟或稳定性不如 IPv4
- 特殊需求:比如开发测试时,你可能希望强制使用某一种协议
IPv4 优先:修改 gai.conf 文件
Debian 系统中,/etc/gai.conf 文件控制了 getaddrinfo 函数的行为,这个函数决定了系统如何选择 IPv4 或 IPv6 地址。默认情况下,IPv6 优先,但我们可以通过简单修改让 IPv4 站到“C 位”。
1、打开终端,输入以下命令编辑 /etc/gai.conf
#precedence ::ffff:0:0/96 100
去掉 # 号,修改为:
precedence ::ffff:0:0/96 100
保存并退出。
如果不想手动编辑,可以直接用这条命令一键搞定
sed -i 's/#precedence ::ffff:0:0\/96 100/precedence ::ffff:0:0\/96 100/' /etc/gai.conf
2、测试效果
配置完成后,用 curl 命令测试一下:
也可以使用
# 查询本机外网IPv4地址
curl 4.ipw.cn
# 查询本机外网IPv6地址
curl 6.ipw.cn
# 测试网络是IPv4还是IPv6访问优先(访问IPv4/IPv6双栈站点,如果返回IPv6地址,则IPv6访问优先)
curl test.ipw.cn
如果返回的是类似 6.6.6.6 的 IPv4 地址,恭喜你,IPv4 优先已生效!如果返回的是类似 2001:db8::2 的 IPv6 地址,检查是否正确保存了配置。
原理
::ffff:0:0/96 是 IPv4 地址在 IPv6 协议中的映射范围,设置其优先级为 100(高于默认 IPv6 的优先级),系统就会优先选择 IPv4 地址。
特殊场景:强制 IPv6 优先
有些场景可能有“奇特”需求,比如测试 IPv6 环境或某些服务明确要求 IPv6 优先。
同样编辑 /etc/gai.conf, 在文件末尾添加以下两行:
label 2002::/16 1
label 2001:0::/32 1
保存退出,或者用命令一键添加:
echo -e "label 2002::/16 1\nlabel 2001:0::/32 1" | sudo tee -a /etc/gai.conf
原理
2002::/16 和 2001:0::/32 是常见的 IPv6 地址段,设置它们的 label 优先级为 1,确保系统优先选择这些 IPv6 地址。IANA 目前分配的公网 IPv6 地址还未覆盖到 3000:0000::/4,所以这招基本万无一失
极端情况:完全禁用 IPv6
如果你的网络环境压根不需要 IPv6,或者 IPv6 总给你添乱,可以直接禁用它。编辑 /etc/sysctl.conf 文件:
net.ipv6.conf.all.disable_ipv6 = 1
# 禁用eth0的ipv6
net.ipv6.conf.eth0.disable_ipv6 = 1
添加评论