【VPS IPv6 部署与实战 02】VPS 开启 IPv6 全指南:什么是 IPv6、双栈配置与常见坑
2026-08-15 · DevCraft Studio
手把手教你确认 VPS 是否已有 IPv6、在 Ubuntu/Debian/CentOS 配置双栈、让 Nginx 监听 IPv6、放行 ICMPv6 防火墙,并厘清 Cloudflare 橙云"伪 IPv6"不等于源站真配好这一常见误会。
专题连载:VPS IPv6 部署与实战
本文是该系列第 2 篇。阅读该系列其他文章:
延伸阅读
更多相关攻略推荐:【VPS 硬件选型指南 (CPU 篇) 04】AMD EPYC 还是、【发行版选型 07】Arch Linux 深度科普:滚动发布、pac、【VPS 进阶玩法精选 014】ARM 架构 VPS 值不值得上?A、【对象存储 01】对象存储怎么选:Backblaze B2 vs C、【TCP优化 01】美国 VPS 跑不快?多半是没开 BBR,一个命。
一、IPv6 到底是什么,为什么你现在就该关心
先说结论:IPv6 不是什么"高级玩法",而是迟早要补的一课。它的地址长度是 128 位,而我们现在还在大量使用的 IPv4 只有 32 位。位数上的差距带来的直接结果就是可分配地址数量天差地别:IPv4 总共大约只有 43 亿个可用地址,而 IPv6 的可寻址数量约为 2 的 128 次方,也就是大约 3.4 乘以 10 的 38 次方。用一个常被引用的比喻来说,IPv4 那 43 亿地址就像一本老式电话簿,早就被分配完了;而 IPv6 的地址空间大到"给地球上每一粒沙子都发一个门牌号还有富余"。
地址的写法也不一样。IPv4 是点分十进制,比如 192.0.2.1;IPv6 是冒号分隔的十六进制,比如 2001:db8::/64 这种文档示例前缀,或者 fe80:: 开头的链路本地地址。这里要特别留意:fe80:: 是链路本地地址,只在本地链路有效,看到它并不代表你的机器已经配好了公网 IPv6,很多人就是被这个假象骗了。
为什么现在就该关心?第一,IPv4 地址枯竭是既成事实。各大区域互联网注册局(RIR)多年以前就已经在从保留池里往外抠 IPv4,新增一个公网 IPv4 地址往往要真金白银的成本;而 IPv6 近乎免费,绝大多数厂商会直接给你一整个 /64(也就是 2 的 64 次方个地址,远大于一个人实际会用到的数量)。拿到 IPv6 不是拿到"一个门牌号",而是拿到一整个"小区",随便用。
第二,流量占比已经不低。有评测称 2025 年全球超过 40% 的网络流量是经 IPv6 传输的。在移动网络里尤其明显:美国 T-Mobile、Verizon、AT&T 的移动网都以 IPv6 为主,如果你的服务器只有 IPv4,这些用户访问你时得经过 NAT64/DNS64 转换,会额外增加一点延迟。第三,Google 的爬虫支持 IPv6,源站有 v6 时它会优先走 v6,这对可被爬取的站点是个实打实的小优势。
第三,关于"双栈(Dual Stack)"这个术语先说清楚:它指的是同一块网卡同时拥有 IPv4 和 IPv6 地址,两种协议栈都能访问,你不用在协议上做二选一的妥协。对绝大多数站长和服务端来说,双栈是当前最稳妥的方案。
二、先确认:你的 VPS 到底有没有 IPv6
动手改配置之前,先诊断。很多"我以为没 IPv6"其实是已经有了只是没用起来,也有不少"我以为有 IPv6"其实是厂商面板里挂着、系统里却没真正生效。下面三步走一遍。
第一步,看系统里到底有没有地址。执行 ip -6 addr show 看网卡上绑了哪些 v6 地址;执行 ip -6 route show 看默认路由。如果你只看到 fe80:: 开头的链路本地地址,那基本等于"没配好公网 v6"——链路本地地址出不了本机所在的网段。真正可用的标志是看到一段 2xxx: 或 3xxx: 开头的全球单播地址,以及一个 ::/0 的默认路由指向某个网关。
第二步,测出站连通性。可以 ping6 -c 4 2001:4860:4860::8888(这是 Google 的公共 IPv6 DNS 地址),能通说明你的机器能主动连上 v6 网络;再用 curl -6 https://ifconfig.co 看返回的到底是不是一个公网 v6 地址。curl -4 强制走 IPv4,curl -6 强制走 IPv6,ping -4 和 ping -6 同理,这几个开关在后面排查时非常有用。
第三步,在线自测。打开 test-ipv6.com 这类网站,它会从浏览器侧测你当前网络对 IPv6 的支持程度,给你一个 0 到 10 的评分。注意这个测的是"你访问者的网络",不是你的服务器;但如果你是用这台 VPS 本身开浏览器测,那就另当别论。对服务器侧,更可靠的做法还是上面两步的命令行自检。
三、主流 VPS 的 IPv6 支持对照(不踩"以为不支持"的坑)
一个常见误区是"便宜 VPS 都不给 IPv6"。实际情况是,主流厂商大多已经双栈,只是配置方式各有不同。下面按厂商捋一遍,方便你对照自己手里的机器。
Hetzner Cloud:新建服务器默认就带一个 IPv6 Primary IP,除非你在创建时显式加了不带 IPv6 的参数。它会分配一个免费的 /64 IPv6 网络,系统里通常已经自动配好,取其中第一个地址即可。不过要注意,Hetzner 的私有网络(Private Networks)是 IPv4-only 的,所以双栈部署时常见的组合是"公网走 v6、私网走 v4"。
Contabo:每台服务器都会给一个完整的 /64 IPv6 网络。在 VPS/VDS 上 IPv6 是预配但需要在客户面板里激活,激活后可能需要重启;Windows 系统还要改注册表把 DisabledComponents 设为 0 再重启。它的网关统一是 fe80::1,前缀是 /64。专用服务器(Dedicated)上的 IPv6 默认就已经激活,省事一些。
DigitalOcean、Vultr、Linode、Kamatera 这类标准套餐,大多默认就是双栈(IPv4 + IPv6),控制台里能看到,操作系统模板通常也已经把地址写进去了。你大概率不需要自己手动配,只要确认它确实生效就行。
还有一种特殊形态叫"纯 IPv6-only VPS"——没有公网 IPv4,只有 v6。它更便宜,适合做学习机、后端、代理出口;但代价是:凡是只支持 IPv4 的接口或外部服务,它直接调就会失败,必须借助 NAT64/DNS64 或者 Cloudflare 这类代理来"翻译"。所以如果你要跑的程序依赖一堆只认 IPv4 的第三方接口,纯 v6 机器会让你踩不少坑。
四、不同系统开启双栈(照你机器挑)
如果系统里确实没有可用的 v6 地址,先别急着改配置文件,先确认内核没把它关掉。执行 cat /proc/sys/net/ipv6/conf/all/disable_ipv6,返回 0 表示已启用,返回 1 表示被禁用了。被禁用时,去 /etc/sysctl.conf 里设置 net.ipv6.conf.all.disable_ipv6=0,然后执行 sysctl -p 让配置生效。
Ubuntu 20.04 / 22.04 / 24.04 用 netplan 管理网络。配置通常在 /etc/netplan/50-cloud-init.yaml 这类文件里。你要做的是在对应网卡下加上 IPv6 的地址、网关(::/0)以及 IPv6 的 DNS。改完先执行 netplan try,它会给你一个倒计时让你确认没把自己锁在门外;确认网络还通就 netplan apply 正式生效。这一步的 try 机制很重要,远程改网络配置最怕把自己踢下线。
Debian 系如果用的是传统 ifupdown,就改 /etc/network/interfaces,在网卡段落里加上 inet6 的静态配置(地址、网关、dns-nameservers),然后 systemctl restart networking 重启网络服务。CentOS / Rocky / Alma 这类用 NetworkManager 的发行版,推荐用 nmcli con mod 那条命令把连接的 ipv6.method 设为 manual,再填地址和网关,最后重启连接。
无论哪种系统,配置 IPv6 的要点都一样:地址 + 网关(::/0 表示默认路由)+ IPv6 DNS,三者缺一不可。只配了地址没配网关,机器自己有 v6 但出不去;配了网关没配 DNS,解析会失败。配完回到第二节那套命令再验证一遍,确认 ping6 和 curl -6 都正常,再往下走。
五、让你的网站/服务真的监听 IPv6
这是最容易"以为配好了其实没好"的一步。系统有了 v6 地址,不代表你的网站就在 v6 上对外服务了。很多人的 Nginx 默认只监听 IPv4,于是从外面用 IPv6 访问就直接连不上。
Nginx 里要让它同时监听两套协议栈,需要显式写出两行:listen 80; 和 listen [::]:80;,HTTPS 同理写 listen [::]:443 ssl;。注意 IPv6 的监听地址要用中括号包起来,这是语法要求。改完执行 nginx -t 检查配置语法,没问题再 reload 让新配置生效。
如果你跑的是自己写的服务,比如 Node 或 Go,常见坑是只绑定了 0.0.0.0(仅 IPv4)。想让它在双栈上都接客,要把监听地址改成 ::(即全部 IPv6 含兼容 IPv4 的映射),或者分别绑一次 0.0.0.0 和 ::。改完同样验证:用 curl -6 -I 你的域名,以及 curl -I http://[你的v6地址]/ 直接拿地址测,两种都得返回正常的 HTTP 头才算真通。
如果只在 IPv6 访问时出现 502,基本就是 Nginx 或背后的后端服务没真正监听 :: 导致的——请求能进到前端,但前端转给后端时后端在 v6 上没接住。这个现象排障时很有特征,记住它。
六、DNS:别忘了 AAAA 记录(以及 Cloudflare 的"伪 IPv6"误会)
系统配好、服务也监听了,最后一步是 DNS。IPv4 对应 A 记录,IPv6 对应 AAAA 记录(四个 A,因为 v6 地址是 v4 的四倍长)。你可以用 nslookup -type=AAAA 你的域名来查对应的 v6 地址是否生效。
这里有一个极其常见的误会,必须单独拎出来说清楚:很多人兴冲冲地说"我的站点已经有 IPv6 了",其实是被 Cloudflare 的橙云(orange-cloud)代理"骗"了。当你开启橙云代理后,Cloudflare 的边缘节点是双栈的,它会替你纯 IPv4 的源站"撑门面",让访客看到的前端是 IPv6 可达的。但请注意:这不代表你的 VPS 源站真的配好了 IPv6。
换句话说,Cloudflare 的 IPv6 段(比如 2400:cb00::/32)是它边缘的地址,不是你源站的地址。代理只对 HTTP/HTTPS 生效,它不能用来代理 SSH 这类非 HTTP 流量。想验证你的源站到底是不是真有 v6,办法是"直连源站"测:临时关掉代理,或者直接用 curl -6 去连你的源站 IP,一看便知。这个小实验很实用,能一眼戳破"伪 IPv6"的假象。
七、防火墙:IPv6 端口没放行,比你想象得常见
地址配了、服务监听了、DNS 也加了,结果外面还是不通——十有八九是防火墙只放行了 IPv4 没放行 IPv6。用 UFW 的话,它默认是同时管 v4 和 v6 的,但前提是 /etc/default/ufw 里 IPV6=yes 这一项确实是 yes,很多人改过配置后忘了这一条。
如果你直接用 ip6tables,基本思路是四步:先放行已建立的和相关的连接,避免把自己正在用的连接掐断;再放行必要的服务端口,比如 22、80、443;最后把默认策略设为 DROP。中间还有一步非常关键却常被忽略:IPv6 必须放行 ICMPv6。具体就是在 ip6tables 里写一条 -p ipv6-icmp -j ACCEPT。
为什么 ICMPv6 不能像 IPv4 那样随手挡掉?在 IPv6 世界里,ICMPv6 承担了邻居发现(相当于 v6 版的 ARP)和路径 MTU 发现等基础功能。如果你把 ipv6-icmp 也 DROP 了,表现会非常诡异:有时候通、有时候不通,大包传不出去,MTU 协商失败,排障时一头雾水。最后才发现问题出在 ICMPv6 被拦。所以请务必放行它,这是 IPv6 防火墙和 IPv4 防火墙一个很重要的区别。
八、常见坑与排查速查(按命中率排序)
下面把最容易踩的坑按实际命中率从高到低排一遍,方便你对着查。
第一,出站通、入站不通。表现是你机器能 ping 出去、curl 得动外网,但外面访问不进来。根因几乎都是安全组或防火墙只开了 IPv4 的端口,v6 那一侧没放行。回到第七节把 v6 的 22/80/443 和 ICMPv6 补上。
第二,配了 AAAA 记录之后反而变慢。部分网络环境下 IPv6 路径会绕远路,导致首包延迟变高。排查方法很简单:对比 curl -4 你的域名 和 curl -6 你的域名 各自的耗时。如果你确认 v6 链路不稳,可以暂时先不加 AAAA 记录,或者把域名交给 Cloudflare 代管、由它的边缘去处理协议选择,别硬扛。
第三,只在 IPv6 访问时 502。前面第五节讲过,这是 Nginx 或后端没监听 :: 的典型症状。检查监听配置,确认前端和后端在 v6 上都对得接住。
第四,应用只绑了 IPv4。你自己写的程序或者某些老软件默认只绑 0.0.0.0,v6 流量根本进不去。把监听地址改成 :: 或同时绑两套协议栈即可。
第五,ICMPv6 被拦导致的"时通时不通"。同样回到防火墙,确认 ipv6-icmp 是 ACCEPT 状态。
#IPv6 #VPS #双栈 #Cloudflare #防火墙
💡 延伸阅读:关于架构与基础设施的更多深潜指南,请前往 VPS 主题导读中心 (Hub) 获取全盘策略。