跳转到内容
严选跨境网络服务与流媒体推荐
实机测速保障 · 专属折扣
声明:以上服务由影迷漫游评测实验室进行晚高峰抽测与流媒体解锁验证。专属链接包含推广支持,不增加您的购买成本。

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

Oracle Cloud IPv6 Configuration

甲骨文云的免费实例默认只给 IPv4,IPv6 要自己动手开。很多人卡住不是因为某一步特别难,而是没意识到它根本不是一个开关:云端的网络、子网、实例是三个各自独立的层面,系统内部还有一层,任何一层没开,表现出来的都是「没有 IPv6」,但修法完全不同。这篇就按层往下走——先把三层的依赖关系讲清,再逐层配置,系统里把地址拿起来并验证,最后留一张按层定位的故障表,对照着就能知道自己卡在哪。

先想清楚:三层都通,才算真的开了 ​

把一次 IPv6 配置拆开看,依赖关系是自上而下的:

  • VCN 层:整个虚拟云网络先要拥有一段 IPv6 地址(一个 /56 段),这是地址的源头。没有它,下面所有 IPv6 选项都不会出现。
  • 子网层:子网从 VCN 的地址段里切走一个 /64 给自己用;同时挂在子网上的路由表要放行 IPv6 出站、安全列表要放行 IPv6 流量。地址、出口、门禁都在这一层。
  • 实例层:给实例的 VNIC 绑一个具体的 IPv6 地址,再让操作系统把这个地址真正启用起来。

顺序不能颠倒:上层缺位时,下层连入口都没有。所以下面严格按 VCN、子网、实例的次序操作;菜单名称以 Oracle 当前控制台为准,不同界面版本措辞可能略有差异。

第一层:给 VCN 添加 IPv6 CIDR 块 ​

Oracle IPv6

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

Oracle IPv6

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

Oracle IPv6

Oracle IPv6

关于 /56 只需记住两点:它足够再切出 256 个 /64 子网,个人用远远有余;这块地址是整个 VCN 共用的池子,子网和实例用的地址都从这里出。

第二层:子网切分、路由放行、安全列表放行 ​

子网启用 IPv6 ​

Oracle IPv6

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

Oracle IPv6

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

Oracle IPv6

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

路由表补一条 IPv6 默认路由 ​

Oracle IPv6

地址有了,还得有出口。进入「路由表」,打开与该子网关联的那张表,添加一条规则:目的地类型选 CIDR,目的地填 ::/0,目标类型选 Internet 网关,目标就选 VCN 自带的那个互联网网关,保存。

::/0 是 IPv6 里的默认路由,等价于 IPv4 的 0.0.0.0/0,意思是「所有 IPv6 流量都往网关送」。注意别写错成 :/0 或 0::/0。这条规则和原有的 IPv4 规则并存,互不影响;它缺失时的典型表现是:地址拿到了,但 ping 任何外网 IPv6 都不通——记住这个对应关系,排障时用得上。

安全列表放行 IPv6 流量 ​

Oracle IPv6

Oracle IPv6

安全列表是子网层面的防火墙。进入「安全列表」,打开关联子网的那一份,按需要补入站规则,出站一般已有放行全部的规则,没有就补一条目的地 ::/0、所有协议。

入站最少要有这几类:

  • ICMPv6,源 ::/0:这是必需项,不只是 ping,邻居发现和路径 MTU 发现都靠它,缺了会出现「能连上但传数据异常」的怪现象。
  • SSH(TCP 22):要通过 IPv6 远程登录就加。
  • HTTP/HTTPS(TCP 80、443):实例对外提供 Web 服务才加。

原则是按需开放、别图省事全端口放行;需要更细的控制时,用网络安全组(NSG)针对单个 VNIC 管控,比改整个子网的安全列表更稳妥。

第三层:给实例的 VNIC 分配地址 ​

Oracle IPv6

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

Oracle IPv6

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

Oracle IPv6

把分配到的地址记下来。再说一句地址的稳定性:在控制台这一侧,地址是绑在 VNIC 上的,不主动释放就一直在,重启实例也不会变;系统里经 DHCPv6 看到的租期、续租,说的是操作系统与云端之间确认这份绑定的节奏,不等于地址会过期作废。所以拿它配 AAAA 解析、写进放行名单,都可以按长期地址对待,不用担心哪天悄悄换掉——真要换,只有你自己在控制台释放重分这一种情况。

