Oracle Cloud 免费服务器 IPv6 开启完全指南 | 控制台配置与系统设置教程

甲骨文云的免费实例默认只给 IPv4,IPv6 要自己动手开。很多人卡住不是因为某一步特别难,而是没意识到它根本不是一个开关:云端的网络、子网、实例是三个各自独立的层面,系统内部还有一层,任何一层没开,表现出来的都是「没有 IPv6」,但修法完全不同。这篇就按层往下走——先把三层的依赖关系讲清,再逐层配置,系统里把地址拿起来并验证,最后留一张按层定位的故障表,对照着就能知道自己卡在哪。
先想清楚:三层都通,才算真的开了
把一次 IPv6 配置拆开看,依赖关系是自上而下的:
- VCN 层:整个虚拟云网络先要拥有一段 IPv6 地址(一个
/56段),这是地址的源头。没有它,下面所有 IPv6 选项都不会出现。 - 子网层:子网从 VCN 的地址段里切走一个
/64给自己用;同时挂在子网上的路由表要放行 IPv6 出站、安全列表要放行 IPv6 流量。地址、出口、门禁都在这一层。 - 实例层:给实例的 VNIC 绑一个具体的 IPv6 地址,再让操作系统把这个地址真正启用起来。
顺序不能颠倒:上层缺位时,下层连入口都没有。所以下面严格按 VCN、子网、实例的次序操作;菜单名称以 Oracle 当前控制台为准,不同界面版本措辞可能略有差异。
第一层:给 VCN 添加 IPv6 CIDR 块

从控制台进入「网络 → 虚拟云网络」,点开你实例所在的那一个 VCN。找不到 VCN 时也可以反着走:从实例详情页点开附加的 VNIC,顺着它就能跳回所属的 VCN 和子网,先确认自己操作的是对的网络再动手。

在 VCN 详情页打开左侧的「CIDR 块」,点「添加 IPv6 CIDR 块」,确认即可。地址段由甲骨文自动划拨,形如 2603:c1:3:b500::/56,不能自选,一个 VCN 也只能有一块。


关于 /56 只需记住两点:它足够再切出 256 个 /64 子网,个人用远远有余;这块地址是整个 VCN 共用的池子,子网和实例用的地址都从这里出。
第二层:子网切分、路由放行、安全列表放行
子网启用 IPv6

在 VCN 详情页进入「子网」,对实例所在的子网(通常是公有子网)点「编辑」,勾选「启用 IPv6 CIDR 块」,填一个子网标识符后保存。

标识符是两位十六进制数(00–ff),它的作用就是把子网的 /64 从 VCN 的 /56 里定位出来:VCN 是 2603:c1:3:b500::/56,标识符填 ee,子网段就是 2603:c1:3:b500:ee::/64。这个拼法后面修错时还要用到,先记牢。

保存成功后,子网详情里能看到这段 IPv6 CIDR。如果保存时报 NotAuthorizedOrNotFound,先别反复重试——这是已知的一类权限/资源匹配问题,需要去 Cloud Shell 里用命令行补,先跳到文末的 处理 NotAuthorizedOrNotFound 错误 修好,再回来继续。
路由表补一条 IPv6 默认路由

地址有了,还得有出口。进入「路由表」,打开与该子网关联的那张表,添加一条规则:目的地类型选 CIDR,目的地填 ::/0,目标类型选 Internet 网关,目标就选 VCN 自带的那个互联网网关,保存。
::/0 是 IPv6 里的默认路由,等价于 IPv4 的 0.0.0.0/0,意思是「所有 IPv6 流量都往网关送」。注意别写错成 :/0 或 0::/0。这条规则和原有的 IPv4 规则并存,互不影响;它缺失时的典型表现是:地址拿到了,但 ping 任何外网 IPv6 都不通——记住这个对应关系,排障时用得上。
安全列表放行 IPv6 流量


安全列表是子网层面的防火墙。进入「安全列表」,打开关联子网的那一份,按需要补入站规则,出站一般已有放行全部的规则,没有就补一条目的地 ::/0、所有协议。
入站最少要有这几类:
- ICMPv6,源
::/0:这是必需项,不只是 ping,邻居发现和路径 MTU 发现都靠它,缺了会出现「能连上但传数据异常」的怪现象。 - SSH(TCP 22):要通过 IPv6 远程登录就加。
- HTTP/HTTPS(TCP 80、443):实例对外提供 Web 服务才加。
原则是按需开放、别图省事全端口放行;需要更细的控制时,用网络安全组(NSG)针对单个 VNIC 管控,比改整个子网的安全列表更稳妥。
第三层:给实例的 VNIC 分配地址

