如何使用端口转发通过 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中的数据库
如果您仍然遇到问题,那么您可以尝试启用日志和跟踪文件来确定这些文章中提到的问题
感谢 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。
我有一台机器 (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中的数据库
如果您仍然遇到问题,那么您可以尝试启用日志和跟踪文件来确定这些文章中提到的问题
感谢 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。