让网站支持 IPv6:从 DNS 到服务器的完整清单
给网站开 IPv6,本质是打通一条端到端的链路,而不是打开一个开关。这篇按访问路径的顺序,给出四层清单与逐项判据,可以直接当作上线前的检查表使用。
一、访问路径全景
用户 ──① DNS 解析(AAAA)──▶ ② 网络可达(公网 v6 地址/云安全组)
──③ 服务监听(nginx/后端)──▶ ④ 安全策略(防火墙/限流)
◀──────── 页面与静态资源全部可 v6 加载 ────────
任何一层缺失,v6 访客要么完全连不上,要么体验变差。
二、第一层:DNS
| 项目 | 要求 |
|---|---|
| AAAA 记录 | 为主域名添加 AAAA,与 A 记录并存 |
| 子域名 | www、api、静态资源域名都要逐一确认 |
| TTL | 切换前建议先调低 TTL,便于回滚 |
| 泛解析 | 泛解析(*.example.com)不覆盖裸域,裸域需单独配置 |
| 反向解析 | 如需邮件等服务,配置 ip6.arpa 下的 PTR |
判据:dig AAAA 你的域名 +short 返回预期地址。
三、第二层:网络可达
| 场景 | 检查项 |
|---|---|
| 阿里云 ECS | VPC 是否开通 IPv6、交换机是否有 v6 网段、实例是否分配 v6 地址 |
| 云安全组 | 是否放行了 v6 入站(很多默认规则只写了 v4 网段) |
| 负载均衡 / CLB | 实例是否支持 v6 接入,监听器是否配置了 v6 |
| 裸金属 / 自建机房 | 上游是否分配 v6 段并完成路由通告 |
| CDN | 是否支持 v6 接入;若仅 v4 回源,需明确回源策略 |
判据:从外部的 v6 网络能 ping 通或能建立 TCP 连接。
常见疏漏:只改了一条规则,忽略了"安全组按网段配置"的特性,导致 v6 侧全通或全不通。建议把 v6 规则与 v4 规则成对核对。
四、第三层:服务端监听
这里是实际改动代码/配置的地方。
nginx
server {
listen 443 ssl; # IPv4
listen [::]:443 ssl; # IPv6
server_name example.com;
# ……其余配置完全一致
}
三个必须知道的细节:
listen 443 ssl;只监听 IPv4,不会自动覆盖 v6,必须显式写[::]。listen [::]:443默认ipv6only=on,因此不会顺带监听 IPv4。想让一条监听同时服务两栈,需写成listen [::]:443 ssl ipv6only=off;(并非所有场景都推荐)。server_name与证书都不需要修改。域名与证书和 IP 版本无关,v6 与 v4 共用同一份配置。
其他常见服务
| 服务 | 要点 |
|---|---|
| Go | net.Listen("tcp", ":8080") 通常同时监听两栈;若需分开可用 tcp4 / tcp6 |
| Apache | Listen [::]:443 或 Listen 443 配合 Listen [::]:443 |
| Node.js | server.listen(port) 默认监听 ::,需注意可能影响仅 v4 的客户端 |
| 数据库/中间件 | 若需 v6 访问,同样确认监听地址与访问控制 |
判据:在服务器上用 ss -lntp(或 netstat -lntp)确认端口存在 [::]:443 监听项。
五、第四层:安全与运营
这一层最容易"配完就忘",但风险最高。
| 项目 | 要点 |
|---|---|
| 主机防火墙 | v6 规则与 v4 对等;不要只放行 v4 而默认放开 v6 |
| 频率限制 | 按 /64 前缀归并计数,不可按单个地址计数 |
| 黑名单/封禁 | 同样按 /64 粒度,否则前缀内换地址即可绕过 |
| 访问日志 | 字段长度、日志格式、统计口径都能容纳 v6 地址 |
| 审计与告警 | 来源判定同时支持 v6 的"可信代理"配置 |
| 第三方组件 | WAF、统计、验证码等是否支持 v6 |
为什么频率限制必须按
/64? 家用宽带一般被分配一个/64甚至更长的前缀,前缀内可使用的地址数量是 2⁶⁴。按单地址计数意味着攻击者可以无限更换源地址绕过限流。正确做法是把同一个/64视为一个"来源"统一计数——这也是本站后台登录限流所采用的策略(在 nginx 层以/64生成限流键)。
六、验证与灰度
# 1. 从服务器本地验证两栈监听
ss -lntp | grep 443
# 2. 从有 v6 出口的机器验证可达
curl -6 -I https://你的域名
curl -4 -I https://你的域名
# 3. 用在线工具做外部视角验证
# 本站「网站 IPv6 检测」页 或 dig/web 服务
# 4. 检查页面内所有资源的域名是否都有 AAAA
for h in www static api; do dig AAAA $h.你的域名 +short; done
推荐上线方式:先发布 AAAA,观察一小段时间的错误率与延迟,再逐步放量。若出现异常,移除 AAAA 即可在 TTL 到期后回滚——这是 IPv6 上线最方便的一点:回滚成本极低。
七、几个中国环境的注意事项
- ICP 备案与 IP 版本无关。备案针对主体与域名,开通 IPv6 不需要额外备案;但境外或中国香港节点在合规上有不同要求,需按实际部署地判断。
- 部分云产品与 CDN 的区域尚不支持 v6,采购前先确认。
- 中国移动/电信/联通的 v6 覆盖与路径质量存在差异,有条件时用多个移动网络各测一次。
- IPv6 与"提速"无关,不要把它当作性能优化的手段。
八、上线检查表
| # | 检查项 | 完成 |
|---|---|---|
| 1 | 主域名与所有子域名均有 AAAA | ☐ |
| 2 | 云安全组/防火墙 v6 规则与 v4 对等 | ☐ |
| 3 | ss -lntp 可见 [::] 监听 |
☐ |
| 4 | curl -6 能成功返回内容 |
☐ |
| 5 | 页面内所有静态资源域名均可 v6 加载 | ☐ |
| 6 | 限流与封禁按 /64 归并 |
☐ |
| 7 | 日志与统计能正确记录 v6 来源 | ☐ |
| 8 | 明确回滚方案(移除 AAAA) | ☐ |
小结
- 四层缺一不可:DNS → 网络可达 → 服务监听 → 安全策略。
- nginx 必须显式写
listen [::]:443,listen 443不覆盖 v6。 - 限流与封禁按
/64归并,否则形同虚设。 - 上线后先观察再放量,回滚只需移除 AAAA。
下一篇:《如何正确检测 IPv6:方法、工具与结论边界》。