宿主机的路由表,同时,由于我安装了VMware,因此多了几个虚拟设备
# lihui at MacBook.local in ~ on git:master x [0:05:10] $ netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 192.168.0.1 UGSc 49 0 en0 127 127.0.0.1 UCS 0 0 lo0 127.0.0.1 127.0.0.1 UH 6 743 lo0 169.254 link#4 UCS 0 0 en0 192.168.0 link#4 UCS 1 0 en0 192.168.0.1/32 link#4 UCS 1 0 en0 192.168.0.1 6c:59:40:49:5e:92 UHLWIir 51 565 en0 1077 192.168.0.101 e0:6:e6:c6:98:d6 UHLWI 0 192 en0 1200 192.168.0.103/32 link#4 UCS 0 0 en0 192.168.135 link#10 UC 1 0 vmnet1 192.168.135.128 0:c:29:87:c5:fe UHLWIi 2 215 vmnet1 701 192.168.226 link#11 UC 1 0 vmnet8
虚拟机网络设置host-only模式
这时候会默认用到vmnet1,它其实是一个虚拟交换机,但是要注意的是,上面也有个vmnet1,这里的vmnet1实际上是VMware Network Adapter VMnet1,是为了宿主机和虚拟机进行通信而虚拟出来的一个网卡
# lihui at MacBook.local in ~ on git:master x [0:03:15] $ ifconfig vmnet1 vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:50:56:c0:00:01 inet 192.168.135.1 netmask 0xffffff00 broadcast 192.168.135.255
虚拟交换机一个端口连接了宿主机的虚拟网卡,另外VMware里还有一个虚拟DHCP服务器,一个端口连接它,还有端口连接虚拟机网卡,这样虚拟机网卡的IP地址就分配得和vmnet1处在同一个网段上,这样宿主机和虚拟机之间建立了一个虚拟局域网
打开虚拟机后,ifconfig和路由表的结果如下
lihui@2015-vm1:~$ ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0c:29:87:c5:fe inet addr:192.168.135.128 Bcast:192.168.135.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe87:c5fe/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:201 errors:0 dropped:0 overruns:0 frame:0 TX packets:151 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:18837 (18.8 KB) TX bytes:32073 (32.0 KB) lihui@2015-vm1:~$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0 192.168.135.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
可见的确虚拟机网卡分配了同一网段192.168.135.0/24的IP,从宿主机和虚拟机的路由表都可以看出来,宿主机能找到虚拟机的IP,虚拟机里能找到宿主机的网段,他们俩是可以相互访问的,但是他们两之间的私人局域网和宿主机本身的局域网是相互独立的,没法连通,所以虚拟机是无法连接外网的,也就是host-only相当于是一个与世隔绝的两者世界,他们俩就像使用一根网线进行直连
其实这种模式我挺喜欢的,虚拟机里搭建一个openstack,只需要宿主机能够SSH进去操作即可
虚拟机设置成NAT模式
这时候会默认用到vmnet8,它其实也是一个虚拟交换机,上面宿主机的信息里的vmnet8实际上是VMware Network Adapter VMnet8,也是为了宿主机和虚拟机进行通信而虚拟出来的一个网卡,只不过此时是NAT模式
# lihui at MacBook.local in ~ on git:master x [0:27:56] $ ifconfig vmnet8 vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:50:56:c0:00:08 inet 192.168.226.1 netmask 0xffffff00 broadcast 192.168.226.255
与host-only类似,虚拟交换机连接vmnet8,虚拟DHCP服务器,虚拟机的虚拟网卡,很容易看到这里虚拟DHCP服务器会给虚拟机虚拟网卡分配一个192.168.226.0/24网段的IP地址,但不同的是,还连接了一个虚拟NAT服务器,通过NAT服务器,虚拟机借助NAT功能,通过宿主机所在的网络访问互联网
正常情况下NAT协议对外网隐藏了内部网络,因此往往NAT的时候,可以从虚拟机里访问局域网的其它主机,但是反过来就不行了,在scp的时候应该经常会遇到,这种模式基本只要宿主机能够访问外网,虚拟机也能够访问
但碰到个怪事,不仅可以直接ssh进虚拟机,而且还能外面scp,试了下,的确可以相互scp,我也是醉了,难不成记错了?明天windows下vmware试试
# lihui at MacBook.local in ~ on git:master x [1:11:51] $ ssh lihui@192.168.226.135 The authenticity of host '192.168.226.135 (192.168.226.135)' can't be established. RSA key fingerprint is 75:31:c2:51:09:a5:56:4f:80:3d:1c:de:56:d5:bf:9f. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.226.135' (RSA) to the list of known hosts. lihui@192.168.226.135's password: Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.16.0-30-generic x86_64) # lihui at MacBook.local in ~ on git:master x [1:15:42] $ scp nvs.py lihui@192.168.226.135:/home/lihui lihui@192.168.226.135's password: nvs.py 100% 27KB 27.4KB/s 00:00
先进去看下路由表
lihui@2015-vm1:~$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.226.2 0.0.0.0 UG 0 0 0 eth0 192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0 192.168.226.0 * 255.255.255.0 U 0 0 0 eth0
访问宿主机的话,的确同宿主机的vmnet8同一网段,宿主机访问192.168.226网段,走vmnet8,的确也可以访问虚拟机,这么看来根据路由规则相互访问是没问题的,看来要么我醉了,要么我傻了~!
其实这个vmnet8仅仅是供宿主机和虚拟机来访问,对其它的没任何帮助,比如手动down掉它
# lihui at MacBook.local in ~ on git:master x [1:53:39] $ sudo ifconfig vmnet8 down Password: # lihui at MacBook.local in ~ on git:master x [1:54:14] $ netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 192.168.0.1 UGSc 15 0 en0 127 127.0.0.1 UCS 0 0 lo0 127.0.0.1 127.0.0.1 UH 6 196 lo0 169.254 link#4 UCS 0 0 en0 192.168.0 link#4 UCS 1 0 en0 192.168.0.1/32 link#4 UCS 1 0 en0 192.168.0.1 6c:59:40:49:5e:92 UHLWIir 17 458 en0 1186 192.168.0.104/32 link#4 UCS 0 0 en0 192.168.0.106 link#4 UHRLWI 0 157 en0 192.168.135 link#10 UC 1 0 vmnet1
然后ping都ping不通,更别说ssh了
# lihui at MacBook.local in ~ on git:master x [1:56:45] $ ping 192.168.226.135 PING 192.168.226.135 (192.168.226.135): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2 Request timeout for icmp_seq 3
虚拟机设置成Bridge模式
桥接模式就比较简单了,默认会用到vmnet0虚拟交换机,但是你却找不到虚拟的网卡VMware Network Adapter VMnet0
# lihui at MacBook.local in ~ on git:master x [1:37:33] $ ifconfig vmnet0 ifconfig: interface vmnet0 does not exist
这是因为你指定了桥接的网卡后,虚拟交换机一个端口会连接桥接的网卡,一个端口连接虚拟机的网卡,这样就跟宿主机局域网加了一台主机没什么差别,而且如果是DHCP分别IP地址,会分配一个和宿主机网卡同一个网段的IP地址,当然可以相互访问,都可以访问外网
查看下虚拟机路由表
lihui@2015-vm1:~$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0 lihui@2015-vm1:~$ ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0c:29:87:c5:fe inet addr:192.168.0.106 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe87:c5fe/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:175 errors:0 dropped:0 overruns:0 frame:0 TX packets:140 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:18455 (18.4 KB) TX bytes:20847 (20.8 KB)
宿主机192.168.0.0/24网段,网关192.168.0.1,显然想干啥就能干啥
最后还是有点怀疑是否夜深人静,我脑袋抽经,NAT居然互相访问,从路由来看,的确没问题,明天再确认下~!