---
url: https://eoht.net/vps/oracle-cloud/ipv6.md
description: >-
  按 VCN、子网、路由、安全规则和 VNIC 的顺序为 Oracle Cloud 实例启用 IPv6，识别系统实际网卡与网络管理器，并通过精确查询排查
  NotAuthorizedOrNotFound。
---

# 甲骨文云(Oracle Cloud)免费服务器开启 IPv6 {#enable-ipv6-on-oracle-cloud-free-tier}

IPv6 需要云平台和实例系统两侧配置齐全。先从目标实例的 VNIC 页面记录所属区域、compartment、VCN、子网及其 OCID，再开始修改；同名资源不一定是同一个对象。下面保留旧版控制台截图，菜单位置以当前界面为准，操作顺序按正文进行。

## 面板操作 {#configure-ipv6-in-oracle-cloud-console}

### 为正确的 VCN 和子网启用 IPv6

从实例所属网络进入 VCN 详情，添加 Oracle 分配的 IPv6 前缀。此类 VCN 前缀为 `/56`，子网从中选择 `/64`；准备访问公网时，还要确认子网允许公网 IPv6 通信，不能只看地址是否已经分配。[Oracle IPv6 文档](https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/ipv6.htm)

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231818861.webp "前往网络与虚拟云网络，核对目标 VCN")

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231819553.webp "旧版控制台操作位置示意")

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231820587.webp "在 VCN 的 CIDR 块页面添加 IPv6 前缀")

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231821399.webp "检查已分配的 VCN IPv6 前缀")

编辑实例 VNIC 实际所属的子网，为其分配 VCN 范围内、未与其他子网重叠的 `/64`。界面要求填写两位十六进制子网编号时，应先核对已有分配；截图中的 `ee` 只是示例。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231822211.webp "打开并核对实例所属子网")

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231823342.webp "为目标子网选择未占用的 IPv6 子网编号")

::: warning
若出现 `NotAuthorizedOrNotFound`，先按[错误排查](#troubleshoot-authorization-error)检查区域、资源归属和权限。不要尝试修改其他不确定的子网 ID。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231824668.webp "NotAuthorizedOrNotFound 错误示例")
:::

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231827273.webp "确认目标子网的 IPv6 前缀")

### 配置公网路由和所需安全规则

在该子网实际关联的路由表中检查 IPv6 默认路由。需要直接访问公网时，目的地填 `::/0`，目标选该 VCN 已启用的 Internet 网关；不要改动不相关的路由表。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231831909.webp "在子网关联的路由表中添加 IPv6 默认路由")

接着检查子网安全列表和 VNIC 所属网络安全组（NSG）。旧截图仅示意入口，按实际业务填写协议、来源或目的地与端口：

| 方向 | 按需配置 |
| --- | --- |
| 入站 SSH | 允许实际 SSH TCP 端口，来源优先限制为管理网络的 IPv6 前缀 |
| 入站业务 | 例如网站的 TCP 443；只添加正在提供的服务 |
| 入站 ICMPv6 | 保留路径 MTU 发现所需的类型 2；需要 ping 测试时再允许对应的 Echo Request |
| 出站 | 允许实例实际需要访问的目的地和协议；若采用允许全部 IPv6 出站的策略，目的地为 `::/0` |

有状态规则会跟踪连接的返回流量；不要把“允许全部出站”的设置照抄成“允许所有协议入站”。实例内部的防火墙也必须允许相应流量。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231831385.webp "安全列表规则入口，具体范围按正文配置")

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231831626.webp "旧版安全规则界面示例")

### 为实例 VNIC 分配地址

进入目标实例 → `附加的 VNIC` → VNIC 详情，核对前面配置的子网，再选择分配 IPv6 地址。可让平台自动分配，或选择该子网内允许且未占用的地址；记录最终分配结果，稍后与系统内地址比较。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231832850.webp "进入目标实例的 VNIC 详情")

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231833826.webp "为 VNIC 分配 IPv6 地址")

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231833883.webp)

## 系统操作 {#configure-ipv6-in-operating-system}

保留已工作的 IPv4 SSH 会话和云控制台入口。先识别接口与网络管理器，不按 ARM 或 AMD 推断网卡名称：

```sh
ip -br link
ip -br address
ip route
systemctl is-active systemd-networkd NetworkManager networking
```

结合 `/etc/netplan/`、`/etc/systemd/network/`、`/etc/network/interfaces` 及镜像配置判断谁在管理目标接口。多个服务存在时，还要确认具体接口归属，不能仅凭服务已安装就切换管理器。

接着设置后文检查使用的接口变量。把示例值替换为刚才核对的实际接口；每次重新登录终端后也要重新设置：

```sh
net_if='ens3'
```

### 1. 获取 IPv6 {#obtain-ipv6-address}

如果当前网络管理器已经配置 DHCPv6/RA，先按其方式续租或应用配置。使用 DD Debian 且需要配置 networkd 时，可继续阅读 [Debian IPv6 配置与切换验证](./debian-ipv6.md)。

以下保留 `dhclient` 的临时诊断方法：仅适用于已安装该命令，且目标接口没有由其他 DHCPv6 客户端接管的系统。若已有管理器负责 DHCPv6，不额外启动第二个客户端。

```sh
command -v dhclient
sudo dhclient -6 -v "$net_if"
```