回到实例详情页,在「附加的 VNIC」里点开主 VNIC,进入详情后找到「IPv6 地址」一节——完成前面两层之后,这里才会出现「分配 IPv6 地址」的入口,这也是检验上层是否真的生效的一个信号。

分配有两种方式:留空直接分配,系统从子网 /64 里随机挑一个;也可以手动指定后缀,比如填 :1 得到 ...ee::1,好记,但要确认没和已有地址冲突。给服务器用的地址建议手动指定一个好记的,后续配 DNS、写防火墙规则都方便。

把分配到的地址记下来。再说一句地址的稳定性:在控制台这一侧,地址是绑在 VNIC 上的,不主动释放就一直在,重启实例也不会变;系统里经 DHCPv6 看到的租期、续租,说的是操作系统与云端之间确认这份绑定的节奏,不等于地址会过期作废。所以拿它配 AAAA 解析、写进放行名单,都可以按长期地址对待,不用担心哪天悄悄换掉——真要换,只有你自己在控制台释放重分这一种情况。
顺带分清两类地址:2xxx:/3xxx: 开头的是全局单播地址,能被公网访问,我们要的是它;fe80: 开头的是链路本地地址,每块网卡都有,只在本地链路有效,排障时别把两者搞混。到这一步云端三层全部就位,但系统里还没启用,地址暂时只是「挂在 VNIC 上」。
系统内配置:让操作系统把地址拿起来
先确认网卡名:ARM 机型(Ampere A1)通常是 enp0s6,x86 机型通常是 ens3,拿不准就用 ip link 看实际名称,下面命令里的网卡名按你的机器替换。
先临时拉一次,验证云端配置没问题
# x86 机型
sudo dhclient -6 ens3
# ARM 机型
sudo dhclient -6 enp0s6然后查看地址:
ip -6 addr show
正常会看到类似输出:
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 state UP qlen 1000
inet6 2603:c1:3:b500:ee:xxxx:xxxx:xxxx/64 scope global dynamic noprefixroute
valid_lft 7200sec preferred_lft 7200sec
inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
valid_lft forever preferred_lft forever判断标准只看一条:有没有 scope global 的那行。dynamic 表示它经 DHCPv6 拿到,valid_lft 是租期,系统会自动续租不用管;只有 fe80:: 一行,说明云端某一层还没通,往回查,不要在系统里瞎折腾。
连通性随手测一下:
ping6 -c 3 google.com
curl -6 https://ipv6.google.com
dhclient 这种拿法是临时的,重启就没了。验证通过后,按发行版选一种持久化写法。
Ubuntu:交给 Netplan
Ubuntu 用 Netplan 管网络,在 /etc/netplan/50-cloud-init.yaml 对应网卡下打开 DHCPv6 并接受路由通告:
network:
version: 2
ethernets:
ens3:
dhcp4: true
dhcp6: true
accept-ra: truesudo netplan applyDebian / Ubuntu:systemd-networkd 方案
另一条更稳妥的路线是切到 systemd-networkd:写一个 .network 匹配文件声明 DHCPv4 与 IPv6 接受 RA,停用 ifupdown 再启用 networkd。这套步骤细节较多,本站有专门一篇 Debian 系统自动获取 IPv6 完全指南 逐步写全,这里不重复展开。
只想给 dhclient 加个开机自启
如果系统环境简单、不想改网络管理框架,可以把那条 dhclient 命令做成一个 systemd 一次性服务,开机时执行一次:
sudo nano /etc/systemd/system/ipv6-dhcp.service[Unit]
Description=DHCPv6 Client for ens3
After=network.target
[Service]
Type=oneshot
ExecStart=/sbin/dhclient -6 ens3
RemainAfterExit=yes
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now ipv6-dhcp.service用 rc.local 也能实现,但那是老办法,新系统上支持越来越弱,能用 systemd 就别用它。用 NetworkManager 管网络的桌面版 Ubuntu,则是一条命令的事:
sudo nmcli con mod "有线连接 1" ipv6.method auto
sudo nmcli con down "有线连接 1" && sudo nmcli con up "有线连接 1"验证:四步走完才算数
持久化配完,sudo reboot 重启一次,再依次确认:
# 1. 地址还在,且是 scope global
ip -6 addr show
# 2. 纯 IPv6 目标能 ping 通
ping6 -c 4 2001:4860:4860::8888
# 3. 强制走 IPv6 能拿到出口地址
curl -6 https://api64.ipify.org
# 4. 从外部反向连回来(在另一台支持 IPv6 的机器上)
ssh -6 opc@[2603:c1:3:b500:ee:xxxx:xxxx:xxxx]想更全面地测,可以用 test-ipv6.com、ipv6-test.com、whatismyv6.com 这类在线检测页看连通性、DNS 与 MTU 的综合结果。重启后地址仍在、内外双向都通,IPv6 这件事才算真正落地。
这里特意把「从外部连回来」单独列为一步,是因为出站通和入站通走的是两套放行逻辑:出站靠路由表和出站规则,入站靠安全列表的入站规则。只测前三步,很容易留下一个「自己能出去、别人进不来」的半成品,等到部署的服务要对外提供访问时才发现,再回头排查就会多绕很多路。
之后要给域名加 IPv6 解析,在 DNS 里给同一个主机名加一条 AAAA 记录、值填这个全局地址即可,和原有 A 记录并存,dig AAAA 你的域名 能查到就算生效。
三层检查清单
动手排障前,先按这张清单逐层对一遍,多数问题在这一轮就能定位:
VCN 层
子网层
实例层与系统
故障定位:现象对层,一层层往下查
| 现象 | 卡在哪一层 | 处理方向 |
|---|---|---|
| VNIC 页根本没有「IPv6 地址」一节 | VCN 层或子网层 | 先回去确认 VCN 加了 /56、子网启用了 IPv6,这两层缺一,实例层入口就不出现 |
子网保存时报 NotAuthorizedOrNotFound | 子网层 | 控制台这条路暂时走不通,按下一节用 Cloud Shell 命令行补上子网的 IPv6 段 |
控制台地址已分配,系统里只有 fe80:: | 实例层(系统侧) | VNIC 上有地址但系统没拿:执行 dhclient -6 <网卡>,或检查 Netplan / networkd 的 DHCPv6 是否打开 |
| 有全局地址,但 ping 外网 IPv6 全部不通 | 子网层(路由) | 十有八九是路由表缺 ::/0 → Internet 网关,补上再测 |
| 出站能通,外部经 IPv6 连不进来 | 子网层(安全列表) | 查入站规则:ICMPv6 是否放行、目标端口是否放行;顺带确认服务本身监听了 IPv6 |
| ping 域名不通、ping 纯 IPv6 地址能通 | 系统侧(解析) | 这是 DNS 问题而非 IPv6 配置问题,检查解析器是否返回 AAAA、系统 DNS 设置是否正常 |
| 当时配好能用,重启后地址消失 | 实例层(系统侧) | 持久化没做或没生效:dhclient 只是临时拿法,按发行版补 Netplan / networkd / systemd 服务后重启复验 |
命令行更新子网时报 ipv6CidrBlock ... is invalid | 子网层 | 给子网的必须是 /64,把误填的 /56 按「前缀 + 标识符」拼成 /64 再执行 |
处理 NotAuthorizedOrNotFound 错误

