ORA-12537 根因常为 iptables 拦截:需检查 INPUT 链是否明确放行 1521 端口(dpt:1521),无则用 -I 插入 ACCEPT 规则;停防火墙仅为排除手段,须先记录状态再测试;firewalld 与 iptables 共存会引发规则冲突,导致连接不稳定。
ora-12537 不是数据库认证失败,而是连接链路在建立前就被切断了——iptables 拦截是最常见却最容易被跳过的环节。
确认 Oracle 监听端口是否被 iptables 明确放行
Oracle 默认监听 1521 端口,但 iptables 默认策略常为 DROP,哪怕只漏掉一条规则,tnsping 或 sqlplus 就会直接返回 ORA-12537: TNS:connection closed,而不是更具体的超时或拒绝信息。
- 执行
sudo iptables -L -n -v,重点看INPUT链中是否有针对1521的ACCEPT规则(不是靠后缀“允许 Oracle”这种注释,要看实际dpt:1521) - 如果没有,用这条命令追加(假设只允许特定网段访问,更安全):
sudo iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 1521 -j ACCEPT - 切勿用
-A追加到末尾——如果前面已有REJECT或DROP规则,新规则不会生效 - 保存规则:
sudo service iptables save(CentOS 6)或sudo iptables-save > /etc/sysconfig/iptables
临时停用 iptables 测试是否真由它导致
很多运维习惯性“先关防火墙试试”,但要注意:这不是验证手段,而是排除手段。必须严格按顺序操作,否则会掩盖真实问题。
- 先记录当前状态:
sudo iptables -S(复制输出备用) - 停用:
sudo service iptables stop(CentOS 6)或sudo systemctl stop iptables - 立刻测试:
tnsping ORCL和sqlplus /@ORCL;若成功,说明 iptables 是根因 - 恢复前务必确认监听器仍在运行:
lsnrctl status,因为某些系统停防火墙会顺带 kill 掉监听进程
注意 firewalld 和 iptables 共存时的冲突
CentOS 7+ 默认用 firewalld,但旧脚本或手动安装可能残留 iptables 服务。两者同时启用会导致规则混乱,ORA-12537 表现不稳定——有时连得上,有时连不上。
- 检查是否双开:
sudo systemctl is-active iptables和sudo systemctl is-active firewalld - 若都为
active,必须停掉其中一个:sudo systemctl disable iptables && sudo systemctl stop iptables - 对
firewalld开放端口:sudo firewall-cmd --permanent --add-port=1521/tcp && sudo firewall-cmd --reload - 别信“
firewalld兼容iptables”——生产环境里它们打架时,ORA-12537就是唯一报错
真正麻烦的从来不是规则写错,而是规则写了但没生效、或者生效了却被另一层防火墙覆盖。每次改完 iptables,必须用 telnet <host> 1521</host> 或 nc -zv <host> 1521</host> 从客户端机器直连测试,绕过任何中间配置缓存。


















