V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
soruNis
V2EX  ›  Java

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

  •  
  •   soruNis · 2014-08-30 23:57:39 +08:00 · 3955 次点击
    这是一个创建于 3733 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为撸代码需要, 我在虚拟机里装了一个 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 上半天没人理, 不知这里有没有人清楚原因?
    第 1 条附言  ·  2014-09-03 19:16:32 +08:00
    update: 我在 stackoverflow 更新了问题, 加了 50 rep bounty 欢迎回答
    http://stackoverflow.com/questions/25580210/jdbc-cannot-connect-to-mysql-behind-nat-with-port-forwarding
    第 2 条附言  ·  2014-09-04 15:41:21 +08:00
    把 mysql-java-connector 升级到最新 (5.1.32), 问题解决了...

    背后的具体原因仍不清楚, 如有知悉, 还望大虾不吝赐教~
    13 条回复    2014-09-04 15:41:13 +08:00
    kfll
        1
    kfll  
       2014-08-31 03:16:52 +08:00 via Android
    …我不懂jdbc……路过的时候看到个好奇的点想问一下……mysql的这个url,用户名密码是可以写在query里面的么…不是一般都写在authorization的么,像 jdbc:mysql://utest:[email protected]:9999/test 这样的…
    showhand
        2
    showhand  
       2014-08-31 07:20:49 +08:00 via Android
    是不是还需要开放其他端口
    showhand
        3
    showhand  
       2014-08-31 07:30:37 +08:00 via Android
    额,不需要,抓个包看看呢
    showhand
        4
    showhand  
       2014-08-31 07:36:10 +08:00 via Android
    lightening
        5
    lightening  
       2014-08-31 07:40:09 +08:00
    你确定你的 MySQL 允许了远程访问?
    lu18887
        6
    lu18887  
       2014-08-31 09:17:52 +08:00
    至少在VMWARE里,NAT下宿主机是看不到虚拟机的,想要达到宿主机和虚拟机可以相互通讯,可以考虑Host Only或者Bridge
    ptyfork
        7
    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 [email protected]
    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
        8
    soruNis  
    OP
       2014-08-31 09:49:02 +08:00 via iPad
    谢谢回复

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

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

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

    背后的具体原因仍不清楚, 如有知悉, 还望大虾不吝赐教~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4989 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 05:39 · PVG 13:39 · LAX 21:39 · JFK 00:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.