只有确认 `dhclient` 存在、接口正确且没有重复客户端后才执行最后一行。临时获取地址不会自动替代持久化配置，DHCPv6 地址也不能代替 IPv6 默认路由。

### 2. 查看 IPv6 是否生效 {#verify-ipv6-address}

```sh
ip -6 address show dev "$net_if"
ip -6 route show
```

检查是否取得与 VNIC 分配结果对应的全局地址，以及正确的 IPv6 默认路由。仅有 `fe80::` 链路本地地址、地址处于 `tentative` / `dadfailed`，或没有默认路由，都不能认定公网 IPv6 已可用。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231836653.webp "检查接口地址，不能只看是否出现 inet6")

### 3. 测试 IPv6 连通性 {#test-ipv6-connectivity}

先使用已知支持 IPv6 的外部地址测试，再使用域名区分网络和 DNS 问题：

```sh
ping -6 -c 4 2606:4700:4700::1111
getent ahostsv6 www.cloudflare.com
curl --noproxy '*' -6 -I --connect-timeout 10 https://www.cloudflare.com/
```

远端可能过滤 ping，所以单次 ping 失败不能证明 IPv6 整体不可用。HTTPS 测试需要系统已安装 curl；`--noproxy '*'` 用于排除代理设置，检查实例的直连 IPv6。返回 HTTP 响应可说明该次 IPv6 连接和域名解析已成功，但不代表实例入站端口已经开放。若对外提供服务，还应从另一台具有 IPv6 的机器验证实际端口。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231837145.webp "旧版 ping 测试示例")

### 4. 验证重启后的持久性 {#reboot-server}

将 IPv6 设置写入当前网络管理器的源配置，确认 IPv4、IPv6、DNS 和新 SSH 会话正常后，在可接受中断的时间重启：

```sh
sudo reboot
```

重启后重复检查地址、路由、DNS 和实际服务。如果临时获取成功而重启后丢失，应检查网络管理器配置与启动日志，不重复修改已经正确的云端子网。

## 排查 NotAuthorizedOrNotFound {#troubleshoot-authorization-error}

该错误需要同时检查“目标是否存在”和“当前身份是否有权限”。Cloud Shell 使用的区域、compartment 或身份与控制台目标不同，都应先核对；CLI 并不能绕过 IAM 授权。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231844976.webp "在 Cloud Shell 中核对目标资源")

### 1. 确认 compartment 和区域 {#get-compartment-id}

从目标子网详情复制 compartment OCID，并确认当前区域。也可用下列只读查询辅助核对名称；列表结果不能替代资源详情中的归属信息，根 compartment 的 OCID 应从租户信息取得。

```sh
oci iam compartment list --all
```

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231844994.webp "核对 compartment OCID")

### 2. 查询并核对唯一目标子网 {#get-subnet-id}

将以下占位值替换为控制台中已确认的值，保留引号；不要按创建时间猜测目标。

```sh
oci_region='替换为实例区域'
compartment_id='替换为compartment OCID'
vcn_id='替换为VCN OCID'
subnet_id='替换为VNIC所属子网OCID'
oci network subnet list --region "$oci_region" \
  --compartment-id "$compartment_id" --vcn-id "$vcn_id" --all
oci network subnet get --region "$oci_region" --subnet-id "$subnet_id"
```

对照显示名称、VCN ID、IPv4/IPv6 CIDR 与实例 VNIC 页面中的子网 OCID。任一项不一致，先修正查询对象；读取本身被拒绝时，先处理权限或区域问题，不进入更新步骤。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231846849.webp "多个子网时逐项核对归属与 OCID，不尝试不确定的 ID")

### 3. 选择正确的 IPv6 子网前缀 {#get-ipv6-cidr}

读取 VCN 的 IPv6 前缀，并结合刚才的子网列表确认已使用范围：

```sh
oci network vcn get --region "$oci_region" --vcn-id "$vcn_id"
```

Oracle 分配的 VCN `/56` 需要划分出有效且未占用的 `/64` 给子网。出现 `Subnet can have only 64 bit IPv6 CIDRs` 时，应检查完整地址范围；不能看到 `/56` 就机械地只把后缀改为 `/64`。

![Oracle IPv6 =688x](https://i.eoht.net/docs/202406231846612.webp "核对 VCN 前缀与子网已经使用的范围")

### 4. 确认后更新目标子网 {#update-subnet-ipv6-settings}

只有目标、权限和前缀都核对完成，且确实需要为该子网配置这一前缀时，才运行更新命令。已经配置正确的子网无需再写入；涉及已有多个前缀的调整，应按当前 OCI 文档处理，不直接套用单前缀示例。

```sh
subnet_ipv6_cidr='替换为已核对的IPv6子网前缀/64'
oci network subnet update --region "$oci_region" \
  --subnet-id "$subnet_id" --ipv6-cidr-block "$subnet_ipv6_cidr"
oci network subnet get --region "$oci_region" --subnet-id "$subnet_id"
```

确认返回结果中的子网 ID、VCN 和 IPv6 前缀正确，再回到路由、安全规则和 VNIC 分配步骤。[OCI CLI subnet update 参数说明](https://docs.oracle.com/en-us/iaas/tools/oci-cli/latest/oci_cli_docs/cmdref/network/subnet/update.html)
