mysql - 在 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,但查询仍然没有响应。
解决方案
推荐阅读
- angular - css 类的 Angular HostBinding 测试
- android - 下载图片后替换我的画廊
- reactjs - 在具有键的元素上反应唯一键错误
- angular - 角度路由下载文件而不是解析组件
- javascript - RegExp 查找和替换两个单独分隔符之间的所有空格
- spring-webflow-2 - 更改流组装的类加载器
- file-upload - ZenCart 文件上传问题
- javascript - 切换更改的按钮类
- python - 如何减小此图中图例的大小?
- android - Java android google maps 显示所有标记和 InfoWindows