ssh隧道和oracle

ssh隧道和oracle

在 oracle 服务器上我可以清晰地连接

sqlplus  user/pass@hostremote/SID

如果我造一条隧道

ssh -L 1521:localhost:1521 -F -n hostremote -vvv

给我吗

debug1: Connection to port 1521 forwarding to localhost port 1521 requested.
debug2: fd 7 setting TCP_NODELAY
debug2: fd 7 setting O_NONBLOCK
debug3: fd 7 is O_NONBLOCK
debug1: channel 2: new [direct-tcpip]
channel 2: open failed: connect failed: Connection refused
debug2: channel 2: zombie
debug2: channel 2: garbage collecting
debug1: channel 2: free: direct-tcpip: listening port 1521 for localhost port 1521, connect from 127.0.0.1 port 60882 to 127.0.0.1 port 1521, nchannels 3
debug3: channel 2: status: The following connections are open:

ERROR:
ORA-12537: TNS: connection close

为什么?

通常我会在直接连接的服务器上使用 ssh 隧道,例如

ORACLESERVER=192.168.0.15
CLIENT=192.168.0.4

在客户端上,我建立隧道并与本地主机上的 sqlplus 连接,很简单。

现在的情况有点不同而且更加复杂

PSHYSICAL SERVER=192.168.0.44
VIRTUALMACHINE WITH NAT=192.168.0.45 eth0 10.3.1.1 eth1
ORACLESERVER=virtual machine 10.3.1.4

我已经在虚拟机上做了 DNAT,我可以使用 telnet 1521 虚拟机和 tcptraceroute 1521 返回成功连接。但是在隧道(成功)之后我出现 TNS 错误并且没有连接。

这是带有firewalld的dnat make

 forward-ports: port=1521:proto=tcp:toport=1521:toaddr=10.3.1.4
    port=1521:proto=udp:toport=1521:toaddr=10.3.1.4

答案1

问题是 Oracle 在初始连接后打开了额外的连接,而不是端口 1521,因此您的隧道将无法以这种方式工作。在服务器端设置 Oracle Connection Manager,以便您可以与它进行所有对话,并让它在服务器网络内建立多个连接。

Oracle 文档(非公开):https://support.oracle.com/rs?type=doc&id=Note:361284.1 打开,嗯,镜子:http://blog.itpub.net/161195/viewspace-1053131/

答案2

  • Oracle TCP 协议不是有线的。在某些情况下,它的行为与 FTP 类似。 ei 它可能会在动态分配的端口上打开额外的 TCP 连接。

  • Oracle TCP 协议在 TCP 标头中使用 OOB 位。当将 TCP 封装成 TCP 时,这有时可能会导致问题。

您很可能对第一点有疑问。使用strace/tcpdump查明是否sqlplus正在尝试打开第二个连接。

相关内容