双栈网络上优先使用 IPv4
随着 IPv6 的普及,对网络特定的需求也得到改变,一些特定的场景下,我需要系统优先访问 IPv4,但是访问 IPv6网络应用也要能正常访问。但是现代操作系统,默认基本都是 IPv6 优先,所以接下来需要做一些特定的设置。
Linux
GNU/Linux 比较简单,在系统已经安装 glibc 的前提下,编辑 /etc/gai.conf 文件,取消下面行的注释
precedence ::ffff:0:0/96 100
对于使用 musl libc 或其他库的系统,譬如 alpine linux,则目前除了通过内核参数来禁用 ipv6 外,没什么更好的方法。
Windows 10/11
以管理员身份运行终端,首先查看当前系统的优先级。
netsh interface ipv6 show prefixpolicies
查询活动状态...
优先顺序 标签 前缀
---------- ----- --------------------------------
50 0 ::1/128
40 1 ::/0
35 4 ::ffff:0:0/96
30 2 2002::/16
5 5 2001::/32
3 13 fc00::/7
1 11 fec0::/10
1 12 3ffe::/16
1 3 ::/96
在 IANA IPv6 Special-Purpose Address Registry 中我们可以找到这些前缀的分配归属。由此得知 ::/0
为 IPv6 单播地址,::ffff:0:0/96
为 IPv4 地址范围。
目前我们的 IPv6 的优先级高于 IPv4,调整其优先顺序即可。
netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 45 4
恢复的话很简单,输入如下命令后重启系统
netsh interface ipv6 reset
这里还有微软提供的非命令行方法,与注册表方法:
如此,Windows 系统也将优先 IPv4 了。
可以通过 ping www.taobao.com
来观察前后的变化。