修改 ipv4 和 ipv6 的优先级

发布于 2023-08-29  8 次阅读


前言

系统一般都是 ipv6 优先访问的,但是某些情况,我们仍然希望 ipv4 优先使用!

Windows

可以 ping 某个支持双栈的域名来确认系统以哪个优先。例:

ping bing.com

首先查看下系统访问的优先级:

netsh interface ipv6 show prefixpolicies

一般会显示如下信息:

下面调整优先顺序,也就是 ::ffff:0:0/96 的优先级,以管理员身份运行下面代码:

netsh interface ipv6 set  prefixpolicy ::ffff:0:0/96 100 4
上面的意思是把 ::ffff:0:0/96 (位于标签 4)的优先级调整为 100(数字越大优先级越高)

当然,反悔了的话,可以直接重置成默认配置:

netsh interface ipv6 reset
重置后可能需要重启计算机!

Linux

同样,判断哪个优先,可以使用 ping 或者 curl,比如:

curl ip.sb

返回哪个就是哪个优先,手动指定优先级,可以编辑 /etc/gai.conf 这个文件:

nano /etc/gai.conf

找到 precedence ::ffff:0:0/96 100 这行,取消前面的 # 注释,然后保存即可!

也可以直接用一行命令搞定:

sed -i 's/#precedence ::ffff:0:0\/96  100/precedence ::ffff:0:0\/96  100/' /etc/gai.conf

如果需要彻底禁用 ipv6 ,直接编辑 /etc/sysctl.conf 这个文件,然后修改或加入以下内容保存即可:

net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1

也可以用一行代码添加:

cat >> /etc/sysctl.conf << EOF
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
EOF

完成后使用 sysctl -p 重载配置或重启 VPS 即可!

附录

感谢以下参考链接:

https://ipw.cn/doc/ipv6/user/ipv4_ipv6_prefix_precedence.html

https://u.sb/debian-prefer-ipv4/