如何通过 ssh 隧道链(双隧道,公司网络中的服务器)连接到 Oracle Database 11g 服务器?

Posted

技术标签:

【中文标题】如何通过 ssh 隧道链(双隧道,公司网络中的服务器)连接到 Oracle Database 11g 服务器?【英文标题】:How can I connect to Oracle Database 11g server through ssh tunnel chain (double tunnel, server in company network)? 【发布时间】:2011-04-08 21:38:47 【问题描述】:

我可以通过 SSH 访问“公共”服务器,这也是公司网络的网关。网络中有另一台服务器,local Oracle 数据库服务器正在运行(没有来自该服务器外部的访问,只接受 localhost DB 连接)。当然,我还有另一个 SSH 访问此服务器的权限。

有没有办法从网络外部加入这个 Oracle Database 11g 服务器? 我在问是否有类似 ssh 隧道链的东西,以及我如何配置它。 例如,这对于 TOAD for Oracle(ORACLE 客户端)很有用。

编辑:这是图片

谢谢

【问题讨论】:

【参考方案1】:

是的,这是可能的。例如。在 Linux 上,运行

ssh -N -Llocalport:dbserver:dbport yourname@connectionserver

在哪里

localport 是您机器上将被转发的端口(如果本地没有运行 oracle 实例,则可以是 1521) dbserver 是数据库服务器的名称或 IP dbport是数据库的端口(一般是1521) yourname 是连接服务器上的登录名 connectionserver 是您拥有 ssh 访问权限的机器

同样可以在 Windows 上使用 Plink(Putty 自带)完成:

plink -N -L localport:dbserver:dbport yourname@connectionserver

在两台机器(您的本地机器和您有权访问的服务器)上执行此操作以链接 ssh 隧道。示例:

连接服务器(假设 Linux):

ssh -N -L1521:dbserver:1521 dblogin@dbserver

你的电脑:

plink -N -L 1521:connectionserver:1521 connlogin@connectionserver

tnsnames.ora 条目必须看起来像您正在运行本地数据库,例如

prodoverssh =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = prod)
    )
  )

【讨论】:

我面临着非常相似的设置,但现在网关在“我这边”(在绿色圆圈中)。我还想通过隧道通信到 oracle 服务器。但是,我不能使用您的建议,因为我不是在管理“ORACLE SERVER”,而只是在原始问题中的网络架构上管理“GATEWAY”。我只能从“GATEWAY”与“ORACLE SERVER”机器(监听 1521)上的 Oracle 服务器通信,客户端安装在“GATEWAY”和“MY PC”上。有什么适合我的解决方案吗? j_maly:如果数据库服务器接受来自网关的连接,那就更容易了。只需在您的 PC 上运行 plink -N -L 1521:dbserver:1521 gwuser@gateway 感谢您的回复。我尝试了您的建议,但我得到 ORA-12170: TNS:Connect timeout occurred 错误。这就是我所做的:1)我在网关上设置了一个 ssh 服务器(并且我验证了我可以使用 putty 进行连接)2)我按照你的建议运行了命令(plink 要求在网关上输入密码,我输入密码,plink没有说别的——它应该输出某种“ok”消息吗?) 3)“dbserver”的 IP 只在“gateway”上被识别,而不是在我的本地 pc 上,我希望这不成问题。 4)我将 TNS 条目从网关复制到我的本地 PC(未更改) 很可能是 TNS 条目。在您的本地 PC 上,它必须指向 localhost,因为这是隧道的入口! 在这种链式隧道配置中,确保隧道中使用的地址是对应的,不要简单地属于同一台机器的不同接口。有关详细信息,请参阅superuser.com/a/346982/285945。【参考方案2】:

谢谢!

我给ssh -N -LXXXX:server:YYYY login@server打了两次电话。

首先,我打电话给

ssh -L 9998:127.0.0.1:9997 login@gate.company.cz

在我的电脑上。

然后,在这台服务器上(在 SSH 会话期间),我调用了

ssh -L 9997:localhost:1521 root@192.168.105.111

其中 192.168.105.111 是运行 ORACLE 的服务器。

所以我所做的是遵循重定向:

1521 (COMPANY ORACLE SERVER) 
  -> 9997 (COMPANY GATEWAY SERVER)
     -> 9998 (LOCAL PC)

所以我在本地 PC 的 9998 端口获得了 ORACLE 访问权限!

【讨论】:

【参考方案3】:

您也可以添加在后台运行 ssh 命令的 -f 选项。

【讨论】:

【参考方案4】:

我在 cmets 中遇到了与 @j_maly here 相同的问题,可以在“MY REMOTE PC”(linux) 中使用一条隧道连接到“GATEWAY”:

ssh -L 1521:DATABASE_URL_OR_IP:1521 USER@GATEWAY

但是在一次又一次地得到ORA-12170: TNS:Connect timeout occurred 之后。我已经这样做了:

在 GATEWAY 中,将一些东西连接到可以工作的 oracle,在我的情况下,sqldeveloper(sqlplus 也应该可以工作)。假设sqldeveloper中的oracle工作url是database.company.ex

在 GATEWAY 中运行 netstat -putan | grep 1521,问题如下: 我发现该连接具有其他数据库 IP 和域,而不是之前已知和假定连接的 (database.company.ex)。

所以你应该把netstat -putan | grep 1521结果中显示的ip或url放在“GATEWAY”中

ssh -L 1521:DATABASE_URL_OR_IP_SHOWED_IN_NETSTAT:1521 USER@GATEWAY

我不知道为什么会发生这种情况,但是我找到了几个 ip 连接到同一个数据库,并且我无法从其中一些连接,要解决问题,我们必须找到正确的 ip。

值得一提的是,您还可以更改本地端口(在本例中为 11000)并运行此命令而不输出 (-fN)

ssh -fN -L 11000:DATABASE:1521 USER@GATEWAY

【讨论】:

以上是关于如何通过 ssh 隧道链(双隧道,公司网络中的服务器)连接到 Oracle Database 11g 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

通过 JSch 建立 SSH 隧道

SSH隧道及其使用

将 ssh 隧道反向访问公司防火墙后面的系统的最佳方法是啥?

通过 ssh 迁移工作台 - 如何设置隧道

使用 Python Paramiko 通过双 SSH 隧道连接到数据库

SSH隧道应用, 突破网络限制