只开防火墙1521端口大概率连不上,必须同步配置listener.ora中HOST为真实IP或可解析主机名、启用Windows注册表USE_SHARED_SOCKET=true并重启Oracle实例,且Linux需兼顾iptables与SELinux放行。

直接说结论:只开防火墙1521端口,大概率连不上。真正要动的不只是防火墙,还有监听配置、主机名解析、甚至注册表(Windows)或共享套接字设置。
Windows 防火墙必须放行 1521 端口,但仅此不够
很多用户做完这一步就以为万事大吉,结果 telnet server_ip 1521 仍失败。常见原因包括:
- 规则没勾选“公用”网络——局域网多数属于“专用”或“公用”,漏选会导致同事电脑无法连接
- 规则绑定错网卡——多网卡环境(如虚拟网卡、WiFi+有线)下,规则默认作用于所有接口,但有时需确认是否匹配实际通信网段
- 规则未启用——新建后要检查状态列是否为“启用”,否则形同虚设
- 第三方安全软件拦截——Windows Defender 防火墙开了,但 360、火绒等可能单独拦截
tnslsnr.exe
验证方式不是只看 netstat -an | findstr :1521,而要从另一台机器执行:telnet your_server_ip 1521。如果通了,说明防火墙和基础网络没问题;不通,则问题在监听层或网络层。
listener.ora 中的 HOST 必须是可路由地址,不能写 localhost
这是 Windows 上最常踩的坑。Oracle 默认生成的 listener.ora 常含:
HOST = localhost
这会让监听只绑定到 127.0.0.1,导致外部机器无法访问。正确做法是:
- 用本机真实 IP(如
192.168.1.100)替换localhost - 或用机器名(确保其他机器能通过 DNS 或 hosts 解析该名)
- 避免使用
0.0.0.0(Oracle 不支持通配符绑定)
改完后必须重启监听:lsnrctl stop → lsnrctl start。只 reload 不生效。
Windows 必须设置 USE_SHARED_SOCKET=true(尤其 Oracle 11g/12c)
即使 1521 端口通了,连接仍可能超时(ORA-12170),因为 Oracle 默认用“专用服务器模式”,监听器接受连接后会 fork 新进程并分配随机端口——这个端口被防火墙拦住。
解决方法是启用共享套接字:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0(若装多个 Oracle,需对每个HOME<i>x</i>都设) - 新建字符串值:
USE_SHARED_SOCKET,值设为true -
必须重启整个 Oracle 实例(不只是 listener),否则无效:先
sqlplus / as sysdba执行shutdown immediate,再startup
不设这个,哪怕防火墙全开、listener 绑定正确,局域网内连接依然不稳定或间歇性失败。
Linux 下开放 1521 要注意 iptables 和 SELinux 双重拦截
Linux 用户容易忽略 SELinux,默认策略禁止 httpd、java 进程主动连接数据库端口。现象是应用报 ORA-12547: TNS:lost contact,但 telnet server_ip 1521 是通的。
排查顺序应是:
- 确认
iptables已加规则:-A INPUT -p tcp -m state --state NEW -m tcp --dport 1521 -j ACCEPT - 检查 SELinux 状态:
sestatus,若为enforcing,临时关闭测试:setenforce 0 - 若确认是 SELinux 导致,永久放行:
semanage port -a -t oracle_port_t -p tcp 1521 - 别忘了
firewalld(CentOS 7+/RHEL 8+):用firewall-cmd --permanent --add-port=1521/tcp后 reload
复杂点在于:Windows 上问题集中在监听绑定和共享套接字;Linux 上则常卡在 SELinux 或 firewalld 的隐式限制,而这些错误不会直接提示“端口被拒”。


















