引言:为什么需要理解 Oracle Cloud 防火墙
Oracle Cloud(OCI)以其慷慨的”永久免费”资源著称,尤其是 ARM 架构的 Ampere A1 实例,吸引了大量开发者与运维人员。然而,许多新手在创建完实例后发现 SSH 连不上、Web 服务无法访问、Ping 不通——这通常不是因为服务器宕机,而是 Oracle Cloud 的安全列表(Security List)和网络访问控制列表(NACL) 没有正确放行流量。
与 AWS、Azure 等云平台类似,Oracle Cloud 的网络安全策略分为两层:云防火墙层(安全列表 + 网络安全组 NSG)和 实例内部防火墙层(iptables / nftables / UFW / firewalld)。只有两层都正确放行,服务才能正常对外通信。本文将以 2026 年最新的 OCI 控制台界面为准,从零开始完整讲解 Oracle Cloud VPS 的防火墙配置。
一、Oracle Cloud 控制台导航:找到网络配置
首先登录 Oracle Cloud 控制台,进入你所在的区域(Region)。按照以下步骤找到实例关联的安全列表:
第 1 步:查看实例详情
在控制台左上角菜单中,选择 “计算” → “实例”,点击你要配置的实例名称进入详情页。在”资源”(Resources)选项卡下,找到 “附加的 VNIC”,点击主 VNIC 名称。
第 2 步:进入虚拟云网络
在 VNIC 详情页中,找到 “虚拟云网络”(Virtual Cloud Network,简称 VCN)链接并点击,进入该实例所在的 VCN 概览页面。
第 3 步:查看子网安全列表
在 VCN 页面左侧的”资源”菜单中,依次点击 “子网” → [你的子网名称] → “安全列表”。这里列出了该子网关联的所有安全列表(Security List),默认会有一个名为 Default Security List for [VCN 名称] 的规则集合。
第 4 步(可选):使用网络安全组(NSG)
除了安全列表,Oracle Cloud 还支持更灵活的 网络安全组(Network Security Group, NSG)。NSG 可以直接附加到 VNIC 上,无需修改整个子网的规则。在实例详情页的”资源”选项卡中,找到 “附加的 NSG” 进行管理。
提示: 2026 年的 OCI 控制台界面经过多次改版,但导航逻辑没有本质变化。如果找不到某个选项,可以用顶部的全局搜索框输入关键词快速跳转。
二、理解入站(Ingress)与出站(Egress)规则
安全列表的规则分为两大类:
入站规则(Ingress Rules)
入站规则控制 从外部进入 VCN 子网内实例 的流量。当你需要从本地电脑 SSH 登录服务器、让用户访问 Web 站点、或允许 API 调用时,都需要配置对应的入站规则。入站规则的要素包括:
- 源类型(Source Type): CIDR 块(如 0.0.0.0/0 表示所有来源)或动态组
- 源 CIDR: 允许的源 IP 地址范围
- IP 协议: TCP、UDP、ICMP 等
- 目标端口范围: 要放行的端口号
- 描述: 建议为每条规则添加说明,便于后期维护
出站规则(Egress Rules)
出站规则控制 从实例向外发起 的流量。默认情况下,Oracle Cloud 的安全列表会放行所有出站流量(目标 0.0.0.0/0,所有协议)。但如果你对安全性要求较高,可以限制为仅允许特定端口(如 80/443 用于更新包、53 用于 DNS 解析)。
三、有状态(Stateful)与无状态(Stateless)规则
这是新手最容易混淆的概念,也是排查网络问题时必须理解的关键。
有状态规则(Stateful,推荐)
当规则设置为 有状态 时,系统会自动允许该连接的响应流量返回,无需为响应流量单独配置出站规则。例如,你配置了一条有状态的入站规则允许 SSH(22/TCP),那么当服务器响应 SSH 连接时,返回的数据包会自动被放行。
- 优点: 规则数量少,配置简单
- 适用场景: 大多数常规服务(SSH、HTTP、HTTPS)
- 状态跟踪: 系统记录连接状态,只有已建立连接的返回流量才被允许
无状态规则(Stateless)
无状态规则 不会 跟踪连接状态。当你允许一个入站连接时,必须同时配置对应的出站规则 来放行响应流量。否则客户端能发请求过去,但收不到任何响应。
- 优点: 更严格的安全控制,适合高安全环境
- 缺点: 规则数量翻倍,配置复杂,容易遗漏导致连接异常
- 适用场景: 金融、政府等需要精细化流量审计的环境
经验建议: 对于绝大多数 Oracle Cloud 用户,全部使用有状态规则 即可。只有在遇到特定的合规要求时,才考虑使用无状态规则。
四、常见端口配置详解
以下是在 Oracle Cloud 安全列表中必须放行的常用端口:
SSH(端口 22/TCP)
所有 Linux 实例管理的基础。创建实例时如果选择了”生成 SSH 密钥对”,系统默认会在安全列表中放行 22 端口。但如果你创建实例时没有分配公网 IP,后来才申请,那么安全列表可能根本没有放行任何端口。此时的”修复”方法就是手动添加入站规则:
- 源类型: CIDR
- 源 CIDR: 0.0.0.0/0(或你办公网络的固定 IP)
- IP 协议: TCP
- 目标端口范围: 22
- 有状态: ✅ 勾选
HTTP(端口 80/TCP)与 HTTPS(端口 443/TCP)
部署 Web 服务(Nginx、Apache、Caddy 等)时必须放行:
- HTTP: 源 CIDR 0.0.0.0/0,端口 80,TCP,有状态
- HTTPS: 源 CIDR 0.0.0.0/0,端口 443,TCP,有状态
如果你使用了 Cloudflare 等 CDN 代理,建议将源 CIDR 限制为 Cloudflare 的 IP 范围,而不是完全开放。
ICMP(Ping)
Oracle Cloud 默认 关闭 ICMP,这意味着你无法从外部 Ping 通实例。如需开启,添加一条入站规则:
- IP 协议: ICMP(协议号 1)
- 类型和代码: 类型 8(Echo Request),代码 0
- 有状态: ✅ 勾选
其他常见端口
- MySQL/MariaDB(3306/TCP): 仅建议将源限制为应用服务器的内网 IP,切勿开放到 0.0.0.0/0
- Redis(6379/TCP): 同样建议限制在内网范围,并配合密码认证
- Docker/Traefik 管理面板(如 8080、8443): 如果不需要公网访问,最好只绑定到 127.0.0.1 或通过内网访问
- 自定义应用端口: 根据你的业务需求按需放行
五、实例内部防火墙:iptables 与 nftables 基础
即使 Oracle Cloud 的安全列表已经完全放行,实例内部的防火墙(Linux 内核 netfilter 框架)仍然可能拦截流量。理解内部防火墙的管理,是彻底解决连接问题的关键。
Linux 防火墙演进:从 iptables 到 nftables
传统的 iptables 是 Linux 2.4/2.6 时代的标准防火墙工具,基于四个表(filter、nat、mangle、raw)和五个链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)。而现代 Linux 发行版(RHEL 9、Ubuntu 22.04+、Debian 12+)已全面切换到 nftables,作为 iptables 的下一代替代方案。
nftables 使用 nft 命令进行管理,语法更简洁、性能更高、支持批量规则更新。兼容层 iptables-nft 可以让旧脚本继续工作,但底层实际调用的是 nftables 内核 API。
查看当前防火墙规则
# 查看 iptables 规则(如果系统仍然使用 iptables)
sudo iptables -L -n -v
# 查看 nftables 规则
sudo nft list ruleset
# 查看 firewalld 规则(CentOS/RHEL/Fedora)
sudo firewall-cmd --list-all
临时放行所有流量(故障排查用)
在排查网络问题时,可以先放行所有流量,逐步缩小问题范围:
# iptables 临时放行
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
# nftables 临时放行
sudo nft flush ruleset
iptables 常用规则示例
# 放行 SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 放行 HTTP/HTTPS
sudo iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
# 放行已建立的连接(保证返回流量通过)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 放行回环接口
sudo iptables -A INPUT -i lo -j ACCEPT
# 默认拒绝入站(最后添加)
sudo iptables -P INPUT DROP
nftables 常用规则示例(/etc/nftables.conf)
#!/usr/sbin/nft -f
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
iif lo accept
tcp dport {22, 80, 443} accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
六、UFW——Ubuntu 上最简单的防火墙管理工具
UFW(Uncomplicated Firewall)是 Ubuntu 系统上最受欢迎的 iptables 前端管理工具,以”简单”著称。对于不熟悉 iptables 命令的用户,UFW 是最佳选择。
安装与启用 UFW
# Ubuntu/Debian
sudo apt update && sudo apt install ufw -y
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 放行 SSH(务必先执行,否则你会把自己锁在外面!)
sudo ufw allow 22/tcp
# 放行 HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 启用 UFW
sudo ufw enable
# 查看状态
sudo ufw status verbose
UFW 进阶用法
# 允许特定 IP 的所有访问
sudo ufw allow from 203.0.113.5
# 允许特定 IP 访问特定端口
sudo ufw allow from 203.0.113.0/24 to any port 3306 proto tcp
# 允许速率限制(防止暴力破解)
sudo ufw limit 22/tcp
# 删除规则(按编号)
sudo ufw status numbered
sudo ufw delete 3
# 查看添加的规则日志
sudo tail -f /var/log/ufw.log
UFW 与 Oracle Cloud 防火墙的协同
正确的工作流是:
- 在 Oracle Cloud 安全列表中放行必要的端口(入站规则)
- 在实例内部用 UFW 做第二层精细化控制
- UFW 的默认策略设为
deny incoming,然后只放行需要暴露的服务 - 对于数据库、缓存等内部服务,UFW 可以限制仅允许内网 IP 或特定来源
不要为了省事而关闭或卸载内部防火墙——这会让你失去多层防护的安全优势。
七、CentOS/RHEL/Fedora:使用 firewalld
在 Red Hat 系发行版中,默认的防火墙管理工具是 firewalld(同样基于 nftables 后端):
# 查看状态
sudo systemctl status firewalld
# 放行服务
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 放行自定义端口
sudo firewall-cmd --permanent --add-port=8080/tcp
# 重新加载
sudo firewall-cmd --reload
# 查看已放行的所有规则
sudo firewall-cmd --list-all
八、连接故障排查实战
当你按照以上步骤配置后,如果仍然无法连接,请按以下顺序逐一排查:
1. 检查 Oracle Cloud 安全列表
进入 OCI 控制台 → 安全列表,确认入站规则已正确添加。常见错误包括:
- 端口写错(如把 22 写成 2222 但实际 SSH 运行在 22)
- 协议选错(TCP 规则下不会放行 UDP 流量)
- 安全列表没有关联到正确的子网
- 实例关联了多个 VNIC,却在错误的 VNIC 上配规则
2. 验证实例内部防火墙
# 查看是否有规则阻挡
sudo iptables -L INPUT -n --line-numbers
# 临时放行所有流量,如果能连通,说明是内部防火墙问题
sudo iptables -P INPUT ACCEPT
sudo iptables -F
# 检查服务是否正在监听
sudo ss -tlnp | grep -E '(22|80|443)'
# 输出示例:LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
# 如果服务只监听在 127.0.0.1 而不是 0.0.0.0,那就是服务配置问题
3. 使用 telnet 或 nc 测试端口
# 从外部机器测试
telnet <服务器公网IP> 22
nc -zv <服务器公网IP> 22
# 在服务器本机测试回环是否正常
telnet 127.0.0.1 22
nc -zv localhost 22
4. 检查路由与公网 IP
# 确认实例有公网 IP
curl -s ifconfig.me
# 或
ip addr show
# 检查默认路由
ip route show default
5. 查看系统日志
# UFW 日志(如果有启用)
sudo tail -f /var/log/ufw.log
# 内核日志中的防火墙丢弃记录
sudo dmesg | grep -i "DROP\|REJECT"
# 系统认证日志(SSH 失败原因)
sudo tail -f /var/log/auth.log
# 或
sudo journalctl -u sshd -f
6. 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| SSH 连接超时 | 安全列表未放行 22 端口,或内部防火墙阻挡 | 检查安全列表入站规则 + iptables/UFW |
| SSH 连接被拒绝 | SSH 服务未运行,或端口变更 | systemctl status sshd 检查服务状态 |
| HTTP 无法访问 | 安全列表或 UFW 未放行 80/443 | 添加入站规则 + UFW allow |
| Ping 不通 | 安全列表未放行 ICMP | 添加 ICMP 类型 8 的入站规则 |
| 可以 SSH 但无法访问 Web | Web 服务绑定在 127.0.0.1 | 修改服务配置绑定到 0.0.0.0 或内网 IP |
| 某些端口间歇性不通 | 无状态规则缺少对应出站规则 | 改为有状态规则,或添加匹配的出站规则 |
九、最佳实践总结
- 最小权限原则: 只放行必要的端口和来源,不要直接开放 0.0.0.0/0 的所有协议
- 双层防护: 云防火墙(安全列表/NSG)做粗粒度控制,实例内部防火墙(UFW/iptables)做细粒度控制
- 优先有状态: 非特殊需求一律使用有状态规则,减少配置遗漏的风险
- 限制管理端口来源: SSH 的源 CIDR 尽量限制为你办公网络的固定 IP,而非 0.0.0.0/0
- 定期审计: 每季度检查一次安全列表和内部防火墙规则,清理不再使用的放行规则
- 自动化配置: 使用 Terraform、Ansible 等基础设施即代码工具管理安全列表,避免手动配置出错
- 监控告警: 对关键端口(如 22、3306)的异常访问进行监控和告警
结语
Oracle Cloud VPS 的防火墙配置看似简单,实际涉及云平台网络策略和操作系统内部防火墙两个层面。无论是入站/出站规则的区分、有状态/无状态的选择,还是 iptables/nftables/UFW 的协同使用,每一个环节都值得认真对待。
回到最开始的场景——创建实例后 SSH 连不上——你现在应该已经知道:先去 OCI 控制台检查安全列表,确认端口已放行;然后在实例内部用 ufw status 或 iptables -L 确认内部防火墙没有拦截;最后用 ss -tlnp 确认服务确实在监听。有了这套方法论,任何网络连通问题都能迎刃而解。
如果你在配置过程中遇到其他问题,欢迎在评论区留言讨论。记得收藏本文,下次配置新实例时直接照着操作即可。