Ubuntu VPS 手动分配 iPv6 并启用

Ubuntu VPS 手动分配 iPv6 并启用

适用场景:VPS 被分配一个 /64 IPv6 子网(如 2001:db8:abcd:1234::/64),但系统未自动配置全局地址,需手动启用并设置正确网关(如 2001:db8:abcd::1)。


✅ 一、最终成功配置步骤

步骤 1:确认基本信息

1
2
3
4
5
6
# 查看当前 IPv6 地址
ip -6 addr show

# 确认分配的子网(例如)
# IPv6 子网:2001:db8:abcd:1234::/64
# IPv6 网关:2001:db8:abcd::1 (注意:不在你的 /64 子网内!)

步骤 2:创建纯净 Netplan 配置(关键!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 删除旧配置(避免冲突)
sudo rm -f /etc/netplan/00-installer-config.yaml

# 使用 cat > 创建无注释、无 Tab 的干净配置
sudo cat > /etc/netplan/00-installer-config.yaml <<'EOF'
network:
version: 2
ethernets:
ens3:
dhcp4: true
addresses:
- "2001:db8:abcd:1234::100/64"
routes:
- to: default
via: "2001:db8:abcd::1"
on-link: true
EOF

📌 说明:

  • ens3:替换为你的实际网卡名(通过 ip a 确认)
  • ::100:可自定义子网内任意地址(避免 ::0::1
  • to: default:新版 Netplan 推荐写法(等价于 ::/0
  • on-link: true必须加!因为网关不在本地 /64 子网

步骤 3:修复权限 & 应用配置

1
2
3
4
5
# 修复权限(避免警告)
sudo chmod 600 /etc/netplan/00-installer-config.yaml

# 应用配置
sudo netplan apply

步骤 4:验证

1
2
3
4
5
6
7
# 检查默认路由
ip -6 route show default
# 应输出:default via 2001:db8:abcd::1 dev ens3 ...

# 测试连通性
ping6 -c 4 2001:4860:4860::8844 # Google DNS(真实地址,用于测试)
curl -6 https://ipv6.google.com # 测试 HTTPS

✅ 成功标志:能 ping 通外网 IPv6 地址,且 ip -6 route show default 非空。


⚠️ 二、踩坑记录与解决方案

问题现象 原因分析 解决方案
ip -6 route show default 为空 Netplan 的 routes 配置未生效 使用 cat > 创建无注释、严格缩进的 YAML;确保 on-link: true
Netplan 报权限警告 配置文件权限过宽(如 644) 执行 chmod 600 /etc/netplan/*.yaml
gateway6 被弃用警告 新版 Netplan 不支持 gateway6 字段 改用 routes + to: default
路由添加失败(Invalid argument) 网关不在本地子网,未加 on-link 必须在 Netplan 中设置 on-link: true
多个 .yaml 文件冲突 cloud-init 或其他配置覆盖 删除多余文件,或禁用 cloud-init 网络:
echo 'network: {config: disabled}' > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
手动 ip route add 成功,但 Netplan 失败 YAML 缩进错误(Tab/空格混用) cat > 方式生成配置,避免编辑器隐藏字符

🔍 三、关键原理说明

  • 你的 IPv6 地址:2001:db8:abcd:1234::100/64
  • 网关地址:2001:db8:abcd::1
  • 两者前缀不同(...:1234:: vs ...::1),Linux 默认认为“网关不可达”
  • on-link: true 告诉内核:“即使不在子网内,也直接通过本接口发包”

为什么不能用 gateway6

  • Ubuntu 22.04+ 的 Netplan 已弃用 gateway6
  • 虽然临时可用,但会报 warning,且未来可能失效
  • 官方推荐使用 routes 明确指定默认路由

🛡️ 四、后续建议

  1. 备份配置

    1
    sudo cp /etc/netplan/00-installer-config.yaml ~/ipv6-config-backup.yaml
  2. 检查防火墙
    若使用 UFW:

    1
    2
    3
    sudo nano /etc/default/ufw
    # 确保 IPV6=yes
    sudo ufw reload
  3. 测试服务绑定
    确保 Web 服务(Nginx/Apache)监听 [::]:80,而不仅是 0.0.0.0:80

  4. 记录提供商信息

    • 子网:2001:db8:abcd:1234::/64
    • 网关:2001:db8:abcd::1
    • 控制面板是否需手动启用 IPv6(如某些 VPS 提供商)

🎯 五、总结

要点 说明
核心难点 网关不在本地 /64 子网 → 必须加 on-link: true
配置关键 YAML 格式必须纯净(无 Tab、无注释、缩进一致)
验证顺序 ip -6 addr → 再 ip -6 route → 最后 ping6
回滚方法 删除 IPv6 地址 + 清空路由 + 恢复原始 Netplan
通用性 适用于 Hetzner、Contabo、OVH 等提供 /64 + 上级网关的 VPS

💡 经验之谈:VPS 的 IPv6 配置失败,90% 是因为 网关路由未正确设置,10% 是 YAML 格式问题。只要掌握 on-link: true + 纯净配置,即可一劳永逸。经过实测确实是配置格式的问题。

写作说明:以上部分内容来自 AI 生成,经过全部实测后补充了内容。


Ubuntu VPS 手动分配 iPv6 并启用
https://enldm.cyou/2025/12/Ubuntu VPS 手动分配 iPv6 并启用/
作者
ENLDM
发布于
2025年12月10日
许可协议