社交媒体

Oracle Cloud 防火墙问题排查指南

为什么安全列表配置了,端口还是不通?

很多刚接触 Oracle Cloud (OCI) 的用户都会遇到这个问题:明明在控制台的安全列表(Security List)中放行了端口,但通过 curl 或浏览器访问时,端口始终无法连通。

这篇文章会详细解释问题的根源,并提供完整的解决方案。

问题根源:Oracle Cloud 的“双层防火墙”

与阿里云、腾讯云等平台不同,Oracle Cloud 的流量要进入实例,必须通过两道独立的防火墙

层级

位置

管理方式

常见名称

第一层(外部)

云平台,实例外部

OCI 控制台

安全列表 / 网络安全组

第二层(内部)

实例操作系统内部

SSH 命令行

iptables / firewalld / ufw

第一层配置了,第二层没放行 —— 这就是端口不通的根本原因。

Oracle 官方提供的 Linux 镜像(特别是 Ubuntu)默认带有严格的 iptables 规则,除了 SSH(22 端口)外,默认拒绝所有其他端口的入站连接

检查是否被防火墙拦截

第一步:查看当前的 iptables 规则

bash

sudo iptables -L -n

典型被拦截的输出示例

text

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

解读:最后一条 REJECT 规则会拦截所有未被前面规则明确允许的流量。你新开的端口(如 80、443、30070 等)都会在这里被拦截。

解决方案

方案一:清空 iptables 规则(推荐)

既然已经在 OCI 控制台配置了安全列表,可以完全依赖云平台防火墙,清空实例内部的 iptables 规则。

Ubuntu / Debian 系统:

bash

1. 清空规则

sudo iptables -P INPUT ACCEPT
sudo iptables -F INPUT
sudo iptables -F FORWARD

2. 确认已清空

sudo iptables -L -n

3. 保存规则(防止重启后恢复)

sudo apt update
sudo apt install iptables-persistent -y
sudo netfilter-persistent save

Oracle Linux / CentOS / Rocky Linux 系统:

bash

1. 清空规则

sudo iptables -P INPUT ACCEPT
sudo iptables -F INPUT
sudo iptables -F FORWARD

2. 确认已清空

sudo iptables -L -n

3. 保存规则(防止重启后恢复)

sudo yum install iptables-services -y
sudo service iptables save

方案二:只放行特定端口(保留防火墙)

如果不想完全清空防火墙,可以在 REJECT 规则之前插入允许规则。

bash

在 INPUT 链的第 5 个位置插入规则(排在 REJECT 前面)

sudo iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -p tcp --dport 443 -j ACCEPT

保存规则(参考方案一的保存命令)

方案三:使用 firewalld 替代 iptables

bash

安装并启动 firewalld

sudo apt install firewalld -y # Ubuntu/Debian
sudo yum install firewalld -y # Oracle Linux/CentOS
sudo systemctl enable firewalld
sudo systemctl start firewalld

开放端口

sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

禁用 iptables 服务(防止冲突)

sudo systemctl stop iptables
sudo systemctl disable iptables

⚠️ 注意事项

1. OUTPUT 链中的 InstanceServices 规则不要删除

Oracle 官方镜像的 OUTPUT 链中包含一组 InstanceServices 规则,用于实例与 OCI 后端服务(元数据服务、块存储等)通信。这些规则必须保留,否则实例可能出现异常。

清空命令中只操作了 INPUT 和 FORWARD 链,没有动 OUTPUT 链,所以是安全的。

2. 临时清空 vs 永久清空

  • 只执行 iptables -F 是临时清空,重启实例或 iptables 服务后规则会恢复。

  • 执行 netfilter-persistent save 或 service iptables save 是永久保存,重启后仍保持清空状态。

3. 安全风险提示

清空 iptables 后,实例的端口访问权限完全依赖 OCI 控制台的安全列表(Security List)。请确保:

  • 安全列表中的规则符合你的安全要求。

  • 不必要时不要将端口暴露给 0.0.0.0/0(所有公网 IP)。

验证端口是否真的通了

清空防火墙并配置好安全列表后,可以通过以下方式验证:

方法一:使用 telnet(本地电脑)

bash

telnet 你的实例公网IP 端口号

方法二:使用 curl(本地电脑)

bash

curl -v http://你的实例公网IP:端口号

方法三:使用 nmap(本地电脑)

bash

nmap -p 端口号 你的实例公网IP

常见问题 FAQ

Q1:为什么我清空了 iptables,重启后规则又恢复了?

A:因为你没有执行保存命令。请参考上文方案一的保存步骤。

Q2:为什么我只在安全列表配了端口,还是不通?

A:检查是否还有 ufw 或 firewalld 在运行。

bash

sudo ufw status # 检查 ufw
sudo systemctl status firewalld # 检查 firewalld

Q3:OCI 控制台的安全列表和安全组有什么区别?

A:安全列表(Security List)作用于整个子网(Subnet),网络安全组(NSG)作用于特定的 VNIC。如果实例同时绑定了两者,需要分别在两者中放行端口。

Q4:80 和 443 端口在部分区域被屏蔽怎么办?

A:如果确认防火墙和安全列表都已放行,但 80/443 仍然不通,可能是 OCI 在某些区域(如巴西圣保罗)对免费账户做了限制。建议更换端口(如 8443、2053)或更换区域。

总结

步骤

操作

说明

1

OCI 控制台配置安全列表

添加目标端口的入站规则

2

检查 iptables 规则

sudo iptables -L -n

3

清空 iptables(推荐)

iptables -F INPUT + 保存

4

或放行特定端口

iptables -I INPUT 5 -p tcp --dport 端口 -j ACCEPT

5

验证端口可达性

telnet IP 端口

只要搞清楚了 OCI “两层防火墙”的设计,端口不通的问题就很容易定位和解决了。如果已经配置了安全列表但仍然不通,90% 以上的情况是实例内部的 iptables 规则在拦截