Skip to content

IPv6 部署与迁移:双栈过渡技术实战

IPv6 部署拖了很多年,但现在已经是"不得不做"的问题——IPv4 地址池基本耗尽,运营商全面推 IPv6,监管也有要求。这篇文章不谈理论,直接说怎么部署、常见坑在哪、怎么排查。

部署路径:三条路怎么选

路径一:双栈过渡(首选)

IPv4 和 IPv6 同时运行,客户端根据 DNS 返回的记录选择协议。

客户端 ──┬── IPv4 ──→ 服务器(IPv4 地址)
         └── IPv6 ──→ 服务器(IPv6 地址)

优点:平滑过渡、兼容性好、排障简单 缺点:需要维护两套配置 适用:绝大多数场景

路径二:隧道转换(过渡方案)

在 IPv4 网络上封装 IPv6 流量,通过隧道传输。

# 6to4 隧道示例(已不推荐,仅说明原理)
# 客户端配置
ip tunnel add sixto4 mode 6to4 remote <6to4-relay> local <public-ipv4>
ip link set sixto4 up
ip addr add 2002:<ipv4-hex>::1/16 dev sixto4

# ISATAP 隧道(内网使用)
ip tunnel add isatap mode isatap local <ipv4-address> remote any
ip link set isatap up

优点:不需要改造现有 IPv4 网络 缺点:性能损耗、排障复杂、6to4 relay 不稳定 适用:临时过渡、特殊合规场景

路径三:纯 IPv6(终极目标)

完全停用 IPv4,只保留 IPv6。

优点:配置简单、无兼容性问题 缺点:兼容性好坏未知、过渡风险高 适用:新建网络、云原生环境

我的判断:99% 的场景走路径一(双栈)。路径二是应急方案,路径三是长期目标。

双栈部署实战

第一步:获取 IPv6 地址

# 检查当前 IPv6 配置
ip -6 addr show

# 常见 IPv6 地址格式
# SLAAC(无状态自动配置):fe80::1(链路本地)+ 全局单播
# DHCPv6(有状态):从 DHCPv6 服务器获取
# 静态配置:手动指定

# 查看运营商是否分配了 IPv6
curl -6 ifconfig.me
# 或
dig -6 TXT +short ip.opendns.com

第二步:服务器双栈配置

以 Nginx 为例:

