Oracle云数据库必须绑定内网IP并关闭公网监听,安全组最小化放行1521端口,同步配置系统防火墙与tnsnames.ora,确保local_listener注册正确。
oracle 数据库在云服务器上默认不监听公网 ip,哪怕你绑了弹性公网 ip,lsnrctl status 显示的仍是 127.0.0.1 或主机名解析出的内网地址——这不是配置失败,是 oracle 主动拒绝公网暴露。安全部署的核心不是“怎么连上”,而是“怎么只让该连的人连上”。内网绑定 + 安全组最小化放行,才是生产级做法。
listener.ora 必须显式绑定内网 IP,不能留空或写 0.0.0.0
Oracle 监听器默认行为极其保守:HOST 字段为空、写 localhost 或 127.0.0.1 都会导致它只响应本地连接。即使你改了网卡配置,监听器也不会自动适配。
- 打开
$ORACLE_HOME/network/admin/listener.ora,找到LISTENER的ADDRESS段 - 把
(HOST = localhost)改成具体内网 IP,例如(HOST = 10.0.1.5)(必须是你云主机实际分配的 VPC 内网地址) - 不要用
(HOST = 0.0.0.0):这等于主动暴露给所有网络接口,绕过安全组第一道防线 - 改完执行
lsnrctl reload(不是stop/start),避免中断已有会话 - 用
netstat -tlnp | grep :1521确认监听套接字绑定的是10.0.1.5:1521,而非*:1521或127.0.0.1:1521
安全组规则必须关闭 1521 入方向,除非确需公网访问
云厂商的安全组是网络层的第一道闸门。只要入方向没开 1521,哪怕监听器绑了 0.0.0.0,外部也根本连不到端口。但很多人误以为“开了安全组就万事大吉”,忽略了操作系统防火墙和监听绑定逻辑。
- 在控制台进入对应安全组 → 入方向规则 → 删除所有含
1521的条目(包括0.0.0.0/0) - 如果应用服务器和 Oracle 在同一 VPC,且分属不同安全组,可添加一条精准规则:
协议:TCP,端口:1521,源地址:填应用服务器所在安全组 ID(不是 IP 段)——这是最细粒度的授权方式 - 绝对不要用
0.0.0.0/0开放 1521:ORA-12545 类错误 70% 来自监听未注册或 SERVICE_NAME 不匹配,而非网络不通;盲目放开只会放大配置错误的风险面 - 检查出方向是否保留默认放通(
0.0.0.0/0),否则数据库可能无法解析 DNS 或连接远程归档目标
tnsnames.ora 中的 HOST 必须填内网 IP,且与 listener.ora 严格一致
客户端连接串里的 HOST 值,本质是告诉 Oracle 客户端“去哪个 IP 找监听器”。填错会导致 tnsping 成功但 sqlplus 报 ORA-12170(TNS:Connect timeout)。
- 若客户端是同 VPC 内另一台云主机,
tnsnames.ora中的(HOST = )必须填数据库实例的内网 IP(如10.0.1.5),和listener.ora中的一致 - 不要填公网 IP 或域名:VPC 内走内网路由,延迟更低、不计费、绕过安全组限制
- 确认
SERVICE_NAME(非SID)与数据库实际服务名一致:SELECT value FROM v$parameter WHERE name = 'service_names'; - 测试用
tnsping ORCL(别直接sqlplus):它只验证 TNS 解析和监听可达性,能快速区分是配置问题还是认证问题
系统防火墙(iptables/ufw)必须同步关闭或放行 1521
安全组只是云平台层的策略,Linux 实例自带的防火墙(尤其是 OCI 默认启用的 iptables)会二次拦截。很多“安全组已开却 telnet 超时”的 case,根因都在这里。
- Ubuntu 上运行
sudo iptables -L -n | grep 1521,若无输出,说明被 DROP;运行sudo ufw status查看是否 active(OCI 镜像常默认 inactive) - CentOS/RHEL:用
sudo firewall-cmd --list-ports确认 1521 是否在列表中,没出现就加sudo firewall-cmd --permanent --add-port=1521/tcp再 reload - OCI 实例重点注意:
iptables是默认启用的,ufw往往是 inactive。别只关 ufw 就以为搞定了 - 临时放行命令(重启失效):
sudo iptables -I INPUT -p tcp --dport 1521 -j ACCEPT;要持久化,需配合iptables-persistent保存
最容易被忽略的是监听器注册状态:哪怕 listener.ora 和 tnsnames.ora 全对,如果数据库实例没向监听器注册(比如 local_listener 参数未设或设错),lsnrctl status 就看不到服务名,sqlplus 仍会报 ORA-12514。检查 SELECT * FROM v$listener_network; 和 SHOW PARAMETER local_listener 才算闭环。


















