SSF0SSF0
首页
前端
  • Node
  • Go
  • Python
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
  • 开源项目
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • Python
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
  • 开源项目
Timeline
Github
标签
分类
  • Bash

    • Bash 获取路径在不同类型电脑的区别
  • Git

    • Git 使用 ssh 与 https 的区别
    • Git 回滚、重置与变基
    • 文件名大小写发生变化的坑
    • Git 提交信息规范解读与实践指南
    • Git 历史邮箱统一
    • Git 拉取 GitHub 失败、配置代理及 DNS 问题排查总结
    • Git 实战教程:如何使用 Cherry-pick 或直接覆盖让两个分支同步公共功能
  • Docker

    • Docker 命令大全
    • nginx 镜像部署静态文件
    • Docker 运行命令说明
    • 使用 node 镜像运行本地项目
    • 挂载和卷的区别
    • Docker 打包多平台镜像
    • Docker 使用 mysql
    • Docker 容器网络访问问题总结
    • Docker 容器绑定ip问题
  • VuePress

    • 使用 VuePress 搭建个人博客概括
  • CI/CD

    • blog 使用 Github-Actions 部署 docker 服务器
    • GitHub Actions项目部署国内服务器文件传输时间优化
  • 服务器

    • 腾讯云使用 ssh 连接服务器(Linux 实例)
    • ssl 证书安装到 docker 服务器
    • 操作系统与架构
    • ssh 连接时长问题
    • Oracle 服务器基础知识
    • OCI 专属网络拓扑图
    • 甲骨文-宝塔面板无法访问问题
    • 甲骨文服务器防火墙问题排查记录
    • 甲骨文重启后宝塔面板无法访问
  • hosts 文件指南
  • Cloudflare DNS与代理
  • 跨平台定时任务设置指南
  • Edge 浏览器连不上代理?一场由插件引发的“夺权”与 v2rayN 的深度探索
  • 二级域名访问异常排查记录
  • 软件走代理时如何抓包
  • JetBrains AI 使用
  • Clash 代理工作原理详解

一次搞懂 OCI 网络:VCN、Subnet、VNIC、Public IP、Internet Gateway 到底是什么

很多人第一次看 OCI 控制台时,都会有几个典型疑问:

  1. VCN 是 Oracle 的整个网络吗?
  2. 为什么 Public IP 看起来像是在 Subnet 里面?
  3. 实例明明在私网里,为什么绑定个公网 IP 就能从外网访问?
  4. 公网流量进来时,到底经过了哪些组件?
  5. VCN 和 VNIC 分别起什么作用?

这篇文章就用图把这几个问题一次说清楚。


一、先看全景图:OCI 网络里“谁属于谁”

Mermaid 图表渲染失败:请检查图表语法

flowchart TD
    OCI["OCI / Oracle Cloud Infrastructure"]
    Region["Region"]
    Tenancy["你的 Tenancy / Compartment"]
    VCN["VCN<br/>你自己创建的虚拟私有网络"]
    Subnet["Subnet<br/>VCN 里的一个子网"]
    VNIC["VNIC<br/>实例的虚拟网卡"]
    PrivIP["Private IP<br/>真正位于 Subnet 网段内"]
    Instance["Instance<br/>云服务器"]
    PublicIP["Public IP<br/>对外可访问地址"]
    IGW["Internet Gateway<br/>连接公网"]
    RT["Route Table<br/>决定出站/回包怎么走"]
    SL["Security List<br/>子网级安全规则"]
    NSG["NSG<br/>VNIC 级安全规则"]

    OCI --> Region --> Tenancy --> VCN
    VCN --> Subnet --> VNIC --> Instance
    VNIC --> PrivIP
    PublicIP -.绑定到.-> PrivIP
    VCN --> IGW
    Subnet -.关联.-> RT
    Subnet -.关联.-> SL
    VNIC -.可加入.-> NSG

这张图最重要的 4 个结论

  • VCN 不是 Oracle 整个平台的网络,而是你自己创建的一张虚拟私有网络。
  • Subnet 是 VCN 里面的一段子网。
  • 实例不是直接连到 Subnet 上,而是通过 VNIC 接入 Subnet。
  • Public IP 不是“Subnet 的地址”,而是绑定到 VNIC 上某个 Private IP 的对外地址。

