【VPS IPv6 部署与实战 01】IPv6 在 VPS 上的真实部署与排错:从地址分配到 nginx 双栈监听、AAAA 解析与 Cloudflare 实战

手把手在 VPS 上部署 IPv6:用 ip -6 查地址、sysctl 开转发、配 NDP 与默认路由、nginx 监听 [::]:80 双栈、Cloudflare 双栈回源,以及 mtr/traceroute 不通排查清单。附 Hetzner/Vultr/RackNerd/CloudCone 真实 IPv6 现状。

延伸阅读

更多相关攻略推荐:从 Git Push 到秒级上线:CI/CD 流水线与"无中断"发布2026 返校季/暑假 VPS 促销:学生党低价上车【VPS 硬件选型指南 (CPU 篇) 03】VPS 性价比怎么算?【购买指南 01】新手如何选购第一台 VPS:配置/线路/支付/退款【内存技术 01】DDR4 还是 DDR5?2026 年内存涨价背景

为什么现在就该在 VPS 上搞懂 IPv6

IPv4 地址早已枯竭,ISP 用 CGNAT 把成百上千用户塞进一个公网 IP,结果就是 inbound 端口映射几乎不可能,家庭宽带也很难再拿到干净的 IPv4。IPv6 从设计上就不需要 NAT,每台机器都能拿到全球可路由的公网地址,腾讯/阿里等国内运营商也早已强制要求网站支持 IPv6。到 2026 年,Google 统计其全球流量里走 IPv6 的比例已经突破 45%。换句话说,VPS 上把 IPv6 跑通,不只是「先进」,而是「该做」。

但 IPv6 不是点了开关就完事。地址怎么分配、路由和 NDP(邻居发现)怎么配、nginx 到底是监听 IPv4 还是 IPv6、AAAA 解析怎么做、Cloudflare 双栈怎么回源、不通了用 mtr 还是 traceroute 排查——这些环节任何一个出错,网站就「IPv4 能开、IPv6 打不开」,或者反过来。下面用真实命令一步一步来。

先分清三个概念:双栈、IPv6-only、NAT64

  • 双栈(Dual Stack):机器同时有 IPv4 和 IPv6 地址。DNS 同时返回 A 和 AAAA 记录,客户端用 Happy Eyeballs(RFC 8305)两个协议竞速,谁先通走谁。这是兼容性最好、最省心的方案,新手无特殊理由直接选它。
  • IPv6-only:服务器只有 IPv6,没有独立公网 IPv4。价格更低,适合学习、内网后端、Docker/K8s 内部网络。但纯 IPv6 服务器对外提供 Web 服务时,很多只走 IPv4 的家庭宽带/手机用户会打不开——此时需要 Cloudflare 当协议转换网桥。
  • NAT64:让纯 IPv6 客户端能访问 IPv4-only 资源。原理是 DNS64 把 AAAA 查询合成为 NAT64 前缀下的地址,流量经 NAT64 网关翻译成 IPv4。典型应用是 T-Mobile 这类「IPv6-only + NAT64」的移动网络。它与你在 VPS 上对外提供双栈服务是不同方向的问题。

四家厂商的 IPv6 真实现状(2026 数据)

动手前先知道你的厂商怎么给地址,避免白忙一场。

  • Hetzner:IPv6 默认开启,每台机器直接给一个 /64 前缀(你有 2 的 64 次方个地址)。套餐 Starter 月付 5.60 美元(1 vCPU / 1GB / 25GB NVMe / 1Gbps / 20TB 流量),Essential 10.08 美元(2 vCPU / 4GB / 80GB),Business 20.16 美元(4 vCPU / 8GB / 160GB / 10Gbps)。注意:Hetzner 的 Private Network 是 IPv4-only,双栈部署通常是「公网 IPv6 + 私网 IPv4」组合。
  • Vultr:30+ 城市节点都支持 IPv6,但默认不分配——必须建机时勾选 Enable IPv6,或者用 API 的 enable_ipv6=true。新机由 cloud-init 自动配置;已有机器加 IPv6 后要在控制台重启(SSH 里 reboot 不会激活新网卡)。Debian 动态配置就是一行 iface ens3 inet6 auto
  • RackNerd:KVM 架构,1Gbps 共享带宽,多数促销套餐自带 1 个 IPv4 + 1 个 IPv6。2026 新年促销 1 核 1G / 24G SSD / 2T 月流量年付 11.29 美元,2 核 1G / 40G / 3.5T 年付 18.29 美元,4 核 6G / 140G / 12T 年付 59.99 美元,支持支付宝。但 IPv6 需工单申请,且仅洛杉矶 DC-02 / DC-03、犹他、多伦多、斯特拉斯堡、都柏林等节点可分配;托管在 ColoCrossing 的多数节点不提供 IPv6。
  • CloudCone:洛杉矶 KVM,常规套餐默认 1 个 IPv4 + 3 个 IPv6,下单时勾选 Enable IPv6 即可。SC2 Starter 月付 5.20 美元(1 vCPU / 1GB / 20GB RAID-10 SSD / 3TB),九周年促销 1 核 1G / 25G / 4T 年付约 18.28 美元。另有纯 IPv6 VPS 年付 14.99 美元起。测试 IP:148.135.114.94(IPv4)/ 2607:f130:0:ef::4(IPv6)。

