为什么安全列表配置了,端口还是不通?
很多刚接触 Oracle Cloud (OCI) 的用户都会遇到这个问题:明明在控制台的安全列表(Security List)中放行了端口,但通过 curl 或浏览器访问时,端口始终无法连通。
这篇文章会详细解释问题的根源,并提供完整的解决方案。
问题根源:Oracle Cloud 的“双层防火墙”
与阿里云、腾讯云等平台不同,Oracle Cloud 的流量要进入实例,必须通过两道独立的防火墙:
第一层配置了,第二层没放行 —— 这就是端口不通的根本原因。
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 FORWARD2. 确认已清空
sudo iptables -L -n3. 保存规则(防止重启后恢复)
sudo apt update
sudo apt install iptables-persistent -y
sudo netfilter-persistent saveOracle Linux / CentOS / Rocky Linux 系统:
bash
1. 清空规则
sudo iptables -P INPUT ACCEPT
sudo iptables -F INPUT
sudo iptables -F FORWARD2. 确认已清空
sudo iptables -L -n3. 保存规则(防止重启后恢复)
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 # 检查 firewalldQ3:OCI 控制台的安全列表和安全组有什么区别?
A:安全列表(Security List)作用于整个子网(Subnet),网络安全组(NSG)作用于特定的 VNIC。如果实例同时绑定了两者,需要分别在两者中放行端口。
Q4:80 和 443 端口在部分区域被屏蔽怎么办?
A:如果确认防火墙和安全列表都已放行,但 80/443 仍然不通,可能是 OCI 在某些区域(如巴西圣保罗)对免费账户做了限制。建议更换端口(如 8443、2053)或更换区域。
总结
只要搞清楚了 OCI “两层防火墙”的设计,端口不通的问题就很容易定位和解决了。如果已经配置了安全列表但仍然不通,90% 以上的情况是实例内部的 iptables 规则在拦截。