Linux下IPv4/IPv6双栈接入,使用IPv4连接优先设置教程

虽然目前很多网站或服务都已经增加IPv6,但是各家的IPv6使用上并不一定畅通。所以我们要设置一下让IPv4作为默认的连接方式。但是根据RFC3484协议Linux默认情况下IPv6优先级高于IPv4,应用程序优先使用IPv6地址。

1、如果要使用ipv4连接优先也不禁用ipv6,需要修改gai.conf配置文件使其生效。

编辑 /etc/gai.conf 文件,查找 precedence ::ffff:0:0/96 100 将前面的注释 # 去掉并保存,如果前面没有 # 号表示已经更改过设置了。如果没有查找到该行直接在文件末尾添加上

precedence ::ffff:0:0/96 100

CentOS默认没有 /etc/gai.conf  该文件,可以执行命令
cp -p /usr/share/doc/glibc-common-2.17/gai.conf /etc/
拷贝该文件后修改。

修改完成保存生效。这样设置后有IPv4的话优先使用IPv4,也不影响IPv6的使用。

注:::ffff:0:0/96 为IPv4/IPv6转换地址 (IPv4-mapped IPv6 address)。

2、如果确实不需要IPv6,我们可以禁用IPv6

执行命令:echo “1” > /proc/sys/net/ipv6/conf/all/disable_ipv6
这样就掉了禁用ipv6

如需恢复的话:echo “0” > /proc/sys/net/ipv6/conf/all/disable_ipv6

或者:nano /proc/sys/net/ipv6/conf/all/disable_ipv6

将值从1更改为0

然后重启就可以了

第二个教程,基本相同,仅有IPV6禁用不同

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

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

效果等同于 curl ip.sb -6

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

#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

此时再使用 curl ip.sb 测试

root@debian ~ # curl ip.sb
192.0.2.2

效果等同于 curl ip.sb -4

有时候又会需要强制 IPv6 优先 (怎么有些系统和用户那么奇怪?),因为目前 IANA 分配的公网 IPv6 还未进行到 3000:0000::/4,所以我们只要把这段之前的 IPv6 加到优先级列表即可,加入这两行 label 的优先级:

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

禁用 IPv6

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

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 即可。

一句话命令

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

注意 cat 命令后的 >> 即为添加文件内容,如果使用 > 则是覆盖文件内容。

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注