使用firewalld转发Oracle端口遇ORA-12569错误求解决
解决Firewalld端口转发与ORA-12569: TNS包校验和失败问题
看起来你在配置通过Firewalld转发端口访问Oracle时碰到了两个核心问题:转发规则方向搞反+格式错误,以及导致的ORA-12569校验和失败。我来一步步帮你排查修复:
一、先纠正Firewalld端口转发的核心错误
你的需求是通过服务器B的9800端口访问服务器A的1521端口,但当前的转发命令完全搞反了流量方向,还存在格式问题(toaddr= B里的空格是语法错误)。正确的逻辑是:在服务器B上,把到达本地9800端口的TCP流量转发到服务器A的1521端口。
正确的配置步骤:
- 先添加临时转发规则(立即生效,重启Firewalld后失效):
firewall-cmd --zone=public --add-forward-port=port=9800:proto=tcp:toaddr=<服务器A的实际IP>:toport=1521
⚠️ 把<服务器A的实际IP>替换成真实IP,不要留任何空格。
- 添加永久转发规则(重启Firewalld后依然生效):
firewall-cmd --permanent --zone=public --add-forward-port=port=9800:proto=tcp:toaddr=<服务器A的实际IP>:toport=1521
- 确保服务器B的9800端口允许外部访问(如果需要从其他机器访问B的9800):
firewall-cmd --add-port=9800/tcp firewall-cmd --permanent --add-port=9800/tcp
- 重新加载Firewalld使所有配置生效:
firewall-cmd --reload
- 验证转发规则是否正确加载:
firewall-cmd --list-forward-ports
输出应该显示类似 9800/tcp to <服务器A的IP>:1521 的规则。
二、解决ORA-12569: TNS包校验和失败错误
这个错误本质是Oracle客户端和服务器之间的网络包校验和不匹配,结合端口转发场景,主要从两个方向排查:
1. 调整Oracle的SQLNET.ORA校验和设置
端口转发过程中,防火墙可能会对数据包做微小修改,导致Oracle的校验和验证失败。
- 登录服务器A,找到Oracle安装目录下的
sqlnet.ora(通常在$ORACLE_HOME/network/admin),检查以下配置:
如果当前设置为SQLNET.CRYPTO_CHECKSUM_SERVER = ACCEPT SQLNET.CRYPTO_CHECKSUM_CLIENT = ACCEPTREQUIRED,请临时改为ACCEPT或者直接设置为OFF,然后重启Oracle监听服务:lsnrctl stop lsnrctl start - 同时检查执行
tnsping的客户端机器的sqlnet.ora,确保客户端和服务器的校验和设置一致,或者都设为ACCEPT/OFF。
2. 确保服务器B开启IP转发功能
端口转发依赖系统的IP转发功能,必须开启:
- 临时开启(立即生效,重启系统后失效):
echo 1 > /proc/sys/net/ipv4/ip_forward
- 永久开启(重启系统后依然生效):
编辑/etc/sysctl.conf文件,添加或修改:
net.ipv4.ip_forward = 1
然后执行命令生效:
sysctl -p
三、最后验证配置
完成上述步骤后,重新执行tnsping <你的新TNS名称>,应该能正常连通。如果还是有问题,可以做以下额外检查:
- 在服务器B上执行
telnet <服务器A的IP> 1521,确认B能直接访问A的1521端口; - 核对你的新TNS配置,确保指向的是服务器B的9800端口,示例如下:
NEW_ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = <服务器B的IP>)(PORT = 9800)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = <你的Oracle服务名>) ) )
内容的提问来源于stack exchange,提问作者Kalina
相关产品推荐
相关产品推荐

