一次搞懂 OCI 网络:VCN、Subnet、VNIC、Public IP、Internet Gateway 到底是什么
很多人第一次看 OCI 控制台时,都会有几个典型疑问:
- VCN 是 Oracle 的整个网络吗?
- 为什么 Public IP 看起来像是在 Subnet 里面?
- 实例明明在私网里,为什么绑定个公网 IP 就能从外网访问?
- 公网流量进来时,到底经过了哪些组件?
- VCN 和 VNIC 分别起什么作用?
这篇文章就用图把这几个问题一次说清楚。
一、先看全景图:OCI 网络里“谁属于谁”
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 的整个网络
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 里面”?
这是最容易误解的地方。
先看图
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 上
一个常见误区
flowchart LR
W["误解:Public Subnet = 子网本身就是公网地址段"] --> X["×"]
X --> R["正确:Subnet 仍然常用私网 CIDR<br/>Public 的意思是:这里的资源可绑定 Public IP,且能经 IGW 与公网通信"]
正确说法
实例仍然在私网 Subnet 中,只是它的 VNIC 绑定了 Public IP,所以外部可以访问它。
四、公有子网和私有子网到底差在哪?
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)公网入站流量路径图
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 主要影响出站和回包,不要把它理解成每个入站包都手工选路
这张图的重点
公网访问一台实例,关键看这几层:
- 有没有 Public IP
- VCN 里有没有 Internet Gateway
- 安全规则是否放行
- VNIC 是否接收到流量
- 实例自身防火墙是否放行
- 应用是否监听端口
六、为什么 Route Table 仍然很重要?因为回包要靠它
很多人会误以为:
只要外面的请求能进来就够了
其实不是。连接要成功,回包也必须能出去。
2)实例回包的路径图
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 分别起什么作用?
这是另一个经常混的点。
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 是实例的网络接口。
八、想让公网真正访问成功,需要哪些条件同时满足?
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 个关卡
只要其中任何一关没过,公网访问都可能失败。
九、公网访问失败时的排障图
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)概念对照图
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)访客进入你家的路径图
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)你给访客回消息的路径图
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,再到达实例。