linux默认已启用ipv4/ipv6双栈,但需确保内核未禁用ipv6(/proc/sys/net/ipv6/conf/all/disable_ipv6=0)、接口配置两类地址、路由与dns协同正常;关键在避免误关或配错,而非主动“开启”。

Linux系统默认已启用IPv4和IPv6双栈,只要内核未禁用IPv6、网络接口配置了两类地址、路由和DNS协同正常,双栈就自然生效。关键不是“开启双栈”,而是避免误操作把它关掉或配歪。
确认IPv6是否真的启用(别信默认)
很多系统看似支持IPv6,但实际被禁用。光看lsmod | grep ipv6有模块不等于可用——得查运行时状态:
-
cat /proc/sys/net/ipv6/conf/all/disable_ipv6返回0才算启用;返回1就是被关了 -
ip -6 addr show必须输出至少一个inet6地址(哪怕只是::1或链路本地fe80::/64) - 如果返回空或报错
Command "addr" is unknown,说明iproute2未编译IPv6支持(极少见,多见于定制嵌入式系统)
临时启用: sysctl -w net.ipv6.conf.all.disable_ipv6=0;永久生效需写入 /etc/sysctl.conf 并执行 sysctl -p。
nmcli 配置双栈连接(openEuler/CentOS/RHEL 推荐)
直接改 /etc/sysconfig/network-scripts/ifcfg-* 容易因格式错误或服务重启失败导致断网。用 nmcli 更安全:
- 先查当前连接名:
nmcli connection show - 为已有连接添加IPv6地址:
nmcli connection modify "System eth0" ipv6.addresses "2001:db8::100/64" ipv6.gateway "2001:db8::1" ipv6.method manual - 同时确保IPv4没被覆盖:
nmcli connection modify "System eth0" ipv4.method auto(或manual配静态) - 启用IPv6 DNS:
nmcli connection modify "System eth0" ipv6.dns "2001:4860:4860::8888" - 最后激活:
nmcli connection down "System eth0" && nmcli connection up "System eth0"
注意:ipv6.method 设为 manual 时必须显式配 addresses 和 gateway;设为 auto 则依赖路由器通告(RA)或DHCPv6,但部分企业网络不发RA,会导致IPv6“看似启用实则无路由”。
让应用优先走IPv4(绕过RFC 6724默认策略)
即使双栈通了,curl、wget 等工具仍可能优先连IPv6,而你的IPv6路径质量差或中间设备不兼容,结果超时回退,拖慢访问。改 /etc/gai.conf 是最轻量的解法:
- 若文件不存在,先复制模板:
cp -p /usr/share/doc/glibc-common*/gai.conf /etc/ - 编辑
/etc/gai.conf,取消注释这行:precedence ::ffff:0:0/96 100 - 该行把 IPv4-mapped IPv6 地址(即
::ffff:a.b.c.d形式)的优先级提到最高,使getaddrinfo()在解析出A+AAAA记录时倾向选IPv4 - 无需重启服务,改完立即生效;验证用
getent ahosts www.baidu.com,看第一行是否是IPv4地址
别碰 net.ipv6.conf.*.accept_ra 或全局禁用IPv6——那不是调优,是自废武功。
验证双栈是否真通(别只 ping)
ping -4 和 ping -6 只能测ICMP层连通性,掩盖真实问题:
- 测应用层:用
curl -4 https://httpbin.org/ip和curl -6 https://httpbin.org/ip,看返回的源IP是否匹配你配的IPv4/IPv6地址 - 查DNS解析行为:
dig www.google.com A +short和dig www.google.com AAAA +short,确认DNS服务器确实返回两类记录 - 检查路由表分离:
ip route show table main(IPv4)和ip -6 route show(IPv6),确保各自有有效网关,且无冲突的blackhole或unreachable条目
最容易被忽略的是防火墙:iptables 和 ip6tables 规则完全独立,开了IPv6却忘了加 ip6tables 允许规则,服务监听了也收不到包。











