【问题标题】:How do I use port forwarding to connect to an Oracle database using netsh?如何使用端口转发通过 netsh 连接到 Oracle 数据库?
【发布时间】:2020-07-08 15:43:32
【问题描述】:

我有一台机器 (A) 可以访问运行 Oracle 侦听器的主机。我可以使用 SQL Developer 很好地连接到它。

我有另一台机器 (B),我也想连接到同一个数据库,但它不能直接访问运行侦听器的主机。但是,它确实可以访问机器 (A)。

我想将机器 A 上的一个端口转发到正在侦听端口 1521 的 Oracle 侦听器主机。

然后我应该能够建立从机器 B 到机器 A 的数据库连接,然后将端口转发到具有 Oracle 侦听器的主机。有点像中间人。

但是,我遇到了问题。我什至无法使用转发端口从机器 B 连接到 Oracle 数据库。我有使用 ssh 隧道做同样事情的经验。在这种情况下,我没有使用 ssh,我不明白为什么这不起作用。 以下是我正在经历的程序: 登录到机器 B - 安装了 Oracle 客户端。已安装 SQL Developer。 打开 SQL Developer - 选择 TNS 连接。输入凭据。连接成功 TNS 名称条目:

CRYSTAL=(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=yes)(FAILOVER=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=testhost.com)(PORT=1521)))(CONNECT_DATA=(service_name=svc1)))

现在设置转发:

C:\Windows\system32>netsh interface portproxy add v4tov4 listenaddress=127.0.0.1
 listenport=1521 connectaddress=testhost.com connectport=1521
protocol=tcp

如果我 telnet localhost 1521 ,它可以建立连接。 作为一个简单的测试,我确保我可以使用 SQL Developer 连接到机器 B。但是这一次,我将连接类型设置为高级,这样我就可以输入 jdbc url。注意,我使用 127.0.01 而不是 testhost.com,因为它将被转发到 testhost.com

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=yes)(FAILOVER=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(service_name=svc1)))

此连接失败并显示“ORA-12516, TNS: listener could not find available handler with matching protocol stack”

我检查了防火墙问题并确保端口 1521 已打开。

有什么我可能遗漏的想法,或者有其他人成功将端口转发到 Oracle 侦听器吗?

【问题讨论】:

  • 这篇关于端口转发的文章可能会对您有所帮助oracle-base.com/articles/linux/ssh-tunnel
  • 转发似乎正在工作,因为我能够从 localhost 远程登录到 1521。我没有使用 ssh。流量未加密。我认为它的 Oracle 监听器是特定的。

标签: java oracle portforwarding


【解决方案1】:

感谢 psaraj12 的评论,我知道我的方法应该可行。我遇到的问题是由于我被赋予连接到数据库的主机名。如果您按原样将其输入 SQL Developer,它就可以正常工作。但是,当我在端口转发中使用它时,我无法使用 SQL Developer 使用主机名 localhost 连接到数据库。给我的主机名名称中有“scan”。我认为这是一个虚拟IP。我们使用 Oracle RAC,它是一种集群技术。所以我怀疑 VIP 在集群上选择了一个节点,而转发器无法处理它。所以这就是我解决问题的方法:

  • 已安装 Wireshark。
  • 开始记录数据包。
  • 使用 SQL Developer 连接 VIP - 成功
  • 在 Wireshark 中,找到包含有关连接的独特内容的 TCP 流。在这种情况下,Oracle 服务名称。您应该看到 VIP 的 IP。就像是:

    ............6.,.A......O............:...... ..........(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=11.3.68.171)(PORT=1521))(CONNECT_DATA=(CID=(PROGRAM=SQL Developer)(HOST=jdbc)(USER=adpc))(SERVICE_NAME=svc1)(CID=(PROGRAM=SQL Developer)(HOST=jdbc)(USER=adpc)))).. .............6.,.A ....O........:........ .............(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=11.3.68.171)(PORT=1521))(CONNECT_DATA=(CID=(PROGRAM=SQL Developer)( HOST=jdbc)(USER=adpc))(SERVICE_NAME=svc1)(CID=(PROGRAM=SQL Developer)(HOST=jdbc)(USER=adpc))) )。 ..........6.A ........................................

  • 现在,回到数据包并找出“真实”地址是什么。这是一个例子: Wire shark packet information. This is the destination IP where Oracle listener is.
  • 现在使用它来转发端口。 netsh interface portproxy add v4tov4 listenport=1521 connect address=11.3.68.135 connectport=1521 protocol=tcp
  • 现在,当您使用 SQL Developer 基本连接类型登录时,您可以使用 localhost 而不是 VIP,您应该能够连接。
  • 现在,转到可以访问您刚刚设置的机器的另一台机器,您应该能够从那里连接到数据库,以及使用您设置了端口转发的机器的 IP。

【讨论】:

    【解决方案2】:

    相同的正向连接在我机器上的 SQL 开发人员的基本连接和高级连接中都可以正常工作。

    唯一的区别是机器A,B和数据库在我的情况下在同一个网络中,B也可以直接连接到数据库

    步骤

    1)你必须在机器A中设置转发,机器A的ip地址作为监听地址

    2) 使用TNS中的机器A ipaddress连接机器B中的数据库

    如果仍然遇到问题,那么您可以尝试启用日志和跟踪文件来识别这些文章中提到的问题

    Oracle Database 10g Debugging Connection problems 1

    Oracle Database 10g Debugging Connection problems 2

    【讨论】:

    • 感谢您的帮助。很高兴听到其他人说我试图做的事情是可能的,而且我的方法并没有完全错误。经过多次尝试,我发现我的问题是由于我用于 Oracle 数据库的 ip。它似乎是一个 VIP,这使转发过程感到困惑。我会发布一个答案并更详细地解释。
    猜你喜欢
    • 2021-08-24
    • 2022-08-11
    • 2018-07-01
    • 1970-01-01
    • 2013-10-21
    • 2018-06-20
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多