第一步:在系统里拿到并确认 IPv6 地址

机器开机后,先确认内核已经拿到地址、且没有被禁用。现代发行版默认 IPv6 是开的,但某些镜像或老脚本会关掉。

# 查看所有网卡的 IPv6 地址
ip -6 addr show

# 确认 IPv6 栈没被整体禁用(0 表示启用)
cat /proc/sys/net/ipv6/conf/all/disable_ipv6

# 临时补一个地址(持久化要改发行版的网络配置,下面有 Debian 例子)
ip -6 addr add 2001:db8:0:3df1::1/64 dev eth0

# 持久化(Debian / Ubuntu,netplan 之前用 /etc/network/interfaces)
# 动态 SLAAC:
iface eth0 inet6 auto
# 静态:
iface eth0 inet6 static
    address 2001:db8:0:3df1::1
    netmask 64

如果 ip -6 addr show 看不到公网地址(以 2001:/2400:/2a00: 开头,而非 fe80 链路本地),说明厂商侧没分配,或你没勾选 Enable IPv6。先去厂商控制台确认,再回头查系统。

第二步:配置默认路由与 NDP(邻居发现)

IPv6 没有 ARP,取而代之的是 NDP(Neighbor Discovery Protocol),基于 ICMPv6。它负责地址解析(相当于 ARP)、路由器发现、重复地址检测。默认路由通常指向链路本地网关 fe80::1。

# 看路由表,确认有 ::/0 默认路由
ip -6 route show

# 手动补默认路由(仅示例,持久化写进网络配置)
ip -6 route replace default via fe80::1 dev eth0

# 查看 NDP 邻居表(类似 IPv4 的 arp -n)
ip -6 neigh show

# 触发路由器发现(SLAAC 自动配地址需要 RA)
rdisc6 eth0

如果你的机器要当 VPN / 网关做转发,sysctl 里 accept_ra 的默认值会阻止 IPv6 工作,必须改:

# 开启 IPv6 转发
sysctl -w net.ipv6.conf.all.forwarding=1

# 做转发时(如 WireGuard / 软路由),让 RA 仍被接受
sysctl -w net.ipv6.conf.all.accept_ra=2
sysctl -w net.ipv6.conf.eth0.accept_ra=2

# 写进 /etc/sysctl.conf 持久化
echo 'net.ipv6.conf.all.forwarding=1' >> /etc/sysctl.conf
echo 'net.ipv6.conf.all.accept_ra=2' >> /etc/sysctl.conf
sysctl -p

注意:IPv6 的 ICMPv6 不是「能禁就禁」的可选协议,NDP 和 PMTU 发现都依赖它。防火墙千万别把 ipv6-icmp 全挡了,否则地址解析和路由发现直接失效。

第三步:让 nginx 监听 IPv6 / 双栈

nginx 默认很可能只监听 IPv4。要让它同时吃 IPv4 和 IPv6,关键是两条 listen 指令分开写,并用 ipv6only=on 避免套接字冲突。

# /etc/nginx/sites-available/example.com
server {
    # IPv4
    listen 80;
    # IPv6,ipv6only=on 保证 [::]:80 只接 IPv6,不和上面冲突
    listen [::]:80 ipv6only=on;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl ipv6only=on;
    http2 on;
    server_name example.com;
    ssl_certificate     /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
}

几个易错点:IPv6 地址必须用方括号包住,写成 listen ::80;(没方括号)会报语法错误;ipv6only=on 是套接字级别的,只需要第一个 server block 设,其余共享同一 [::]:80 的会继承;改完先 nginx -tsystemctl reload nginx

# 验证 nginx 确实在两个协议都监听了
ss -tlnp | grep nginx
# 应看到 0.0.0.0:80 与 [::]:80 两行

# 分别用 IPv4 / IPv6 访问验证
curl -4 http://example.com
curl -6 http://example.com

