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 代理。
端口变更的安全顺序
- 保留现有 SSH 会话。
- 云侧和 UFW 先允许新端口。
- 写入 SSH drop-in 配置。
sshd -t验证语法。- reload 而不是立即强制 restart。
- 从本机新建第二个 SSH 会话。
- 确认密钥、sudo 和重启后仍可登录。
- 最后删除旧端口规则。
具体操作见 安全加固 OCI Linux 服务器。
排障时逐层验证
DNS/IP 正确?
-> VNIC 有公网地址?
-> 子网有 Internet Gateway 路由?
-> NSG/Security List 允许?
-> UFW/nftables/iptables 允许?
-> ss -lntup 显示服务监听?
-> 服务绑定 0.0.x.x/:: 还是仅 localhost?
完整路径见 OCI SSH 与端口连通性排查。
Related notes
- 所属 MOC:甲骨文云服务器 MOC
- IPv6:为 OCI 计算实例启用 IPv6
- 主机防火墙:UFW
- SSH:SSH