iptables 规则默认仅保存在内存中,重启即失效,需通过保存配置文件并启用恢复服务来实现永久生效,同时务必确认甲骨文云控制台的安全列表已放行对应端口。
先说结论:在甲骨文云实例内部配置 iptables 永久生效,本质是让 Linux 系统在启动时自动加载保存的规则文件,且必须优先排查云平台层面的网络 ACL 限制。
- 适合:需要在 Oracle Linux、Ubuntu 或 CentOS 实例上手动管理防火墙规则的技术人员。
- 先准备:确保拥有有效的 SSH 连接备份方案,防止规则错误导致无法远程登录;确认已安装 iptables 服务包。
- 验收:重启实例后检查规则是否自动加载,并从外部测试端口连通性。
命令速用版
如果你已确认规则无误,以下是基于常见 Linux 发行版的持久化命令参考。注意大部分命令需要 root 权限或 sudo。
Oracle Linux 7+ / CentOS 7+ 及传统 iptables 环境:
yum install iptables-services -y systemctl stop firewalld systemctl disable firewalld systemctl enable iptables service iptables save
Ubuntu / Debian 环境(需安装持久化模块):
apt-get update apt-get install iptables-persistent -y netfilter-persistent save
通用手动保存与恢复测试:
mkdir -p /etc/iptables iptables-save > /etc/iptables/rules.v4 iptables-restore < /etc/iptables/rules.v4
为什么会这样
iptables 是 Linux 内核 netfilter 框架的用户态管理工具,它运行的规则默认存储在易失性内存里。一旦实例重启或崩溃,内存清空,规则自然消失。要实现永久生效,必须将当前规则导出到磁盘文件,并配置系统服务在引导阶段执行导入操作。
另外,甲骨文云实例处于虚拟云网络(VCN)中,流量进入实例前会先经过云平台的安全列表(Security List)或网络安全组(NSG)。即使本地 iptables 放行,如果云平台层面的安全列表禁止了该端口,外部请求依然无法到达实例,这是很多用户配置失效的根本原因。
分步处理
1. 备份当前 SSH 会话与规则
在修改防火墙前,务必保持一个已连接的 SSH 窗口不要关闭,另开一个窗口进行操作。一旦新规则误删了 22 端口,保留的会话可作为急救通道。
sudo iptables-save > /root/iptables.backup.$(date +%F)
2. 确认操作系统防火墙类型
较新的 Oracle Linux 7/8/9 默认使用 firewalld 而非原生 iptables 服务。如果强制混用可能导致冲突。检查服务状态:
systemctl status firewalld systemctl status iptables
若需使用原生 iptables,建议先停止 firewalld 并安装 iptables-services(Oracle Linux 示例):
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo yum install iptables-services -y
3. 配置规则并保存
添加完所需规则后,执行保存命令。不同发行版保存路径略有差异,常见为 /etc/sysconfig/iptables 或 /etc/iptables/rules.v4。注意确保目录存在。
sudo service iptables save # 或手动保存(确保目录存在) sudo mkdir -p /etc/sysconfig sudo iptables-save > /etc/sysconfig/iptables
4. 启用开机自启服务
确保系统引导时调用恢复命令:
sudo systemctl enable iptables sudo systemctl start iptables
5. 检查甲骨文云控制台安全列表
登录甲骨文云控制台,进入实例详情页,点击子网链接,查看关联的安全列表。确保入站规则(Ingress Rules)中已添加允许对应协议和端口的条目,源 CIDR 通常设为 0.0.0.0/0 或特定 IP。
怎么验证是否生效
1. 本地规则检查
重启实例前,先查看当前规则列表确认无误:
sudo iptables -L -n -v
2. 重启验证
执行重启命令,待实例启动完成后重新 SSH 登录,再次运行 iptables -L -n -v,对比规则是否存在。
sudo reboot
3. 外部连通性测试
在本地电脑使用 telnet 或 nc 测试端口是否通:
nc -zv 实例公网 IP 端口号
如果本地规则存在但外部不通,大概率是控制台安全列表未放行。
常见坑
1. 云平台安全列表拦截
这是最高频的问题。本地 iptables 放行只是过了第二道门,第一道门(甲骨文云安全列表)没开,流量根本进不来。务必两边都检查。
2. firewalld 与 iptables 冲突
在 Oracle Linux 7 及以上版本,firewalld 是默认管理工具。如果同时启用 iptables 服务,两者可能争夺内核规则链,导致行为不可控。建议二选一,新手推荐使用 firewalld 或 ufw。若必须用 iptables,请先禁用 firewalld。
3. 默认策略设为 DROP 前未放行 SSH
如果在设置 INPUT DROP 默认策略前,没有先添加允许 22 端口的规则,保存重启后会直接锁定自己。操作顺序必须是:先允许 SSH,再设置默认拒绝,最后保存。
4. 规则文件路径与目录缺失
不同 Linux 发行版读取的规则文件路径不同。CentOS/Oracle Linux 通常读取 /etc/sysconfig/iptables,而 Debian/Ubuntu 的 iptables-persistent 通常读取 /etc/iptables/rules.v4。手动保存时,若 /etc/iptables 目录不存在,重定向保存会报错,需先执行 mkdir -p。
5. 服务未安装直接保存
新系统默认未安装 iptables-services 直接执行 save 会失败。务必先执行 yum install iptables-services -y 或 apt-get install iptables-persistent -y。