Linux默认多数发行版已启用IPv6,但需同时满足模块加载(lsmod | grep ipv6)、sysctl参数为0(net.ipv6.conf.all.disable_ipv6=0)及网络服务支持,三者缺一不可;仅ip -6 addr show有fe80::地址不表示IPv6功能可用。

Linux 默认多数发行版已启用 IPv6 协议栈,但部分精简系统、云镜像或手动关闭过 IPv6 的环境可能处于禁用状态。是否开启,不能只看 ifconfig 或 ip addr 有没有 inet6 行——得确认内核模块加载、sysctl 开关、网络服务三者都到位。
检查 IPv6 协议栈是否真正启用
光看 ip -6 addr show 有输出不保险,有些系统即使 net.ipv6.conf.all.disable_ipv6=1,仍会显示链路本地地址 fe80::/10(这是内核强制启用的 fallback 行为)。真正判断依据是:
-
lsmod | grep ipv6有输出,说明模块已加载 -
sysctl net.ipv6.conf.all.disable_ipv6返回0,不是1 -
cat /proc/sys/net/ipv6/conf/all/disable_ipv6同样应为0 - 若前三项任一为
1,IPv6 功能实际被屏蔽,ping6、curl -6等都会失败
临时启用 IPv6(重启失效)
适合调试或验证环境是否支持,不改配置文件:
- 加载模块:
sudo modprobe ipv6 - 启用协议栈:
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0 - 同时放开 lo 和所有接口:
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0和sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=0(把eth0换成你的真实接口名) - 执行后立刻能用
ip -6 addr show看到地址,ping6 ::1测试本地环回
永久启用 IPv6(需写入配置)
关键在 /etc/sysctl.conf,但仅改这里还不够,不同发行版还需配套操作:
- 在
/etc/sysctl.conf中确保这行存在且值为0:net.ipv6.conf.all.disable_ipv6 = 0 - 执行
sudo sysctl -p加载生效 - Debian/Ubuntu:确认
/etc/network/interfaces中对应接口启用了inet6(如iface eth0 inet6 dhcp或static) - RHEL/CentOS 7+:检查
/etc/sysconfig/network-scripts/ifcfg-eth0中IPV6INIT=yes,并配好IPV6ADDR或DHCPV6C=yes - Ubuntu 18.04+(Netplan):在
/etc/netplan/*.yaml中添加dhcp6: true或静态addresses: ["2001:db8::1/64"],再sudo netplan apply
常见踩坑点:为什么改了 sysctl 还 ping 不通?
最常被忽略的是网络管理服务没重载,或配置被覆盖:
-
systemd-networkd或NetworkManager可能忽略sysctl设置,需额外在/etc/systemd/network/*.network或 NM 配置中显式启用 IPv6 - 某些云厂商镜像(如 CentOS 6.x/Debian 8)默认关闭 DHCPv6 超时等待,导致开机卡住——要加
IPV6_AUTOCONF=no或调短超时,否则systemctl restart network会 hang 住 -
firewalld或iptables默认丢弃 ICMPv6(包括ping6所需的类型),测试前先临时sudo firewall-cmd --add-icmp-block-inversion或放行echo-request - 链路本地地址
fe80::/10永远存在,不代表你能用它通信——它不自动参与路由,跨子网必须配全局单播地址(如2001:db8::/32)或 ULA(fd00::/8)
真正麻烦的从来不是“怎么加一行配置”,而是哪一层服务在默默覆盖你的设置、哪个防火墙规则在静默丢包、哪个云平台限制了 DHCPv6 响应时间——建议每次修改后,按顺序跑一遍 lsmod → sysctl → ip -6 addr → ip -6 route → ping6 -c2 fe80::1%eth0(带 link-local scope),再试公网地址。


