顺带分清两类地址:2xxx:/3xxx: 开头的是全局单播地址,能被公网访问,我们要的是它;fe80: 开头的是链路本地地址,每块网卡都有,只在本地链路有效,排障时别把两者搞混。到这一步云端三层全部就位,但系统里还没启用,地址暂时只是「挂在 VNIC 上」。

系统内配置:让操作系统把地址拿起来 ​

先确认网卡名:ARM 机型(Ampere A1)通常是 enp0s6,x86 机型通常是 ens3,拿不准就用 ip link 看实际名称,下面命令里的网卡名按你的机器替换。

先临时拉一次,验证云端配置没问题 ​

sh
# x86 机型
sudo dhclient -6 ens3

# ARM 机型
sudo dhclient -6 enp0s6

然后查看地址:

sh
ip -6 addr show

Oracle IPv6

正常会看到类似输出:

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:: 一行,说明云端某一层还没通,往回查,不要在系统里瞎折腾。

连通性随手测一下:

sh
ping6 -c 3 google.com
curl -6 https://ipv6.google.com

Oracle IPv6

dhclient 这种拿法是临时的,重启就没了。验证通过后,按发行版选一种持久化写法。

Ubuntu:交给 Netplan ​

Ubuntu 用 Netplan 管网络,在 /etc/netplan/50-cloud-init.yaml 对应网卡下打开 DHCPv6 并接受路由通告:

yaml
network:
  version: 2
  ethernets:
    ens3:
      dhcp4: true
      dhcp6: true
      accept-ra: true
bash
sudo netplan apply

Debian / Ubuntu:systemd-networkd 方案 ​

另一条更稳妥的路线是切到 systemd-networkd:写一个 .network 匹配文件声明 DHCPv4 与 IPv6 接受 RA,停用 ifupdown 再启用 networkd。这套步骤细节较多,本站有专门一篇 Debian 系统自动获取 IPv6 完全指南 逐步写全,这里不重复展开。

只想给 dhclient 加个开机自启 ​

如果系统环境简单、不想改网络管理框架,可以把那条 dhclient 命令做成一个 systemd 一次性服务,开机时执行一次:

bash
sudo nano /etc/systemd/system/ipv6-dhcp.service
ini
[Unit]
Description=DHCPv6 Client for ens3
After=network.target

[Service]
Type=oneshot
ExecStart=/sbin/dhclient -6 ens3
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable --now ipv6-dhcp.service

用 rc.local 也能实现,但那是老办法,新系统上支持越来越弱,能用 systemd 就别用它。用 NetworkManager 管网络的桌面版 Ubuntu,则是一条命令的事:

bash
sudo nmcli con mod "有线连接 1" ipv6.method auto
sudo nmcli con down "有线连接 1" && sudo nmcli con up "有线连接 1"

验证:四步走完才算数 ​

持久化配完,sudo reboot 重启一次,再依次确认:

bash
# 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 错误 ​

Oracle IPv6

在子网编辑页保存 IPv6 设置时遇到这个报错,通常是控制台侧的权限或资源匹配问题,换 Cloud Shell 用 OCI 命令行直接改子网属性就能绕过去。

Oracle IPv6

打开控制台右上角的 Cloud Shell(>_ 图标),先查区间 ID:

sh
oci iam compartment list

Oracle IPv6

返回的 JSON 里记下目标区间的 id(形如 ocid1.compartment.oc1..aaaa...)。再用它列出子网:

sh
oci network subnet list --compartment-id ocid1.compartment.oc1..aaaaaaaayyyyyyyyyyyy

Oracle IPv6

从结果里认准你要改的那一个子网——看 display-name 和 time-created 辨认——记下它的 id(ocid1.subnet...)。

Oracle IPv6

接着去 VCN 的「CIDR 块」页抄下已添加的 IPv6 段,比如 2603:c1:3:b500::/56,按前面讲过的拼法加上标识符得到子网的 /64:2603:c1:3:b500:ee::/64。标识符当时填过什么就用什么,实在想不起来,就回子网编辑页看,或者从 00、01、ee 这几个常见值逐个试。

最后更新子网(把两个占位值换成你自己的):

sh
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 完全指南。