遇到服务器“不支持IPv6”的提示,先别急着敲配置命令。很多时候,问题并不出在地址配置本身,而是内核模块没加载、协议栈被全局禁用,或者云平台压根没给你分配IPv6子网。所以,动手前得先搞清楚,到底卡在了哪个环节。

用 ip 命令临时添加一个IPv6地址很简单,但如果底层支持没打开,一切都是徒劳。下面我们就从根源到表象,把“不支持”的伪装一层层剥开。
检查 IPv6 协议栈是否实际启用
很多所谓的“不支持”,其实是系统层面被悄悄关掉了。第一个检查点,就是执行这条命令:
sysctl net.ipv6.conf.all.disable_ipv6
如果返回值是 0,恭喜,协议栈是启用的。如果返回 1,那就找到了症结——IPv6被强制禁用了。
- 临时启用:运行
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0和sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0,立刻生效。 - 永久启用:在
/etc/sysctl.conf文件末尾追加两行:net.ipv6.conf.all.disable_ipv6 = 0和net.ipv6.conf.default.disable_ipv6 = 0,然后执行sudo sysctl --system让配置永久化。 - 别忘了内核模块:光开开关还不够,得确保内核加载了IPv6模块。运行
lsmod | grep ipv6,如果没有任何输出,说明模块没加载。这时需要sudo modprobe ipv6手动加载,并记得把它加入/etc/modules文件,确保下次重启也能自动加载。
ip -6 addr add 添加地址前必须确认接口状态
直接运行 ip -6 addr add 2001:db8::100/64 dev eth0 却报错“Cannot assign requested address”?别慌,这通常是因为网络接口处于“down”状态,或者这个接口本身的IPv6功能没打开。
- 先找准接口名:用
ip -br link show | grep -v "lo"查看。注意,现在很多新系统默认接口名可能是ens33、enp0s3这类,不一定是传统的eth0。 - 确保接口已启动:执行
sudo ip link set ens33 up(请替换为你的真实接口名)。 - 确认该接口允许IPv6:检查
cat /proc/sys/net/ipv6/conf/ens33/disable_ipv6,结果必须是0。如果是1,需要单独为这个接口启用:sudo sysctl -w net.ipv6.conf.ens33.disable_ipv6=0。 - 添加后验证:配置完地址后,运行
ip -6 addr show dev ens33查看。如果看到scope global标识的地址,才算配置成功。如果只有scope link(本地链路地址),那是无法与外界通信的。
永久配置要匹配发行版网络管理器
想让配置重启后依然有效,就得修改系统配置文件。但这里有个大坑:配置文件必须和你系统实际使用的网络管理服务对上号,否则就是白忙活。
- Debian/Ubuntu(使用Netplan):配置文件在
/etc/netplan/*.yaml。在对应接口的配置下添加类似内容:
然后执行addresses: [2001:db8::100/64] gateway6: 2001:db8::1 nameservers: addresses: [2001:4860:4860::8888]sudo netplan apply生效。千万别去改老旧的/etc/network/interfaces,那在Netplan系统上已经没用了。 - RHEL/CentOS/Rocky(传统network-scripts):编辑对应网卡的配置文件,如
/etc/sysconfig/network-scripts/ifcfg-ens33,添加或修改:
然后重启网络服务:IPV6INIT=yes IPV6ADDR=2001:db8::100/64 IPV6_DEFAULTGW=2001:db8::1sudo systemctl restart network。注意,如果你的系统默认使用NetworkManager,直接改ifcfg文件可能会被覆盖。 - Cloud-init环境(如AWS、阿里云):这类环境可能通过DHCPv6自动获取地址,但有时会缺少默认网关。如果遇到这种情况,需要手动添加路由:
sudo ip -6 route add default via 2001:db8::1 dev ens33。为了永久生效,可以将这条命令写入/etc/network/if-up.d/目录下的脚本,或者在Netplan配置中使用routes字段定义。
云服务器配 IPv6 失败的三个隐藏前提
本地测试一切正常,但一到云服务器上IPv6就不通?这太常见了。问题往往出在云平台的基础设施层,而不是Linux系统本身的配置。
- 子网必须开启IPv6:这是最容易被忽略的一步。登录云服务商的VPC控制台,确认你服务器所在的子网已经分配了IPv6 CIDR地址段,并且“IPv6网关”已经正确关联。如果云平台这层没开,你在操作系统里配到天荒地老也没用。
- 安全组/网络ACL必须放行:云平台的安全组默认策略通常是拒绝所有IPv6流量的。你需要显式地添加入站和出站规则,协议类型选择
IPv6,端口范围根据需求填写ALL或指定端口。 - 弹性公网IPv6需额外绑定:在阿里云、腾讯云等场景下,“内网IPv6地址”和“公网IPv6地址”是两个概念。如果你需要服务器对外提供IPv6服务,必须在云控制台上为弹性网卡分配一个“弹性公网IPv6”地址,然后才能在操作系统内配置这个地址。只配置内网v6地址是无法从公网访问的。
说到底,配置IPv6时真正卡住你的,往往不是那行 ip -6 addr add 命令,而是 /proc/sys/net/ipv6/conf/all/disable_ipv6 这个内核参数的值、云控制台里那个忘记点开的“子网IPv6开关”,或者安全组里漏加的那条 IPv6 ALL 规则。下次再遇到“不支持”,不妨先按这个顺序排查一遍。
