诡异! 为什么用 jdbc 不能访问虚拟机 NAT + port forwarding 后的 mysql 服务器?

2014-08-30 23:57:39 +08:00
 soruNis
因为撸代码需要, 我在虚拟机里装了一个 mysql 方便调试, 但由于最近撸代码环境变化频繁, 子网前缀一直变, 导致虚拟机的 ip 也总是变, 配置起来真麻烦, 于是我把虚拟机的网络设置为 NAT + port forwarding, 希望这样能通过 127.0.0.1 + 映射的端口号来访问虚拟机的 mysql, 结果就悲剧了。。。具体情况如下:

1 在 virtualbox 里装了一个 ubuntu, 上面安装了 mysql server, 服务端口号 3306,
2 然后在 virtualbox 里把网络设置为 NAT, 将虚拟机的 3306 端口映射为 host 的 9999 端口

这时, 在 host 机上用 mysql workbench 可以正常连接 127.0.0.1:9999, telnet 127.0.0.1 9999 也可以收到 mysql 的输入密码提示, 说明这套配置应该是正确的。

但是奇怪的是, 用 jdbc 在代码中去连时就不行了, 测试代码:

String url = "jdbc:mysql://127.0.0.1:9999/test?user=utest&password=pwd";
Class.forName ("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url);

报错 “ CommunicationsException: Communications link failure .... The last packet sent successfully to the server was 0 milliseconds ago.”

发在 stackoverflow 上半天没人理, 不知这里有没有人清楚原因?
3992 次点击
所在节点    Java
13 条回复
kfll
2014-08-31 03:16:52 +08:00
…我不懂jdbc……路过的时候看到个好奇的点想问一下……mysql的这个url,用户名密码是可以写在query里面的么…不是一般都写在authorization的么,像 jdbc:mysql://utest:pwd@127.0.0.1:9999/test 这样的…
showhand
2014-08-31 07:20:49 +08:00
是不是还需要开放其他端口
showhand
2014-08-31 07:30:37 +08:00
额,不需要,抓个包看看呢
showhand
2014-08-31 07:36:10 +08:00
lightening
2014-08-31 07:40:09 +08:00
你确定你的 MySQL 允许了远程访问?
lu18887
2014-08-31 09:17:52 +08:00
至少在VMWARE里,NAT下宿主机是看不到虚拟机的,想要达到宿主机和虚拟机可以相互通讯,可以考虑Host Only或者Bridge
ptyfork
2014-08-31 09:38:56 +08:00
@lu18887 我用的VMware Fusion 使用NAT方式, 宿主机可以访问没问题的。



启动虚拟机后宿主机上能看到这几个接口

vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:50:56:c0:00:01
inet 192.168.232.1 netmask 0xffffff00 broadcast 192.168.232.255
vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:50:56:c0:00:08
inet 172.16.109.1 netmask 0xffffff00 broadcast 172.16.109.255


虚拟机的IP地址是 172.16.109.141

Darren-rMBP:~ darren$ ssh root@172.16.109.141
Linux debian 3.14-2-amd64 #1 SMP Debian 3.14.15-2 (2014-08-09) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Aug 31 09:28:18 2014 from 172.16.109.1

debian:~# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0c:29:cb:53:90
inet addr:172.16.109.141 Bcast:172.16.109.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecb:5390/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:143 errors:0 dropped:0 overruns:0 frame:0
TX packets:110 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:18014 (17.5 KiB) TX bytes:20240 (19.7 KiB)
soruNis
2014-08-31 09:49:02 +08:00
谢谢回复

1 虚拟机的 3306 端口已经映射到宿主机的 9999 端口

2 通过宿主机的 9999 端口已经可以用 mysql 客户端正确链接

3 用原文中的 java code 调 jdbc 去链接则报错网络错误
undeflife
2014-08-31 10:06:56 +08:00
看看host跟guest的时间
Actrace
2014-08-31 10:23:20 +08:00
Mac的NAT一直都有一些奇怪的毛病。
andy
2014-08-31 11:50:15 +08:00
soruNis
2014-08-31 12:55:38 +08:00
@undeflife 时间是一致的。 问题应该是出在 mysql connector 的连接机制上。
soruNis
2014-09-04 15:41:13 +08:00
把 mysql-java-connector 升级到最新 (5.1.32), 问题解决了...

背后的具体原因仍不清楚, 如有知悉, 还望大虾不吝赐教~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/130858

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX