如何使用端口转发通过 netsh 连接到 Oracle 数据库?

How do I use port forwarding to connect to an Oracle database using netsh?

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

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

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

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

但是,我 运行 遇到了问题。我什至无法使用转发端口从机器 B 连接到 Oracle 数据库。我有使用 ssh 隧道做同样事情的经验。在这种情况下,我没有使用 ssh,我不明白为什么这不起作用。 以下是我正在经历的过程: 登录机器 B - 安装了 Oracle 客户端。 SQL 开发者已安装。 打开 SQL 开发人员 - Select 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.Note,我使用 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 侦听器?

在我机器的 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

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

  • 已安装 Wireshark。
  • 开始记录数据包。
  • 已使用 SQL 开发人员连接 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 ........ ..........................

  • 现在,返回数据包并找出 "real" 地址是什么。这是一个例子: 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 开发人员基本连接类型登录时,您可以使用本地主机而不是 VIP,您应该可以连接。
  • 现在,转到另一台可以访问您刚刚设置的机器的机器,您应该能够从那里连接到数据库,并使用您设置了端口转发的机器的 IP。