双栈网络上优先使用 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 来观察前后的变化。