甲骨文云(Oracle Cloud)免费服务器开启 IPv6
IPv6 需要云平台和实例系统两侧配置齐全。先从目标实例的 VNIC 页面记录所属区域、compartment、VCN、子网及其 OCID,再开始修改;同名资源不一定是同一个对象。下面保留旧版控制台截图,菜单位置以当前界面为准,操作顺序按正文进行。
面板操作
为正确的 VCN 和子网启用 IPv6
从实例所属网络进入 VCN 详情,添加 Oracle 分配的 IPv6 前缀。此类 VCN 前缀为 /56,子网从中选择 /64;准备访问公网时,还要确认子网允许公网 IPv6 通信,不能只看地址是否已经分配。Oracle IPv6 文档




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


WARNING
若出现 NotAuthorizedOrNotFound,先按错误排查检查区域、资源归属和权限。不要尝试修改其他不确定的子网 ID。


配置公网路由和所需安全规则
在该子网实际关联的路由表中检查 IPv6 默认路由。需要直接访问公网时,目的地填 ::/0,目标选该 VCN 已启用的 Internet 网关;不要改动不相关的路由表。

接着检查子网安全列表和 VNIC 所属网络安全组(NSG)。旧截图仅示意入口,按实际业务填写协议、来源或目的地与端口:
| 方向 | 按需配置 |
|---|---|
| 入站 SSH | 允许实际 SSH TCP 端口,来源优先限制为管理网络的 IPv6 前缀 |
| 入站业务 | 例如网站的 TCP 443;只添加正在提供的服务 |
| 入站 ICMPv6 | 保留路径 MTU 发现所需的类型 2;需要 ping 测试时再允许对应的 Echo Request |
| 出站 | 允许实例实际需要访问的目的地和协议;若采用允许全部 IPv6 出站的策略,目的地为 ::/0 |
有状态规则会跟踪连接的返回流量;不要把“允许全部出站”的设置照抄成“允许所有协议入站”。实例内部的防火墙也必须允许相应流量。


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



系统操作
保留已工作的 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
如果当前网络管理器已经配置 DHCPv6/RA,先按其方式续租或应用配置。使用 DD Debian 且需要配置 networkd 时,可继续阅读 Debian IPv6 配置与切换验证。
以下保留 dhclient 的临时诊断方法:仅适用于已安装该命令,且目标接口没有由其他 DHCPv6 客户端接管的系统。若已有管理器负责 DHCPv6,不额外启动第二个客户端。
sh
command -v dhclient
sudo dhclient -6 -v "$net_if"只有确认 dhclient 存在、接口正确且没有重复客户端后才执行最后一行。临时获取地址不会自动替代持久化配置,DHCPv6 地址也不能代替 IPv6 默认路由。
2. 查看 IPv6 是否生效
sh
ip -6 address show dev "$net_if"
ip -6 route show检查是否取得与 VNIC 分配结果对应的全局地址,以及正确的 IPv6 默认路由。仅有 fe80:: 链路本地地址、地址处于 tentative / dadfailed,或没有默认路由,都不能认定公网 IPv6 已可用。

3. 测试 IPv6 连通性
先使用已知支持 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 的机器验证实际端口。

4. 验证重启后的持久性
将 IPv6 设置写入当前网络管理器的源配置,确认 IPv4、IPv6、DNS 和新 SSH 会话正常后,在可接受中断的时间重启:
sh
sudo reboot重启后重复检查地址、路由、DNS 和实际服务。如果临时获取成功而重启后丢失,应检查网络管理器配置与启动日志,不重复修改已经正确的云端子网。
排查 NotAuthorizedOrNotFound
该错误需要同时检查“目标是否存在”和“当前身份是否有权限”。Cloud Shell 使用的区域、compartment 或身份与控制台目标不同,都应先核对;CLI 并不能绕过 IAM 授权。

1. 确认 compartment 和区域
从目标子网详情复制 compartment OCID,并确认当前区域。也可用下列只读查询辅助核对名称;列表结果不能替代资源详情中的归属信息,根 compartment 的 OCID 应从租户信息取得。
sh
oci iam compartment list --all
2. 查询并核对唯一目标子网
将以下占位值替换为控制台中已确认的值,保留引号;不要按创建时间猜测目标。
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。任一项不一致,先修正查询对象;读取本身被拒绝时,先处理权限或区域问题,不进入更新步骤。

3. 选择正确的 IPv6 子网前缀
读取 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。

4. 确认后更新目标子网
只有目标、权限和前缀都核对完成,且确实需要为该子网配置这一前缀时,才运行更新命令。已经配置正确的子网无需再写入;涉及已有多个前缀的调整,应按当前 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 参数说明