Skip to content

双栈网络开启 IPv4 优先

参考(抄): Debian 双栈网络时开启 IPv4 优先

ipv4/ipv6优先

在 Debian 等 Linux 系统下,有一个 /etc/gai.conf 文件,用于系统的 getaddrinfo 调用,默认情况下,它会使用 IPv6 优先,如果您安装了 curl 并且本地支持 IPv6,那么可以使用 curl ip.sb 测试:

sh
root@debian ~ # curl ip.sb
2001:db8::2

效果等同于 curl ip.sb -6

如果你不想使用 IPv6 优先,可以在这个文件中找到:

conf
#precedence ::ffff:0:0/96  100

取消注释,修改为:

conf
precedence ::ffff:0:0/96  100

此时再使用 curl ip.sb 测试

sh
root@debian ~ # curl ip.sb
192.0.2.2

效果等同于 curl ip.sb -4

有时候又会需要强制 IPv6 优先,因为目前 IANA 分配的公网 IPv6 还未进行到 3000:0000::/4,所以我们只要把这段之前的 IPv6 加到优先级列表即可,加入这两行 label 的优先级:

conf
label 2002::/16    1
label 2001:0::/32   1

禁用 IPv6

有一些极端情况下,我们可能需要禁止系统的 IPv6 功能,这时候就需要修改 /etc/sysctl.conf 文件,首先找到你的网卡名称,这里以 eth0 为例,然后加入如下内容:

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

如果需要其他网卡则更改或添加 net.ipv6.conf.eth0.disable_ipv6 = 1 即可。

然后使用 sysctl -p 来重新加载配置文件,此时查看 ip a 就可以发现 IPv6 已经被禁止了。