【问题标题】:Connecting a remote database that is behind a firewall via SSH通过 SSH 连接防火墙后的远程数据库
【发布时间】:2023-11-30 20:42:01
【问题描述】:

我正在尝试编写一些从我的个人计算机连接到远程数据库的 Java 代码。我目前可以使用私钥/公钥授权 ssh 到这些机器。我可以通过创建 SSH 隧道(使用 Putty)来访问这些机器的 GUI。

我认为问题不在于我的代码,因为我可以使用 MySQL Workbench 创建一个数据库并且可以成功查询该数据库。尝试访问数据库时,我使用与 GUI 相同的隧道地址。所以我的问题归结为我应该如何连接到数据库?任何人都可以对我的问题有所了解吗?我的代码贴在下面。

import  java.sql.Connection;        
import  java.sql.Statement;     
import  java.sql.ResultSet;     
import  java.sql.DriverManager;     
import  java.sql.SQLException;      
public class  SQLConnector {                
        public static void  main(String[] args) throws  ClassNotFoundException, SQLException {                                                  
                //Connection URL Syntax: "jdbc:mysql://ipaddress:portnumber/db_name"        
                String dbUrl = "jdbc:mysql://localhost:9092/db";                   

                //Database Username     
                String username = "root";   

                //Database Password     
                String password = "root";             

                //Query to Execute      
                String query = "select *  from employee;";  

                //Load mysql jdbc driver        
                Class.forName("com.mysql.jdbc.Driver");         

                //Create Connection to DB       
                Connection con = DriverManager.getConnection(dbUrl,username,password);

                //Create Statement Object       
               Statement stmt = con.createStatement();                  

                // Execute the SQL Query. Store results in ResultSet        
                ResultSet rs= stmt.executeQuery(query);                         

                // While Loop to iterate through all data and print results     
                while (rs.next()){
                            String myName = rs.getString(1);                                        
                            String myAge = rs.getString(2);                                                
                            System. out.println(myName+"  "+myAge);     
                    }       
                 // closing DB Connection       
                con.close();            
        }
} 

我得到的错误是:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

【问题讨论】:

  • 能否将ssh 命令添加到问题中。
  • ssh 用户名@192.168.1.2339。在公钥和私钥授权后,我从 putty 使用它。

标签: java mysql ssh mysql-workbench


【解决方案1】:

如果我没听错的话,mysql 正在使用 ssh 连接的主机上的 9092 端口进行侦听。

然后使用这个 ssh 命令连接:

ssh -L9092:localhost:9092 username@192.168.1.233

它会在您的本地机器上创建一个 tcp 监听套接字,并将任何到本地机器上的端口 9092 的连接通过隧道连接到远程机器上的端口 9092

编辑: 我错过了你正在使用腻子。然后打开连接设置对话框,然后浏览到ssh 并找到port forwarding。符号几乎相同:本地端口,到远程站点的某个 ip:端口:here 您可以找到带有屏幕截图的分步指南

【讨论】:

  • 我应该在腻子上运行这个 ssh -L9092:localhost:9092 username@192.168.1.233 吗?
  • -L9092:localhost:9092 命令未找到,当我在腻子中运行此命令时。
  • 我已经这样做了,我正在使用的地址是我创建的用于访问 GUI 的端口的地址。
  • 不能使用同一个端口访问GUI和mysql。使用单独的端口
【解决方案2】:

这可能应该是一个评论,但我的声誉不允许 cmets。我冒昧地猜测服务器网络上的端口正在阻止该端口(无论您使用什么端口),但允许 ssh。这台服务器是什么/在哪里/您可以更改任何防火墙上的设置以允许连接吗?

【讨论】:

  • 我认为可能是对的。我猜即使我在腻子上打开了连接(这意味着我可以访问隧道 GUI)。我无法通过工作台访问,您有什么建议吗?
  • 这取决于您的设置。如果这是 Amazon Web Services 服务器上的服务器,则您必须通过一系列步骤来允许访问端口。如果这是位于同一网络上的 Windows 框,您必须进入控制面板 >> 防火墙 .. 然后制定规则以允许访问该端口。基本上,有硬件防火墙和软件防火墙,都必须有一条规则,上面写着“在端口#### 上请求入站是可以的,将其传递给服务器。”您能提供本地和服务器之间的完整硬件和软件设置吗?
最近更新 更多