SSH隧道连Oracle本质是端口转发:通过ssh -L将本地端口(如15210)映射至内网Oracle的1521端口,客户端直连localhost:15210即可,无需登录跳板机;跳板机需能直连Oracle,本地只需SSH可达;配置时HOST填127.0.0.1、PORT填本地映射端口,tnsnames.ora等不需改Oracle侧配置。
SSH隧道连Oracle,本质是端口转发,不是“跳板登录”
很多人误以为要先 ssh 登录跳板机、再从它里面连 oracle——其实完全不需要。真正起作用的是 ssh -l 建立的本地端口映射:把本机某个端口(比如 15210)悄悄“转接”到内网 oracle 实例的 1521 端口上。之后所有数据库客户端(pl/sql、dbeaver、python)都只连 localhost:15210,流量自动经跳板机中转,oracle 甚至感知不到你在外网。
- 跳板机必须能直连 Oracle 服务器(即
telnet oracle-ip 1521通),且防火墙放行 - 本地机器只需能 SSH 连上跳板机(
ssh -p 22 user@jump-host成功即可) - Oracle 监听器
listener.ora不需要改;但sqlnet.ora中若启用了tcp.validnode_checking=yes,得把跳板机 IP 加进tcp.invited_nodes - 别用
-Nf后台运行就不管了——断开后隧道失效,客户端会报ORA-12541: TNS:no listener
命令行建隧道:用 ssh -L,别碰 ProxyJump
ProxyJump 是用来“SSH 跳转登录远程主机”的,和数据库连接无关。连 Oracle 只需最朴素的端口转发:ssh -L。它轻量、稳定、全平台支持(包括 Windows 的 OpenSSH 和 WSL)。
- 基础命令:
ssh -L 15210:192.168.10.5:1521 user@jump-server.dealiaxy.com -p 22 -
15210是你本地空闲端口(避开 1521、3306 等常用端口) -
192.168.10.5是 Oracle 数据库真实内网 IP(不是跳板机 IP!) - 加
-C压缩传输(尤其跨公网时)、-g允许其他设备通过本机访问该端口(如手机调试用) - Windows 上若用 PuTTY,对应设置在 Connection → SSH → Tunnels,Source port 填
15210,Destination 填192.168.10.5:1521,选 Local + Auto
PL/SQL Developer 或 DBeaver 怎么填连接参数?
填的是“映射后的本地地址”,不是跳板机或 Oracle 真实地址。tnsnames.ora 或 GUI 表单里,HOST 写 127.0.0.1,PORT 写你本地映射端口(如 15210),SERVICE_NAME 和用户名密码照旧。
- PL/SQL:Database 字段填
127.0.0.1:15210/ORCL(或你实际的服务名) - DBeaver:新建 Oracle 连接 → Host=
127.0.0.1, Port=15210, Database=ORCL;驱动类保持oracle.jdbc.OracleDriver - 如果提示
ORA-12537: TNS:connection closed,大概率是隧道进程已退出,重跑ssh -L即可 - 别在 DBeaver 里勾选“Use SSH tunnel”——那是给它自己建隧道用的,和你手动建的冲突
Python 用 sshtunnel 自动化,关键在 remote_bind_address
脚本里不能写死跳板机密码(尤其上线环境),要用密钥认证;且 remote_bind_address 必须是 Oracle 服务器的内网地址+端口,不是跳板机地址。
- 示例关键段:
with SSHTunnelForwarder( ('jump-server.dealiaxy.com', 22), ssh_username='user', ssh_pkey='/home/user/.ssh/id_rsa', # 推荐用密钥,不用密码 remote_bind_address=('192.168.10.5', 1521), # 注意:这里是 Oracle 内网地址! local_bind_address=('127.0.0.1', 38399) ) as server: conn = cx_Oracle.connect('user/pass@localhost:38399/ORCL') - 如果 Oracle 开了加密(
SQLNET.ENCRYPTION=REQUIRED),客户端也得配对应 wallet 或 sqlnet.ora,否则连上也握手失败 - 别漏掉
server.start()(SSHTunnelForwarder上下文管理器已隐式处理,但手动实例需显式调) - 隧道建立耗时约 1–2 秒,高频短连接场景(如 Web API)建议复用隧道对象,而非每次新建
隧道本身不加密 Oracle 流量,它只负责“搬数据”。Oracle 层面的加密、认证、审计,还得靠 sqlnet.ora 配置和数据库 PROFILE 策略来兜底——这点最容易被忽略。










