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

Java 如何使用端口转发使用netsh连接到Oracle数据库?,java,oracle,portforwarding,Java,Oracle,Portforwarding,我有一台机器(a),可以访问运行Oracle侦听器的主机。我可以使用SQL Developer很好地连接到它 我还有另一台机器(B),我也想连接到同一个数据库,但它不能直接访问运行侦听器的主机。但是,它确实可以访问机器(A) 我想将机器a上的一个端口转发到Oracle侦听器主机,该主机正在侦听端口1521 然后我应该能够建立从机器B到机器a的数据库连接,然后将端口转发到具有Oracle侦听器的主机。中间有个男人。 然而,我遇到了一些问题。我甚至无法使用转发端口从机器B连接到Oracle数据库。我

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

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

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

然后我应该能够建立从机器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,它就能够建立连接。 作为一个简单的测试,我确保可以使用SQLDeveloper在机器B上连接。但这次,我将连接类型设置为advanced,以便输入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:侦听器找不到具有匹配协议堆栈的可用处理程序”而失败

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


是否知道我可能缺少什么,或者其他人是否成功地将端口转发到Oracle侦听器?

在我的机器上的SQL developer中,相同的转发连接在基本连接和高级连接中都可以正常工作

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

台阶

1) 您必须在机器A中设置转发,并使用ip地址作为侦听地址

2) 使用TNS中的机器A IP地址连接到机器B中的数据库

如果仍然存在问题,那么您可以尝试启用日志和跟踪文件,以识别本文中提到的问题


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

  • 安装了Wireshark
  • 开始记录数据包
  • 使用SQL Developer连接VIP-成功
  • 在Wireshark中,查找包含连接独特信息的TCP流。在本例中,是Oracle服务名称。你应该看到VIP的IP。比如: (描述=(地址=(协议=TCP)(主机=11.3.68.171)(端口=1521))(连接数据=(CID=(程序=SQL开发人员)(主机=jdbc)(用户=adpc))(服务名称=svc1)(CID=(程序=SQL开发人员)(主机=jdbc)(用户=adpc))。,.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

  • 现在,回到数据包,找出“真实”地址是什么。以下是一个例子:
  • 现在用这个来转发端口。 netsh接口端口代理添加v4tov4 listenport=1521连接地址=11.3.68.135连接端口=1521协议=tcp
  • 现在,当您使用SQL Developer基本连接类型登录时,您可以使用localhost而不是VIP,您应该能够连接
  • 现在,转到另一台可以访问您刚刚设置的机器的机器,您应该能够从那里连接到数据库,并使用具有端口转发设置的机器的IP

Mat be这篇关于端口转发的文章可能会帮助您进行转发,因为我可以从本地主机远程登录到1521。我没有使用ssh。流量没有加密。我认为它是Oracle listener特有的。谢谢你的帮助。很高兴听到其他人说我所尝试的是可能的,我的方法并没有完全错误。经过多次尝试,我发现我的问题是由于我用于Oracle数据库的ip造成的。这似乎是一个VIP,这使转发过程变得混乱。我将发布一个答案并详细解释。