服务器IPv6配置完整指南:开启双栈网络、Nginx监听与Cloudflare IPv6加速

IPv4地址已严重枯竭,IPv6是互联网的未来。支持IPv6双栈的服务器可以同时服务IPv4和IPv6用户,提升访问覆盖率,并在Google等搜索引擎对支持IPv6的站点有微弱加分。本文给出香港VPS开启IPv6的完整方案。

一、确认服务器是否支持IPv6

# 检查是否已分配IPv6地址
ip -6 addr show

# 若显示类似以下输出,则已有IPv6:
# inet6 2400:8900::f03c:91ff:fe24:xxxx/64 scope global dynamic
# inet6 fe80::f03c:91ff:fe24:xxxx/64 scope link

# 测试IPv6连通性
ping6 ipv6.google.com

# 若未分配IPv6,联系IDC.Net开启IPv6支持(通常在控制台可自助开启)

二、配置IPv6静态地址(Ubuntu 22.04)

# 查看网卡名称
ip link show
# 通常为 eth0 或 ens3

# 编辑Netplan配置
nano /etc/netplan/50-cloud-init.yaml
<code"># 在现有IPv4配置基础上添加IPv6
network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 192.168.1.10/24        # 现有IPv4地址
        - 2400:8900::1234/64     # 新增IPv6地址(向服务商获取)
      gateway4: 192.168.1.1
      gateway6: 2400:8900::1     # IPv6网关(向服务商获取)
      nameservers:
        addresses:
          - 8.8.8.8
          - 2001:4860:4860::8888  # Google IPv6 DNS
<code"># 应用配置
netplan apply

# 验证
ip -6 addr show eth0
ip -6 route show

三、Nginx同时监听IPv4和IPv6

<code">server {
    # IPv4监听
    listen 80;
    listen 443 ssl http2;

    # IPv6监听(添加这两行)
    listen [::]:80;
    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;

    # 记录访问者的真实IPv6地址
    set_real_ip_from ::/0;
    real_ip_header X-Forwarded-For;

    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}
<code"># 验证Nginx同时监听IPv4和IPv6
ss -tlnp | grep nginx
# 应显示:
# LISTEN  0  511  0.0.0.0:443   *:*  users:(("nginx",...))
# LISTEN  0  511  [::]:443      *:*  users:(("nginx",...))

# 测试IPv6访问
curl -6 https://yourdomain.com

四、DNS配置AAAA记录

<code"># 在DNS管理后台添加AAAA记录(IPv6版A记录)

# Cloudflare Dashboard → DNS → Add record
# 类型:AAAA
# 名称:@(代表根域名)
# IPv6地址:你的服务器IPv6地址(如 2400:8900::1234)
# 代理状态:已代理(开启Cloudflare IPv6加速)

# 同样为www子域名添加AAAA记录
# 类型:AAAA
# 名称:www
# IPv6地址:同上

# 验证AAAA记录是否生效
dig AAAA yourdomain.com
# 输出应包含:yourdomain.com. 300 IN AAAA 2400:8900::1234

五、Let's Encrypt支持IPv6申请证书

<code"># Certbot通过HTTP验证时,同时支持IPv4和IPv6
# 若服务器只有IPv6(无IPv4),使用以下方式:

# 方式1:DNS验证(不依赖HTTP,推荐)
certbot certonly --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  -d yourdomain.com \
  -d www.yourdomain.com

# 方式2:指定使用IPv6进行HTTP验证
certbot certonly --nginx \
  -d yourdomain.com \
  --preferred-challenges http

六、UFW防火墙IPv6规则

<code"># 确认UFW已开启IPv6支持
grep "IPV6=yes" /etc/default/ufw

# 若未开启,编辑配置文件
sed -i 's/IPV6=no/IPV6=yes/' /etc/default/ufw

# 重载防火墙规则
ufw reload

# 为IPv6添加与IPv4相同的规则(UFW通常自动处理,但验证一下)
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 443/udp   # HTTP/3 QUIC

# 查看包含IPv6的规则状态
ufw status verbose | grep -A2 "v6"

七、PHP获取真实IPv6客户端地址

<code"><?php
// 获取访问者真实IP(兼容IPv4和IPv6)
function get_client_ip() {
    // Cloudflare代理场景
    if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        return $_SERVER['HTTP_CF_CONNECTING_IP'];
    }
    // 普通代理场景
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        return trim($ips[0]);
    }
    return $_SERVER['REMOTE_ADDR'];
}

$client_ip = get_client_ip();
$is_ipv6 = filter_var($client_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);

echo "客户端IP:" . $client_ip . "\n";
echo "是否IPv6:" . ($is_ipv6 ? "是" : "否") . "\n";

八、IPv6访问测试工具

<code"># 在线测试工具:
# https://ipv6-test.com    — 测试你的服务器是否支持IPv6
# https://test-ipv6.com   — 测试客户端IPv6连通性

# 命令行测试:
# 测试IPv6 DNS解析
dig AAAA yourdomain.com @2001:4860:4860::8888

# 测试IPv6 HTTP访问
curl -6 -v https://yourdomain.com

# 测试IPv6 ping
ping6 yourdomain.com

九、总结

开启IPv6双栈是未来趋势,配置成本低,收益是覆盖更多用户并提升搜索引擎评分。整个配置过程约30分钟,不影响现有IPv4服务。IDC.Net的香港VPS全系支持IPv6地址分配,在控制台即可一键开启,无需额外费用。

THE END