使用SSH隧道连接到Oracle自治数据仓库


为何需要SSH隧道

在我们开始介绍如何使用SSH隧道连接到Oracle自治数据仓库实例之前,我想更应该解释为什么我们必须这样做。 这是因为在某些情况下,用户的客户端机器位于公司内部网络中,出于安全考虑,通常这种网络不允许任何外部访问或仅打开非常有限的端口,例如SSH端口22。

在这种情况下(SSH端口22打开),如果用户需要访问ADW实例,尽管无法访问ADW的默认端口1522, 我们可以通过构建SSH隧道来建立连接。

准备工作

在这篇文章中,我假设您已经有一个名为“ADWDVD2”的ADW实例,并且您正在尝试从Oracle Data Visualization Desktop(DVD)建立与此实例的连接。 不幸的是,由于我上面提到的原因,您只能访问SSH端口22. 至少目前,我们用来连接ADW实例的端口固定为1522,这意味着在当前的网络环境下您无法直接访问ADW实例。

幸运的是SSH端口22仍然是打开的,我们可以通过构建SSH隧道来转发所有流量。要建立SSH隧道,我们需要满足3个先决条件。

  1. SSH端口22是开放的。这是本文的假设前提。
  2. 客户端机器上安装了SSH客户端。本文中我们使用Git Bash来安装SSH客户端。
  3. 有一台可以与目标服务正常通信的SSH服务器。假设我们已经在OCI(Oracle Cloud Infrastructure)中有一个计算实例作为SSH服务器。

注意:在这篇文章中,我们假设客户端是Oracle Data Visualization Desktop,但SSH隧道适用于任何面临此类网络问题的客户端。

安装SSH客户端

虽然Git Bash的开发是为了给Windows用户提供更加友好且一致的Git用户体验,但它同时也为我们带来了大部分*NIX工具,其中就包括SSH。

安装Git Bash非常简单,只需从官方网站下载安装包并安装即可。与您使用过的其他Windows应用程序的操作相同。一路Next即可完成典型安装。

安装Git Bash后,可以通过单击[开始]菜单中的[Git Bash]图标开始使用它。 然后bash终端将打开,您可以通过输入以下命令来检查bash和SSH客户端的版本。

$ bash --version
$ ssh -V

SSH服务器(OCI中的计算实例)

我们使用一台OCI中的计算实例作为SSH服务器,以从客户端接收流量并将所有流量转发到目标ADW实例。

以下是连接该SSH服务器的必要信息。

  • 公共IP,您可以从OCI Web控制台获取它
  • 可以使用SSH公钥身份验证方式访问此服务器的有效用户。 比如默认用户opc

通过SSH隧道连接到ADW实例

如果网络不受限制,我们应该看到什么

让我们先看看如果网络不受限制,我们应该看到什么. 自然是毫无问题地创建与ADW实例的连接。

在DVD中创建Connection

Select [Oracle Autonomous Data Warehouse Cloud]

输入必要的信息

[Client Credentials] 就是从ADW实例的Web控制台下载得到的认证文件(.zip)请参考下面屏幕截图.

[Username] 就是连接ADW实例的用户名. 在这里我们使用默认用户admin

[Service Name] 就是将要连接的ADW数据库服务. ADW实例中预置了3个数据库服务(high/medium/low), 请根据您的业务负载类型选择连接适当的数据库服务.

Connection 成功创建

这就是我们期待实现的动作.

只有SSH端口22开放该怎么办

出于测试目的,我们使用的安装了DVD的客户端机器是一台部署了Windows 2012 R2的OCI计算实例,它位于OCI的东京地区(Tokyo region)。而我们要连接的ADW实例部署在OCI的Ashburn地区(Ashburn Region)。

现在让我们修改安全列表的出站规则,如下所示,阻止除端口22之外的所有出站流量。

尝试再次在DVD中创建连接。 正如预期的那样,我们收到错误“Failed to save the connection”。

这并不奇怪,因为连接ADW实例的主机及端口信息是保存在认证文件(.zip)中的tnsnames.ora文件中的. 在这里指定了客户端连接ADW实例时所要使用的连接信息.

我们可以看到, 根据tnsnames.ora文件的信息, 客户端连接ADW实例时将会对hostadb.us-ashburn-1.oraclecloud.com的端口1522发出请求. 根据我们设定的出站规则(Engress Rules),只有到端口22的出站流量才会被通过。所以当我们尝试创建与ADW实例的连接时,客户端(DVD)根据tnsnames.ora文件中的连接信息向目标主机的1522端口发出请求时, 该请求将无法通过, 所以无法创建到ADW实例的连接.

创建SSH隧道

那...如何解决这个问题呢?也许您可以联系网络管理员并请求打开端口1522? 但这与公司的网络安全相关,这种网络级别的变化将影响同一网络中的多个用户。所以, 我猜想您的申请不会轻易获得批准。

根据我们的假定, SSH端口22是打开的, 这也就为我们使用SSH隧道提供了机会.
实际上,我们已经为构建SSH隧道准备好了一切,1) SSH客户端已经安装完毕, 2) SSH服务器我们也已创建, 现在我们只需要打开Git Bash终端并发出如下命令来启动它即可。

$ ssh -i path-to-the-private-key -N -L local-port:target-host:target-port user@SSH-server-IP

看上面的命令想必您仍然感到困惑,下面的图片解释了此命令中每个选项的含义, 或许可以帮助您加深理解.

下面是我执行的命令

  • adb.us-ashburn-1.oraclecloud.com:1522 的部分容易理解,就是目标主机和目标端口。我们希望所有流量都转发到目标主机上的端口(1522)。
  • opc@SSH-server-IP 部分是您要登录的SSH服务器。
  • 11522 这是什么? 根据上面的解释,它是the given port on the local (client) host is to be forwarded to the given host and port on the remote side。它是localhost上的一个端口。实际上,我们可以使用除保留端口之外的任何端口。 在这种情况下,我们使用端口号11522。

一旦我们执行此命令,您应该看到终端会挂在那里,您不能发出其他命令。这意味着SSH隧道已经构建成功,可以使用它了。您可以使用选项-f将隧道置于后台,但我认为如果将它置于前台,在关闭SSH隧道时会更容易。 你只需按下Ctrl + C或点击终端窗口上的X即可。

现在SSH隧道已准备好,在客户端机器中,到本地主机(127.0.0.1)端口11522的任何流量都将被发送到SSH服务器,然后服务器则将所有流量转发到目标主机上的目标端口。

通过SSH隧道创建连接

还记得客户端(DVD)参考的tnsnames.ora文件吗? 我们只需编辑它并使客户端将所有请求都发送到localhost的端口11522上,然后SSH隧道将会处理剩下的事情.

如下面的屏幕截图所示,将数据库服务adwdvd2_high中的hostport更新为127.0.0.111522

在DVD中创建连接并将服务名称指定为“adwdvd2_high”

Connection 成功创建

始终创建的Connection我们可以创建Data Set

尽管我们知道会失败,但我觉得测试一下失败案例会更加完整. 让我们尝试创建一个不使用SSH隧道的到数据库服务adwdvd2_low的连接。

根据上面的测试, SSH隧道非常有效。无论何时, 当您需要连接到ADW实例以创建报表时, 只需启动SSH隧道即可开启您的创作之旅.

清理工作

确实没什么好清理的, 您只需按下 Ctrl + C 来关闭SSH隧道即可. 或者您可以直接点击Git Bash窗口右上角的X就可以了.

参考资料

其他语言版本