OCI VCN、子网、VNIC 与安全层

解释 OCI 公网连通所需的 VCN、子网、VNIC、网关、路由、安全规则和主机防火墙之间的依赖关系。

#type / synthesis #status / growing #tech / network #resource / oracle-cloud #platform / server

[!abstract] 核心不变量 一个端口能从公网访问,必须同时满足地址、路由、OCI 安全规则、主机防火墙和进程监听五层条件。任意一层拒绝,连接都会失败;任意一层全放行,也不能替代其他层的最小权限。

OCI VCN、子网、VNIC 与安全层

为什么不能只说“开放 443”

公网请求到达应用需要经过一条完整路径:

flowchart LR
    U[公网客户端] --> IG[Internet Gateway]
    IG --> RT[子网路由表]
    RT --> SR[NSG / Security List]
    SR --> V[VNIC 公网或 IPv6 地址]
    V --> FW[主机防火墙]
    FW --> S[监听端口的服务]

“OCI 后台开放所有协议,然后只用 UFW 管理”减少了登录控制台的次数,却失去一层独立防护,也违反 Oracle 的纵深防御建议。

网络对象的职责

对象作用常见错误
VCN区域内的私有虚拟网络把它误认为一台机器的防火墙
Subnet给 VNIC 分配地址并绑定路由与安全列表公有/私有属性理解错误
VNIC实例连接 VCN 的虚拟网卡实例有 IPv6 前缀但 VNIC 没地址
Internet Gateway为公有子网提供互联网路由目标创建了网关却没加路由
Route Table决定目标流量发往哪个网关只有 IPv4 0.0.x.x/0,没有 IPv6 ::/0
Security List对子网内 VNIC 应用规则一条规则影响同子网所有实例
NSG按资源/应用分组应用安全规则实例未加入目标 NSG
Host Firewall实例内部的第二层访问控制启用前没放行 SSH,把自己锁死

Security List 与 NSG

Security List 绑定子网,适合表达子网默认规则;NSG 绑定 VNIC/资源,更适合按应用角色管理。两者都使用 allow-list 模型:没有允许规则的流量不会通过。

对单机初学者,一个清晰做法是:

  • 保留子网默认必要规则;
  • 为服务器创建专用 NSG;
  • NSG 中只开放 SSH 和实际公开服务;
  • 主机侧 UFW 再重复限制同样端口;
  • 数据库只绑定本地/私网地址,不对公网开放。

有状态与无状态规则

  • Stateful:允许请求后自动允许对应返回流量,适合普通 SSH、HTTP/HTTPS。
  • Stateless:请求与返回方向都要显式写规则,适合明确需要高性能或特殊网络行为的场景。

初学者优先使用有状态规则。不要在不理解回程流量时混用无状态规则。

SSH 最小规则

理想状态:

来源:你的固定公网 IPv4/32 或可信网段
协议:TCP
目标端口:22 或计划使用的 SSH 端口
状态:Stateful

如果家庭公网 IP 经常变化,可临时使用更宽来源,但应配合密钥认证、禁止 root/密码登录、Fail2ban 或 VPN/Bastion,并尽快收紧。

[!warning] IPv6 的攻击面 给 VNIC 分配全球可路由 IPv6 后,它不依赖 IPv4 NAT。必须同时配置 IPv6 安全规则和 UFW IPv6 策略,不能只检查 IPv4。

公开 Web 服务的最小规则

  • TCP 80:只在首次签发证书、HTTP 跳转或确实提供 HTTP 时开放。
  • TCP 443:公开 HTTPS 服务。
  • SSH:限制来源,不与 Web 端口使用同样的全网来源策略。
  • 应用内部端口:只绑定 127.0.x.x 或容器私有网络,由 Caddy/Nginx 代理。

端口变更的安全顺序

  1. 保留现有 SSH 会话。
  2. 云侧和 UFW 先允许新端口。
  3. 写入 SSH drop-in 配置。
  4. sshd -t 验证语法。
  5. reload 而不是立即强制 restart。
  6. 从本机新建第二个 SSH 会话。
  7. 确认密钥、sudo 和重启后仍可登录。
  8. 最后删除旧端口规则。

具体操作见 安全加固 OCI Linux 服务器

排障时逐层验证

DNS/IP 正确?
  -> VNIC 有公网地址?
  -> 子网有 Internet Gateway 路由?
  -> NSG/Security List 允许?
  -> UFW/nftables/iptables 允许?
  -> ss -lntup 显示服务监听?
  -> 服务绑定 0.0.x.x/:: 还是仅 localhost?

完整路径见 OCI SSH 与端口连通性排查

创建于 2026/7/20 更新于 2026/7/20