首页 > 解决方案 > 在 VPN 之外连接到 Mysql 的 jdbc

问题描述

我有一个可公开访问的 Mysql 实例,我正在尝试在客户端 VPN 后面访问它。因此,在 VPN 上,我被授予访问数据库的权限,因此
mysql -h IP -u user -p
我可以连接到它并正常运行查询 当我尝试通过 CLI java 应用程序连接到它时,问题就开始了。我像这样打开连接

Connection source= DriverManager.getConnection("jdbc:mysql://"+getHost()+"/"+getDB()+"?useUnicode=true",
            getUser(),getPass());

我没有错误。当我尝试像这样运行查询时

rs=source.createStatement().executeQuery("select ...");

我什么也得不到。我一直坐在那里等待,没有结果返回,也没有错误/异常!

Mysql 实例正在接受连接,因为我在获取进程列表时可以看到连接

+----+------+-----+----+---------------+------+--- -----+------+
| 身份证 | 用户 | 主持人| 分贝 | 命令 | 时间 | 状态 | 信息 | +----+------+-----+----+---------------+------+--- -----+------+
| 9094 | 用户 |ClientIp:58450 | 数据库 | 睡眠 | 4933 | | 空 |

加上当我得到数据库的错误日志时

tail /var/log/mysql/error.log 2019-04-23T14:17:34.286979Z 9175 [Note] Aborted connection 9175 to db: 'db' user: 'user' host: 'ClientIp' (读取通信时出错数据包)2019-04-23T14:17:46.501602Z 9174 [注意]中止连接9174到db:'db'用户:'user'主机:'ClientIp'(写入通信数据包超时)

我开始认为他们在客户端联网,打开传出端口(3306,所以我可以连接到数据库)但传入端口(据我所知并记得我的大学网络课程是随机的)。这必须由进程列表的主机记录确认IP:58450。这是客户端的监听端口,对吧。因此,如果关闭,连接将保持打开状态,等待传入消息,但消息本身将被阻止(因为端口被阻止)
首先,有没有办法验证这一点,所以我可以确定这是有这个问题吗?只是想和那边的网络人谈谈。

据我所知,您无法为客户端指定一个(范围)端口。如果端口被防火墙阻止,您可以做什么?

提前致谢。伊利亚斯


更新
在连接到 Mysql 时运行 netstat 我看到了这个

netstat -a |grep mysql
tcp 0 0 客户端:58744 MySqlRemote.e:mysql ESTABLISHED

当我使用 java 连接时,我得到

tcp6 0 0 客户端:58748 MySqlRemote.e:mysql 已建立

所以,似乎在这两种情况下连接都正常。唯一明显的区别是两条记录上的 tcp - tcp6。所以我认为问题可能出在java中使用IP6。我试图通过编辑文件在VM上一起使用 System.setProperty("java.net.preferIPv4Stack" , "true"); 和禁用IP6来禁用它。/etc/hosts结果是现在使用 netstat 我看到使用了 IP4,但查询仍然没有响应。

标签: mysqljdbcvpn

解决方案


推荐阅读