二、VCN 到底是什么?它不是 Oracle 的整个网络

Mermaid 图表渲染失败:请检查图表语法

flowchart LR
    OCI["Oracle 云平台"]
    Region["某个 Region"]
    MyVCN["你的 VCN<br/>你自己的网络边界"]
    OtherVCN["其他人的 VCN<br/>与你隔离"]

    OCI --> Region
    Region --> MyVCN
    Region --> OtherVCN

正确理解

VCN = Virtual Cloud Network

它的意思不是:

  • Oracle 的整个网络

而是:

  • 你在 OCI 里创建的一张“自己的虚拟私有网络”

你可以把它理解成:

  • Oracle 云平台是个很大的基础设施
  • 你在其中划了一块属于自己的逻辑网络
  • 这块逻辑网络就叫 VCN

一句话记忆

VCN 不是 Oracle 全网,而是你在 Oracle 云里拥有的一张私有网络。


三、为什么会感觉“公网在 Subnet 里面”?

这是最容易误解的地方。

先看图

Mermaid 图表渲染失败:请检查图表语法

flowchart TD
    subgraph VCN["VCN 10.0.0.0/16"]
        Subnet["Public Subnet<br/>10.0.0.0/24<br/>注意:CIDR 仍然是私网"]
        VNIC["VNIC"]
        PrivIP["Private IP<br/>10.0.0.103"]
        Instance["Instance"]
        Subnet --> VNIC --> PrivIP
        VNIC --> Instance
    end

    PubIP["Public IP<br/>147.224.x.x"]
    PubIP -.绑定到这个 Private IP.-> PrivIP

这张图说明什么?

真正属于 Subnet 网段的是:

  • 10.0.0.103 这种 Private IP

而 147.224.x.x 这种 Public IP:

  • 不是说 Subnet 本身变成了公网
  • 而是 OCI 把一个公网地址绑定到了这个 VNIC 的 Private IP 上

一个常见误区

Mermaid 图表渲染失败:请检查图表语法

flowchart LR
    W["误解:Public Subnet = 子网本身就是公网地址段"] --> X["×"]
    X --> R["正确:Subnet 仍然常用私网 CIDR<br/>Public 的意思是:这里的资源可绑定 Public IP,且能经 IGW 与公网通信"]

正确说法

实例仍然在私网 Subnet 中,只是它的 VNIC 绑定了 Public IP,所以外部可以访问它。


四、公有子网和私有子网到底差在哪?

Mermaid 图表渲染失败:请检查图表语法

flowchart LR
    Internet["Internet"]
    IGW["Internet Gateway"]
    NAT["NAT Gateway"]

    subgraph VCN["VCN 10.0.0.0/16"]
        subgraph PUB["Public Subnet<br/>10.0.0.0/24"]
            PubInst["实例 A<br/>Private IP + 可选 Public IP"]
            PubRT["Route Table<br/>0.0.0.0/0 -> IGW"]
            PubInst --> PubRT
        end

        subgraph PRI["Private Subnet<br/>10.0.1.0/24"]
            PriInst["实例 B<br/>只有 Private IP"]
            PriRT["Route Table<br/>0.0.0.0/0 -> NAT"]
            PriInst --> PriRT
        end
    end

    PubRT --> IGW
    PriRT --> NAT
    IGW <--> Internet
    NAT --> Internet

结论

Public Subnet

通常表示:

  • 子网里的资源 可以使用 Public IP
  • 路由表里有:
    • 0.0.0.0/0 -> Internet Gateway

所以它能直接和公网通信。

Private Subnet

通常表示:

  • 子网里的资源 不直接使用 Public IP
  • 访问外网一般走:
    • NAT Gateway
  • 外网不能主动直接访问里面的实例

五、实例绑定公网 IP 后,公网流量到底怎么进来?

你前面问得最关键的一句是:

“通过这个公网进来,是不是也要走 gateway、router、subnet、安全列表?”

答案是:

  • Gateway:要
  • Subnet:要
  • Security List / NSG:要
  • VNIC:要
  • Route Table:有关系,但它更关键的是出站和回包

1)公网入站流量路径图

