Spring 引导,使用 oracle-ldap url 通过本地计算机上的 ssh 隧道
Spring Boot, using oracle-ldap url through ssh tunnel on local machine
有 3 台机器:
local -> some remote server -> oracle db server (via ldap)
我想设置到 oracle 数据库的数据源连接(在我的 spring 启动应用程序中)。
本地机器和带有 oracle db 的机器之间没有直接连接。
所以,我正在通过远程服务器使用 ssh 隧道:
ssh -L 127.0.0.1:8081:some.ldap.host:389 用户@remote.server.host
在 application.yml 文件中,我正在进一步使用 url:
spring:
datasource:
url: jdbc:oracle:thin:@ldap://127.0.0.1:8081//srvcnm,cn=OracleContext,dc=yy,dc=xx,dc=com
当我的应用程序尝试获取数据库连接时,我收到以下错误:
Caused by: oracle.net.nt.TimeoutInterruptHandler$IOReadTimeoutException: Socket read timed out
at oracle.net.nt.TimeoutSocketChannel.handleInterrupt(TimeoutSocketChannel.java:254)
at oracle.net.nt.TimeoutSocketChannel.connect(TimeoutSocketChannel.java:103)
at oracle.net.nt.TimeoutSocketChannel.<init>(TimeoutSocketChannel.java:77)
at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:192)
... 126 common frames omitted
每当我在远程服务器上部署应用程序并在 application.yml 中输入“直接”url 时,正在获取连接而没有任何超时,应用程序运行良好。
jdbc:oracle:thin:@ldap://some.ldap.host:389//srvcnm,cn=OracleContext,dc=yy,dc=xx,dc=com
有人知道怎么处理吗?如何从本地机器获取连接?
我可能会做这样的事情,我将创建文件调用 ~/.ssh/config
然后添加以下内容
Host remoteserver1
User usermane
Hostname ip or host name
ForwardAgent yes
Host oracleserver
User username
Hostname some.ldap.host
Port 22
# ForwardAgent yes if you need to forward one more instance
LocalForward 8081 some.ldap.host:389
ProxyCommand ssh -q -W %h:%p remoteserver1
当我尝试从 remoteserver1 连接到 ssh oracleserver 时,它会连接到 hopper,然后代理 SSH 连接到那边的端口 22(即:Oracleserver 上的 SSH)。
现在要通过 ssh 连接,请执行以下操作 ssh oracleserver
,因为它将通过 remoteserver1 在您的机器和 oracleserver 之间建立 ssh 隧道。以及端口转发。
问题在于将源连接请求重定向到另一台具有 oracle db 本身的机器(在 ldap auth 之后)。
因此,请求的路径如下所示:
1.local -> 2.remote server -> 3.ldap server -> 4.oracle db server
1st 和 4th 机器之间没有连接,因为隧道只在 1th[=23] 之间=]和第三一个。
所以,如果您遇到这个问题,您可以再添加一个 ssh 隧道(第一个隧道用于 ldap 服务器,第二个用于 oracle db)并使用 oracle 服务器的路由丰富您的“etc/hosts”。
就我而言,问题在于访问限制。 oracle 服务器以某种方式过滤套接字并授予对某些机器的访问权限。
有 3 台机器:
local -> some remote server -> oracle db server (via ldap)
我想设置到 oracle 数据库的数据源连接(在我的 spring 启动应用程序中)。
本地机器和带有 oracle db 的机器之间没有直接连接。
所以,我正在通过远程服务器使用 ssh 隧道:
ssh -L 127.0.0.1:8081:some.ldap.host:389 用户@remote.server.host
在 application.yml 文件中,我正在进一步使用 url:
spring:
datasource:
url: jdbc:oracle:thin:@ldap://127.0.0.1:8081//srvcnm,cn=OracleContext,dc=yy,dc=xx,dc=com
当我的应用程序尝试获取数据库连接时,我收到以下错误:
Caused by: oracle.net.nt.TimeoutInterruptHandler$IOReadTimeoutException: Socket read timed out
at oracle.net.nt.TimeoutSocketChannel.handleInterrupt(TimeoutSocketChannel.java:254)
at oracle.net.nt.TimeoutSocketChannel.connect(TimeoutSocketChannel.java:103)
at oracle.net.nt.TimeoutSocketChannel.<init>(TimeoutSocketChannel.java:77)
at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:192)
... 126 common frames omitted
每当我在远程服务器上部署应用程序并在 application.yml 中输入“直接”url 时,正在获取连接而没有任何超时,应用程序运行良好。
jdbc:oracle:thin:@ldap://some.ldap.host:389//srvcnm,cn=OracleContext,dc=yy,dc=xx,dc=com
有人知道怎么处理吗?如何从本地机器获取连接?
我可能会做这样的事情,我将创建文件调用 ~/.ssh/config
然后添加以下内容
Host remoteserver1
User usermane
Hostname ip or host name
ForwardAgent yes
Host oracleserver
User username
Hostname some.ldap.host
Port 22
# ForwardAgent yes if you need to forward one more instance
LocalForward 8081 some.ldap.host:389
ProxyCommand ssh -q -W %h:%p remoteserver1
当我尝试从 remoteserver1 连接到 ssh oracleserver 时,它会连接到 hopper,然后代理 SSH 连接到那边的端口 22(即:Oracleserver 上的 SSH)。
现在要通过 ssh 连接,请执行以下操作 ssh oracleserver
,因为它将通过 remoteserver1 在您的机器和 oracleserver 之间建立 ssh 隧道。以及端口转发。
问题在于将源连接请求重定向到另一台具有 oracle db 本身的机器(在 ldap auth 之后)。 因此,请求的路径如下所示:
1.local -> 2.remote server -> 3.ldap server -> 4.oracle db server
1st 和 4th 机器之间没有连接,因为隧道只在 1th[=23] 之间=]和第三一个。
所以,如果您遇到这个问题,您可以再添加一个 ssh 隧道(第一个隧道用于 ldap 服务器,第二个用于 oracle db)并使用 oracle 服务器的路由丰富您的“etc/hosts”。
就我而言,问题在于访问限制。 oracle 服务器以某种方式过滤套接字并授予对某些机器的访问权限。