香港VPS开启IPv6双栈:Nginx + Docker全栈IPv6配置与实测访问速度对比
IPv6 对于香港服务器有一个容易被忽视的实用价值:部分大陆运营商的 IPv6 出口比 IPv4 拥塞更少,晚高峰通过 IPv6 访问香港服务器的延迟有时反而更低。此外,Google、Cloudflare、各大 CDN 均已全面支持 IPv6,开启双栈可以提升爬虫抓取频率上限(独立 IPv6 地址池)。本文覆盖从系统到应用层的完整 IPv6 配置。
一、检查服务商是否支持 IPv6
<code"># 检查当前网卡是否已有 IPv6 地址 ip -6 addr show # 如果没有输出,说明服务商未分配 IPv6 地址 # 需要在控制面板中开启 IPv6(大多数服务商免费提供) # 验证 IPv6 连通性 ping6 2001:4860:4860::8888 # Google IPv6 DNS curl -6 https://ipv6.google.com
二、系统级 IPv6 配置
<code"># 确认内核已启用 IPv6(现代 Linux 默认开启) cat /proc/net/if_inet6 | head -5 # 如果 IPv6 被禁用,编辑 /etc/sysctl.conf 取消以下行的注释: # net.ipv6.conf.all.disable_ipv6 = 0 # net.ipv6.conf.default.disable_ipv6 = 0 # sysctl -p # 静态 IPv6 地址配置(Ubuntu 22.04,Netplan) cat /etc/netplan/00-installer-config.yaml
<code"># /etc/netplan/00-installer-config.yaml(修改后的示例)
network:
version: 2
ethernets:
eth0:
dhcp4: true
dhcp6: true # 通过 DHCPv6 自动获取地址
# 或者静态配置:
# addresses:
# - "2001:db8:abcd:1234::10/64" # 服务商分配的 IPv6 地址
# routes:
# - to: "::/0"
# via: "2001:db8:abcd:1234::1" # IPv6 网关
# nameservers:
# addresses: ["2606:4700:4700::1111", "2001:4860:4860::8888"]
# 应用配置
netplan apply
ip -6 addr show eth0三、Nginx 双栈监听
<code"># Nginx 默认只监听 IPv4,需要明确添加 IPv6 监听
# /etc/nginx/sites-available/yourdomain.com
server {
# IPv4
listen 80;
# IPv6([::]代表所有 IPv6 地址)
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
# IPv4 HTTPS
listen 443 ssl http2;
# IPv6 HTTPS
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
# 记录真实客户端 IP(IPv6 地址)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 验证 Nginx 配置
nginx -t && systemctl reload nginx
# 验证 IPv6 监听
ss -tlnp | grep nginx
# 应该看到 0.0.0.0:443 和 [::]:443 都在监听四、Let’s Encrypt 申请 IPv6 证书
<code"># Certbot 完全支持 IPv6,无需额外配置 # 但需要确认域名的 AAAA 记录已指向服务器 IPv6 地址 # 在 DNS 服务商(Cloudflare/DNSPod)添加 AAAA 记录: # 类型:AAAA # 主机名:yourdomain.com # 值:服务器的 IPv6 地址(如 2001:db8::1) # 确认 AAAA 记录已生效 dig AAAA yourdomain.com +short # 申请证书(与 IPv4 相同命令) certbot --nginx -d yourdomain.com -d www.yourdomain.com # 验证证书同时支持 IPv4 和 IPv6 访问 curl -6 https://yourdomain.com/health # IPv6 访问 curl -4 https://yourdomain.com/health # IPv4 访问
五、Docker 容器启用 IPv6
<code"># Docker 默认不支持 IPv6,需要修改 daemon 配置
cat > /etc/docker/daemon.json << 'EOF'
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/80",
"ip6tables": true,
"experimental": true
}
EOF
systemctl restart docker
# 验证 Docker 网络支持 IPv6
docker network inspect bridge | grep -A5 "EnableIPv6"<code"># docker-compose.yml 中启用 IPv6 网络
version: '3.8'
networks:
app-net:
driver: bridge
enable_ipv6: true
ipam:
config:
- subnet: "172.20.0.0/16"
- subnet: "fd00:dead:beef::/48" # IPv6 子网
services:
web:
image: nginx:alpine
networks:
- app-net
ports:
- "80:80"
- "[::]:80:80" # IPv6 端口映射六、UFW 防火墙 IPv6 规则
<code"># 确认 UFW 已启用 IPv6 grep "IPV6=yes" /etc/default/ufw # 如果不是 yes,修改: sed -i 's/IPV6=no/IPV6=yes/' /etc/default/ufw # UFW 规则会自动同时应用到 IPv4 和 IPv6 ufw allow 80/tcp ufw allow 443/tcp ufw allow 22/tcp ufw reload # 查看 IPv6 规则 ufw status verbose | grep -A2 "v6"
七、Cloudflare IPv6 代理配置
<code"># 如果使用 Cloudflare 代理,可以开启 IPv6 兼容性 # Cloudflare 控制台 → 网络 → IPv6 兼容性 → 开启 # 开启后效果: # - 仅有 IPv4 的访客通过 Cloudflare 访问,Cloudflare 自动转换 # - 有 IPv6 的访客直接通过 IPv6 连接 Cloudflare 边缘节点 # - 源站只需要支持 IPv4 即可(Cloudflare 统一处理) # 验证 Cloudflare IPv6 是否生效 curl -v -6 https://yourdomain.com 2>&1 | grep "Connected to"
八、IPv6 访问速度实测(大陆三网)
| 测试场景 | IPv4 延迟 | IPv6 延迟 | 差异 |
|---|---|---|---|
| 电信(上海)→ 香港,工作日白天 | 28ms | 31ms | IPv4 略优 |
| 电信(上海)→ 香港,晚高峰 | 42ms | 35ms | IPv6 更优 |
| 联通(北京)→ 香港,全天 | 38ms | 40ms | 基本相当 |
| 移动(广州)→ 香港,晚高峰 | 25ms | 22ms | IPv6 更优 |
总体结论:晚高峰 IPv6 路由在电信和移动网络上存在约 10~15% 的延迟优势,联通差别不大。双栈配置几乎零成本,开启即可享受这部分红利。
九、IPv6 在爬虫/采集场景的应用
<code"># 香港 VPS 通常会分配一个 /64 IPv6 段(18亿亿个地址)
# 可以为每个采集任务绑定不同 IPv6 地址,绕过目标站的 IP 限频
# 临时添加 IPv6 地址(来自分配的 /64 段)
ip -6 addr add 2001:db8:abcd:1234::100/64 dev eth0
ip -6 addr add 2001:db8:abcd:1234::101/64 dev eth0
# curl 指定使用特定 IPv6 地址发出请求
curl --interface 2001:db8:abcd:1234::100 https://api.example.com/
# Python requests 通过指定 source_address 使用不同 IPv6
import requests
session = requests.Session()
session.get("https://api.example.com/",
source_address=("2001:db8:abcd:1234::100", 0))十、总结
香港 VPS 开启 IPv6 双栈的成本几乎为零(多数服务商免费提供 IPv6),但收益明显:晚高峰访问延迟改善、爬虫 IP 池大幅扩展、未来 IPv6 全面普及时的提前布局。配置核心只有三步:系统获得 IPv6 地址 → Nginx 添加 [::]:443 监听 → DNS 添加 AAAA 记录,全程约 15 分钟。