诡异! 为什么用 jdbc 不能访问虚拟机 NAT + port forwarding 后的 mysql 服务器? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
soruNis
V2EX    Java

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

  •  
  •   soruNis 2014-08-30 23:57:39 +08:00 4357 次点击
    这是一个创建于 4129 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为撸代码需要, 我在虚拟机里装了一个 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     Solana     855 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 21:47 PVG 05:47 LAX 13:47 JFK 16:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86