Mermaid 图表渲染失败:请检查图表语法

sequenceDiagram
    participant C as 公网客户端
    participant IGW as Internet Gateway
    participant VCN as VCN
    participant SEC as Security List / NSG
    participant VNIC as VNIC
    participant OS as Instance OS
    participant APP as 应用服务

    C->>IGW: 访问 Public IP:22/80/443
    IGW->>VCN: 把流量送入你的 VCN
    VCN->>SEC: 检查安全规则
    SEC-->>VCN: 允许 或 拒绝
    VCN->>VNIC: 找到绑定该 Public IP 的 VNIC
    VNIC->>OS: 进入实例操作系统
    OS->>APP: OS 防火墙放行后交给应用

    Note over IGW,VCN: Route Table 主要影响出站和回包,不要把它理解成每个入站包都手工选路

这张图的重点

公网访问一台实例,关键看这几层:

  1. 有没有 Public IP
  2. VCN 里有没有 Internet Gateway
  3. 安全规则是否放行
  4. VNIC 是否接收到流量
  5. 实例自身防火墙是否放行
  6. 应用是否监听端口

六、为什么 Route Table 仍然很重要?因为回包要靠它

很多人会误以为:

只要外面的请求能进来就够了

其实不是。连接要成功,回包也必须能出去。


2)实例回包的路径图

Mermaid 图表渲染失败:请检查图表语法

sequenceDiagram
    participant APP as 应用服务
    participant OS as Instance OS
    participant VNIC as VNIC
    participant SEC as Security List / NSG
    participant RT as Route Table
    participant IGW as Internet Gateway
    participant C as 公网客户端

    APP->>OS: 产生响应数据
    OS->>VNIC: 通过网卡发出
    VNIC->>SEC: 检查出站安全规则
    SEC-->>VNIC: 允许 或 拒绝
    VNIC->>RT: 查询去公网的路由
    RT-->>VNIC: 0.0.0.0/0 -> IGW
    VNIC->>IGW: 发往公网
    IGW->>C: 返回给客户端

    Note over RT,IGW: 没有默认路由时,公网访问常见表现就是“请求进来但回包失败”

这一节的一句话总结

入站时你重点看 Public IP、IGW、安全规则、VNIC;出站和回包时你重点看 Route Table。


七、VCN 和 VNIC 分别起什么作用?

这是另一个经常混的点。

Mermaid 图表渲染失败:请检查图表语法

flowchart LR
    VCN["VCN"] --> A["作用:定义你的网络边界"]
    VCN --> B["里面放:Subnet / IGW / Route Table / Security List"]
    VCN --> C["它不是一张网卡,而是一整个网络环境"]

    VNIC["VNIC"] --> D["作用:给实例提供网络接口"]
    VNIC --> E["持有 Private IP"]
    VNIC --> F["可绑定 Public IP / 加入 NSG"]
    VNIC --> G["它不是整个网络,而是实例真正的入口/出口"]

直接理解

VCN 像什么?

  • 像你自己的“网络地盘”
  • 它定义了边界和整体结构

VNIC 像什么?

  • 像实例的“网卡”
  • 真正收发流量的是它

一句话记忆

VCN 是网络环境,VNIC 是实例的网络接口。


八、想让公网真正访问成功,需要哪些条件同时满足?

Mermaid 图表渲染失败:请检查图表语法

flowchart TD
    Start["想让公网成功访问一台实例"] --> A["1. 实例所在 Subnet 允许使用 Public IP"]
    A --> B["2. VNIC 的 Private IP 已绑定 Public IP"]
    B --> C["3. VCN 中存在 Internet Gateway"]
    C --> D["4. Subnet 的 Route Table 有 0.0.0.0/0 -> IGW"]
    D --> E["5. Security List / NSG 放行对应端口"]
    E --> F["6. 实例 OS 防火墙放行"]
    F --> G["7. 应用服务正在监听端口"]

你可以把它当成 7 个关卡

只要其中任何一关没过,公网访问都可能失败。


九、公网访问失败时的排障图

Mermaid 图表渲染失败:请检查图表语法

