8

您好,我在通过隧道从我们的数据中心访问 Oracle DB 时遇到问题。

我们有一个非常标准的数据中心,其中一台机器可以从外部访问(我将它的 IP 作为 dc 放在 /etc/hosts 文件中)和内部的 Oracle DB。我们oracle数据库的内网IP地址是192.168.1.7

要创建隧道,我使用以下命令:

 ssh -L 1521:192.168.1.7:1521 root@dc

当然它可以工作(有时我还会添加一些 debug -vv 以查看是否有任何东西通过)。

现在是困难的部分 - 连接到 Oracle。我安装了即时客户端 11.2。我的 tnsnames.ora 看起来像这样:

testdb =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = dbname)
    )
  )

当我尝试使用以下命令进行连接时:

./sqlplus username/pass@testdb

它开始通过隧道连接(我在 ssh 调试中看到它),但随后它无法告诉:

./sqlplus username/pass@testdb

SQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 13 20:46:07 2010

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:
ORA-12541: TNS:no listener


Enter user-name: 

当我在 Intranet 上尝试执行相同的命令时,它可以工作(显然唯一的区别是在 tnsnames.ora HOST 中我们有 192.168.1.7 而不是 localhost)。

我还尝试使用简单的命令行:

./sqlplus username/pass@//localhost:1521/testdb

或者

./sqlplus username/pass@//localhost:1521/testdb

但没有任何帮助:)

我将不胜感激任何帮助或建议。我是否缺少一些 ssh 标志以使其成为可能?

可能是日志文件:

***********************************************************************

Fatal NI connect error 12541, connecting to:
 (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DBNAME)(CID=(PROGRAM=sqlplus@velvet)(HOST=velvet)(USER=johndoe))))

  VERSION INFORMATION:
    TNS for Linux: Version 11.2.0.1.0 - Production
    TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production
  Time: 13-JAN-2010 20:48:42
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12541

TNS-12541: Message 12541 not found; No message file for product=network, facility=TNS
    ns secondary err code: 12560
    nt main err code: 511

TNS-00511: Message 511 not found; No message file for product=network, facility=TNS
    nt secondary err code: 111
    nt OS err code: 0

其中 velvet 是我的本地主机名,johndoe 是我的本地用户名。为什么会发送到对方?

更新:

在从数据中心内部进行了更多调查之后,它看起来像:-第一个连接将转到端口 1521-但随后 sqlplus 被重定向到端口号 > 3300,每次都不同并递增 3(至少几次尝试我有) - 当我们试图通过隧道连接时,sqlplus 将尝试连接到 localhost,它显然会失败

所以错误“No Listener”可能来自我们没有重定向这些端口的事实。有什么方法(可能是 tnsnames.ora 文件中的某个选项)强制使用某些特定端口?

4

7 回答 7

3

通常这应该工作。我不会使用默认侦听器端口作为 ssh 隧道的条目,但这应该不是问题。我也不会使用 root 帐户来创建 ssh 连接,最好是专用的常规帐户。您是在使用共享服务器还是数据库恰好是具有负载平衡配置的 RAC 数据库?一个很好的解释在这里如何通过 ssh 隧道链(双隧道,公司网络中的服务器)连接到 ORACLE DB?,有点复杂......

更新 结帐DbVisualizer,它现在已经集成了 ssh 隧道。我认为至少值得一试。它不是免费的,但很好。多平台多数据库,非常灵活。

于 2011-04-12T20:22:13.187 回答
3

查看 Metalink ID 361284.1(编辑:实际上不公开,但在这里找到信息)

Oracle Connection Manager 似乎是您的选择。它基本上处理防火墙内的端口重定向。我以前没用过,所以不能再给你建议了。


更新:另一种方法是使用 MTS,为调度程序配置某些端口并在防火墙中打开这些端口。您不必为此安装额外的软件,但通过共享服务器连接可能需要增加 LARGE_POOL_SIZE 以及其他考虑因素。因此,您仍然需要 DBA 角色来更改 DISPATCHERS 参数。您还必须反弹数据库。

于 2011-06-05T22:25:38.253 回答
1

就我而言,问题是数据库服务器有多个 IP,当我使用 SSH 隧道时,它连接到错误的不同 IP。

因此,请尝试检查目标 IP 是否与 DB 服务器上 listener.ora 文件中的 IP 相同。

于 2020-04-09T08:24:36.637 回答
0

您能否尝试进行跟踪以确定正在发生的事情:

于 2011-06-04T13:35:06.293 回答
0

乔丹!您的隧道仅用于初始 tcp 连接,您自己的 LISTEN 端口没有隧道,并且可能未实现。防火墙应该允许连接回您,类似于活动 FTP。从“Building Internet Firewalls”2/E 第 23 章第 670 页开始,Oracle 的所有端口都得到了广泛的记录,段落:Oracle SQL*Net 和 Net8。您可以在SafariBooksOnline.com上查看它

国际标准书号 1565928718

于 2014-01-21T21:37:09.840 回答
-1

也许你的听众还没有开始。尝试运行“ lsnrctrl start ”命令。

于 2011-06-08T12:26:20.727 回答
-1

还有一个很好的解释是通过对我有用的 SSH 安全 shell 连接到 Oracle 数据库

  1. 打开 putty 并在会话页面上,输入服务器的名称并确保选中 SSH。服务器可以是您有用户名和密码登录的任何服务器。我在这里使用一种叫做 BLUEBIRD 的,因为我拥有它!

  2. 在 connection->ssh->tunnels 页面上,取消选中顶部的两个选项(“Local ports accept ...”和“Remote ports do the same”)。

  3. 输入 9999(或任何高于 1024 的端口作为源端口。

  4. 在目标中,根据 tnsnames 输入数据库主机和端口。就我而言,这是一个名为 GREENBIRD 的服务器和一个端口

  5. 将其输入为服务器:端口。

  6. 由于被转发的端口在您的桌面上,请选中“本地”选项。对于 IP 版本,还要选中“自动”。

  7. 单击添加按钮。您将在转发端口列表中看到 L9999 greenbird:1521(您会有所不同)。

  8. 再次进入会话页面,输入已保存会话的名称,然后单击保存。

  9. 点击打开。提供服务器的用户名和密码(在我的例子中是 BLUEBIRD)。您将登录到名为 BLUEBIRD 的服务器的正常 ssh 会话。

于 2013-06-29T18:29:37.327 回答