在子网编辑页保存 IPv6 设置时遇到这个报错,通常是控制台侧的权限或资源匹配问题,换 Cloud Shell 用 OCI 命令行直接改子网属性就能绕过去。
打开控制台右上角的 Cloud Shell(>_ 图标),先查区间 ID:
oci iam compartment list
返回的 JSON 里记下目标区间的 id(形如 ocid1.compartment.oc1..aaaa...)。再用它列出子网:
oci network subnet list --compartment-id ocid1.compartment.oc1..aaaaaaaayyyyyyyyyyyy
从结果里认准你要改的那一个子网——看 display-name 和 time-created 辨认——记下它的 id(ocid1.subnet...)。

接着去 VCN 的「CIDR 块」页抄下已添加的 IPv6 段,比如 2603:c1:3:b500::/56,按前面讲过的拼法加上标识符得到子网的 /64:2603:c1:3:b500:ee::/64。标识符当时填过什么就用什么,实在想不起来,就回子网编辑页看,或者从 00、01、ee 这几个常见值逐个试。
最后更新子网(把两个占位值换成你自己的):
oci network subnet update \
--subnet-id ocid1.subnet.oc1.xxxxxxxx.zzzzzzzzzzzz \
--ipv6-cidr-block 2603:c1:3:b500:ee::/64如果回报错里说这个段 is invalid、提示子网只能用 64 位 CIDR,多半是把 /56 原样填进去了,改成拼好的 /64 再跑一次。命令执行成功后回控制台刷新子网页,IPv6 段应该已经出现,然后接着完成路由表、安全列表与 VNIC 分配,后面的层不要落下。
收尾
回顾一下整件事的骨架:VCN 给出 /56 地址池,子网切走 /64 并把路由与安全规则放行,VNIC 绑上具体地址,系统用 DHCPv6 把地址拿起来并做持久化——四步缺一不可,排障也按这个次序逐层缩小范围。IPv6 与 IPv4 是双栈并存的关系,开了 IPv6 不影响原有 IPv4 的任何使用,不需要二选一。
还没开通过免费实例的,先看 Oracle Cloud 免费注册与开通教程 把机器拿到手;系统侧想走 systemd-networkd 路线的,接着看 Debian 系统自动获取 IPv6 完全指南。