flowchart TD
    S["公网访问失败"] --> A{"有 Public IP 吗?"}
    A -- 否 --> A1["给 VNIC 的 Private IP 绑定 Public IP"]
    A -- 是 --> B{"Subnet 是 Public Subnet,且有 IGW 吗?"}
    B -- 否 --> B1["改为 Public Subnet,或补齐 IGW / Route Table"]
    B -- 是 --> C{"Route Table 有 0.0.0.0/0 -> IGW 吗?"}
    C -- 否 --> C1["补默认路由"]
    C -- 是 --> D{"Security List / NSG 放行目标端口吗?"}
    D -- 否 --> D1["放行 22 / 80 / 443 等端口"]
    D -- 是 --> E{"实例 OS 防火墙放行吗?"}
    E -- 否 --> E1["检查 iptables / firewalld / Windows Firewall"]
    E -- 是 --> F{"应用在监听正确端口吗?"}
    F -- 否 --> F1["检查 ss -lntp / netstat"]
    F -- 是 --> G["继续排查应用绑定地址、服务状态和日志"]

十、用“小区”例子理解 OCI 网络

这个类比对初学者非常有效。

1)概念对照图

Mermaid 图表渲染失败:请检查图表语法

flowchart LR
    VCN["VCN"] --- A["整个小区"]
    Subnet["Subnet"] --- B["小区里的一栋楼"]
    IGW["Internet Gateway"] --- C["小区大门"]
    RT["Route Table"] --- D["路牌 / 导航规则"]
    SL["Security List / NSG"] --- E["门禁 / 保安"]
    VNIC["VNIC"] --- F["你家的门牌 + 入户门"]
    PrivateIP["Private IP"] --- G["小区内部门牌号"]
    PublicIP["Public IP"] --- H["对外公开的联系电话 / 地址"]
    Instance["Instance"] --- I["住户本人"]

2)访客进入你家的路径图

Mermaid 图表渲染失败:请检查图表语法

flowchart LR
    Visitor["访客 / 快递员"] --> Address["公开地址 / 电话<br/>Public IP"]
    Address --> Gate["小区大门<br/>Internet Gateway"]
    Gate --> Community["你的小区<br/>VCN"]
    Community --> Building["某栋楼<br/>Subnet"]
    Building --> Guard["门禁检查<br/>Security List / NSG"]
    Guard --> Door["你家门口<br/>VNIC"]
    Door --> Resident["住户<br/>Instance"]
    Resident --> Room["屋里是否开门<br/>OS 防火墙 / 应用服务"]

3)你给访客回消息的路径图

Mermaid 图表渲染失败:请检查图表语法

flowchart LR
    Resident["住户的回复<br/>应用返回数据"] --> Door["你家门口<br/>VNIC"]
    Door --> Sign["路牌 / 导航规则<br/>Route Table"]
    Sign --> Gate["小区大门<br/>Internet Gateway"]
    Gate --> Visitor["访客 / 快递员"]

这个类比最关键的一点

快递最终不是送到:

  • 整个小区
  • 整栋楼

而是送到:

  • 你家的门口

在 OCI 里,这个“门口”就是 VNIC。


十一、最后把你最容易混淆的地方,压缩成 5 句话

1. VCN 是什么?

VCN 是你在 OCI 里创建的一张虚拟私有网络,不是 Oracle 的整个网络。

2. Subnet 是什么?

Subnet 是 VCN 里的一段子网。

3. Public IP 为什么会出现在 Subnet 相关页面?

因为它是绑定到这个 Subnet 里的某个 VNIC 的 Private IP 上。

4. 公网流量最终打到哪里?

最终打到 VNIC,再进入实例。

5. Route Table、Security List、VNIC 各自干什么?

Route Table 决定怎么出去、怎么回;Security List / NSG 决定放不放;VNIC 是实例真正收包发包的入口。


十二、全文总结

如果要用一句话总结这篇文章,那就是:

实例实际位于 VCN 的私网 Subnet 中,通过 VNIC 拥有 Private IP;当该 Private IP 绑定 Public IP,且 VCN 具备 Internet Gateway、子网 Route Table 正确、安全规则放行时,公网流量就能进入这个 VNIC,再到达实例。

最后更新时间:
贡献者: 何风顺
上一页
ssh 连接时长问题
下一页
OCI 专属网络拓扑图