第四步:AAAA 解析与 Cloudflare 双栈回源

系统通了还不够,DNS 得告诉世界「这个域名也有 IPv6」,也就是加一条 AAAA 记录

# 在自己权威 DNS 或 Cloudflare 加:
# 类型 AAAA,名称 example.com,值 2001:db8:0:3df1::1

# 验证解析
dig AAAA example.com
# 反向解析(PTR)也建议设,Hetzner 用:
# hcloud server set-rdns --ip 2001:db8:0:3df1::1 --hostname example.com my-server
dig -x 2001:db8:0:3df1::1

Cloudflare 双栈是 VPS 圈事实上的标准解法。它的作用分两种:

  • 你的源站是双栈:Cloudflare 边缘双栈,访客走 IPv6 就端到端走 IPv6,走 IPv4 就端到端走 IPv4。
  • 你的源站是 IPv6-only:把 AAAA 记录指向源站 IPv6,并点亮橙色云(开启代理)。IPv4-only 访客查到的是 Cloudflare 的 IPv4 边缘节点,CF 通过自己的双栈骨干网用 IPv6 回源取数据再转回 IPv4 给用户——纯 IPv6 VPS 就这样被「翻译」成全网可访问,且免费、还附赠 WAF 和 DDoS 防护。

配法:Cloudflare DNS 里加 AAAA 记录填源站 IPv6,Proxy 状态设为 Proxied(橙色云)。无需改源站任何代码。如果只想让 CF 自动给站点开启 IPv6,在 SSL/TLS → Edge Certificates 里把 Automatic HTTPS Rewrites 与 IPv6 Compatibility 打开即可。

常见不通的排查步骤(mtr / traceroute / ping6)

「IPv6 配了但打不开」按下面顺序查,90% 的问题都在这几步里:

  1. 本机地址有吗? ip -6 addr show 看有没有非 fe80 的公网地址。只有 fe80 说明厂商没给或没勾选。
  2. 默认路由在吗? ip -6 route show 看有没有 ::/0。没有就用 ip -6 route replace default via fe80::1 dev eth0 补。
  3. 出得去吗? ping -6 -c 3 ipv6.google.comping6 -c 3 2600::。不通说明路由 / 网关 / 厂商路由有问题。
  4. 防火墙挡了吗? ip6tables -L INPUT -n -v 看是否丢了 ICMPv6 或把 80/443 拒了。最小放行集:
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
ip6tables -A OUTPUT -p ipv6-icmp -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
# 最后再设默认策略
ip6tables -P INPUT DROP
  1. 到目标路径断在哪?mtr -6 -c 10 example.comtraceroute -6 example.com 看丢包和中断跳。中间某跳起全星号,通常是该运营商没开 IPv6 或对 ICMPv6 限速,未必真不通,换用 curl 实测端口更准。
  2. nginx 真监听了吗? ss -tlnp | grep nginx 确认有 [::]:80。没有就回看 listen 配置和 nginx -t
  3. DNS 解析对吗? dig AAAA example.com 应返回你的 IPv6;用外部 IPv6 主机 curl -6 http://[2001:db8:0:3df1::1]/ 直连 IP 验证源站本身通,再查域名。
  4. Cloudflare 模式选错? 纯 IPv6 源站必须 AAAA + 橙色云;若只设了 A 记录(IPv4)但源站无 IPv4,IPv4 访客会 522/523。确认源站协议与 DNS 记录匹配。

IPv6 安全的几个运维要点

IPv6 没有 NAT 做天然屏蔽,每个地址都直接暴露在公网,所以安全习惯要跟上。第一,不要因为地址多就裸奔:虽然 /64 里地址海量,但被扫描到的风险依然存在,ssh 该禁密码就禁,该限来源就限。第二,MTU 与分片:IPv6 路由器不替你分片,PMTU 发现依赖 ICMPv6 的 Packet Too Big 消息,所以前面强调的「别禁 ipv6-icmp」在这里也成立,禁了会导致大包应用(如 HTTPS 握手、文件上传)卡死。第三,临时地址(Privacy Extensions):出站连接建议开 net.ipv6.conf.all.use_tempaddr=2,避免被用固定地址追踪;入站监听服务则用稳定地址并配 PTR。第四,Cloudflare 代理开启后,源站 IPv6 只暴露给 CF 边缘,真实 IP 被挡在后面,等于免费加了一层防护,这比自己裸开 80/443 安全得多。

💡 延伸阅读:关于架构与基础设施的更多深潜指南,请前往 VPS 主题导读中心 (Hub) 获取全盘策略。