# nginx.conf - 双栈配置
http {
    # IPv4 监听
    server {
        listen 80;
        listen [::]:80 ipv6only=on;
        server_name example.com;

        # IPv6 专用配置
        location / {
            proxy_pass http://backend;

            # 传递客户端真实 IP(IPv6 兼容)
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

# 或者分离配置(推荐)
# IPv4 server block
server {
    listen 443 ssl;
    server_name example.com;
    # ... SSL config ...
}

# IPv6 server block
server {
    listen 443 ssl ipv6only=on;
    server_name example.com;
    # ... SSL config (可能需要单独证书) ...
}

第三步:DNS AAAA 记录

# 添加 AAAA 记录(在 DNS 管理控制台操作)
# 记录类型:AAAA
# 主机:@ 或 www
# 价值:<your-ipv6-address>
# TTL:300(5 分钟,方便切换)

# 验证 AAAA 记录
dig -t AAAA example.com +short
# 期望输出:2001:db8::1

# 同时验证 A 记录还在
dig -t A example.com +short

第四步:防火墙双栈规则

# iptables 双栈规则(注意:iptables 只管理 IPv4)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# nftables 或 ip6tables 管理 IPv6
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT

# 或者用 nftables 统一管理
nft add table inet dual_stack
nft add chain inet dual_stack input { type filter hook input priority 0; }
nft add rule inet dual_stack input tcp dport { 80, 443 } accept

常见坑与排查

坑一:运营商 IPv6 不通

这是最常见的问题。光猫/路由器没有开启 IPv6,或者运营商没有分配 IPv6。

# 诊断步骤
# 1. 检查本地接口是否有 IPv6 地址
ip -6 addr show
# 期望:看到 fe80::(链路本地)和 2001:(全局单播)

# 2. 测试默认路由
ip -6 route show default
# 期望:看到 default via fe80::1 dev eth0

# 3. 测试到 DNS 服务器的 IPv6 连通性
ping6 -c 4 2001:4860:4860::8888
# Google IPv6 DNS

# 4. 测试到外部网站的 IPv6 连通性
ping6 -c 4 ipv6.test-ipv6.com

# 5. traceroute 看断在哪
traceroute6 -n ipv6.test-ipv6.com

常见原因: - 光猫桥接模式没开 IPv6 → 联系运营商开 IPv6 - 路由器 IPv6 功能没开 → 路由器后台开启 - 运营商机房没有 IPv6 路由 → 换运营商或等运营商升级

坑二:DNS 只返回 A 记录

客户端只拿到 IPv4 地址,不会尝试 IPv6 连接。

# 检查 DNS 解析
dig example.com ANY +short
# 期望看到 A 记录和 AAAA 记录都有

# 检查本地 DNS 缓存
sudo systemd-resolve --statistics  # systemd-resolved
dnscache.exe -query example.com    # Windows DNS cache

# 强制 DNS over HTTPS 测试(排除本地 DNS 问题)
dig -t AAAA [email protected] +short
dig -t AAAA [email protected] +short

坑三:防火墙只开了 IPv4

# 检查 IPv6 防火墙规则
ip6tables -L -n -v
# 或
nft list ruleset | grep -i ipv6

# 测试 IPv6 端口连通性
nc -6 -vz example.com 443
# 或
telnet6 example.com 443

# 如果 nc/telnet 不通,检查防火墙
# 常见错误:iptables 开了但 ip6tables 没开

坑四:应用只监听 IPv4

# 检查应用监听地址
ss -tlnp | grep :443
# IPv4 监听:0.0.0.0:443 或 *:443
# IPv6 监听:[::]:443 或 :::443

# 如果只有 IPv4 监听,修改应用配置
# Node.js 示例:
# server.listen(443, '::');  // 同时监听 IPv4 和 IPv6
# 或分开监听:
# server.listen(443, '0.0.0.0');  // IPv4
# server.listen(443, '::');       // IPv6

# Python 示例:
# socket.AF_INET6 支持 IPv4-mapped IPv6 地址

IPv6 安全注意事项

安全 1:阴影 IPv6

很多组织的防火墙只覆盖 IPv4,IPv6 流量直接穿透。

# 检测阴影 IPv6
# 从外部扫描 IPv6 开放端口
nmap6 -sV -p 80,443,22 <ipv6-address>

# 检查本地 IPv6 防火墙
ip6tables -L -n -v
# 期望:有明确的 ACCEPT/DROP 规则

# 如果没有 ip6tables 规则,立即添加
ip6tables -P INPUT DROP
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT

安全 2:IPv6 嗅探与欺骗

# 启用 RA Guard(路由器广告防护)
# 在交换机上配置
configure
interface Ethernet1
  ipv6 nd raguard enable
end

# 启用 DHCPv6 防护
ip dhcp guard enable

安全 3:IPv6 隐私扩展

# Linux 启用隐私扩展(临时 IPv6 地址)
sysctl -w net.ipv6.conf.all.use_tempaddr=2
sysctl -w net.ipv6.conf.default.use_tempaddr=2

# Windows 启用(注册表)
# HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
# RandomizeAddresses = 1

迁移检查清单

# 部署前检查
✅ IPv6 地址已分配
✅ DNS AAAA 记录已添加
✅ 服务器双栈配置完成
✅ 防火墙双栈规则已配置
✅ 应用支持 IPv6(测试通过)
✅ 监控告警覆盖 IPv6
✅ 应急预案包含 IPv6 场景

# 迁移后验证
✅ curl -6 https://example.com 成功
✅ dig -t AAAA example.com 有返回
✅ 主要用户群体 IPv6 连通性正常
✅ 性能测试无退化
✅ 安全扫描无阴影 IPv6

性能测试

# IPv4 vs IPv6 性能对比
# 1. 延迟测试
ping -c 10 example.com        # IPv4
ping6 -c 10 example.com      # IPv6

# 2. 带宽测试(iperf3)
# 服务端
iperf3 -s -V    # IPv6 服务端
iperf3 -s       # IPv4 服务端

# 客户端
iperf3 -c <ipv6-server> -V -t 10
iperf3 -c <ipv4-server> -t 10

# 3. 实际应用测试
ab -n 1000 -c 10 https://example.com/      # IPv4
ab -n 1000 -c 10 https://[2001:db8::1]/   # IPv6

典型结果:IPv6 性能与 IPv4 相当或略好(无 NAT 开销)。如果 IPv6 性能明显差,检查 MTU 设置(IPv6 最小 MTU 是 1280,部分运营商/设备可能配置不当)。

总结与判断

IPv6 部署的核心是"双栈过渡"——不要急着切纯 IPv6,先把双栈跑稳。三个关键点:① 运营商 IPv6 连通性(最常见的问题);② DNS AAAA 记录(最容易漏的配置);③ 防火墙双栈规则(最容易忽视的安全点)。

我的判断:对于企业网络,建议的部署顺序是:① 外网服务先上双栈(网站、API);② 内网服务逐步上双栈(数据库、中间件);③ 网络设备(交换机、路由器)更新 IPv6 支持;④ 最后清理 IPv4 依赖。整个过程 6-12 个月,不要急于求成。

延伸阅读