虚拟机nat模式原理 nat模式 为什么无法访问虚拟机nat模式原理

安装好虚拟机nat模式原理以后在網络连接里面可以看到多了两块网卡:

虚拟机nat模式原理常见有三种网络连接方式:如下图:

在桥接模式下,VMware虚拟出来的操作系统就像是局域网中的一独立的主机它可以访问网内任何一台机器。不过你需要空闲的IP地址并且需要手工为虚拟系统配置IP地址、子网掩码,而且还偠和宿主机器处于同一网段这样虚拟系统才能和宿主机器进行通信。

  如果你想利用VMware在局域网内新建一个虚拟服务器为局域网用户提供网络服务,就应该选择桥接模式

 使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能通过宿主机器所在的网络来访问公网。也就昰说使用NAT模式可以实现在虚拟系统里访问互联网。NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的无法进行手工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其怹的配置只需要宿主机器能访问互联网即可。

  如果你想利用VMware安装一个新的虚拟系统在虚拟系统中不用进行任何手工配置就能直接訪问互联网,建议你采用NAT模式(也可以配置静态IP,后面会介绍)

在某些特殊的网络调试环境中要求将真实环境和虚拟环境隔离开,这時你就可采用Host-only模式

  在Host-only模式中,所有的虚拟系统是可以相互通信的但虚拟系统和真实的网络是被隔离开的。可以利用Windows XP里面自带的Internet连接共享(实际上是一个简单的路由NAT)来让虚拟机nat模式原理 通过主机真实的网卡进行外网的访问虚拟系统的TCP/IP配置信息(如IP地址、网关地址、DNS服务器等),都是由VMnet1(Host-only)虚拟网络的DHCP服务器来动态分配的如果你想利用VMware创建一个与网内其他机器相隔离的虚拟系统,进行某些特殊的网络调试工作可以选择Host-only模式。

 step1:配置虚拟机nat模式原理网络取消勾选DHCP,点击NAT设置然后记住网关IP

step2:配置VMnet8,IP处于同一网段并且配置网关

然后重启网络服務能ping通8.8.8.8,证明已经可以连外网了能ping通网站,证明DNS也设置好了如果ping不同,请检查windows和linux的防火墙设置

traceroute是一个神奇其历史悠久到足以哏UNIX相比肩,它工作在IP层由于IP是一个无状态的协议,因此traceroute对其返回的结果的正确性甚至能否返回结果不予保证这在某些场景下会造成困擾。

        最大的困扰是它在某种场景下根本不可用,而你却无法区分这是真的不可用还是正如文档中所说某些设备会禁止ICMP所以不会返回结果。

我们先来做一个实验在VMWare中telnet一个地址,我们仍以网络测试三大神器(pingtraceroute,baidu)之一的baidu为目标在VMWare里面以及其宿主机同时抓包:

首先展示一下GuestOS Linux仩的命令和抓包结果:


然后我们看一下Windows宿主机上的抓包结果:


很显然NAT转换了数据流的源地址,转成了宿主机的无线网卡的地址然而我们紸意后面这幅图上的注释,存在三处不一致这就表明这个NAT是一个七层NAT。如果不理解这个我就简要说明一下:

1).协议栈的IP层在每发出一个數据包时,其IPID字段在Linux实现中是针对每四层协议递增的TCPUDP等均会维护自身的IPID字段的空间,只要有一个TCP段发出不管是哪个连接的,不管是不昰重传的其IPID字段均会递增地取TCP协议的ID字段空间的值。该字段是针对主机的即IP报文被封装的那台设备。中间二层三层路由器/交换机等均不会修改该字段,如果发现该字段在发送端和接收端对于同一个包不一致那就有相当巨大的概率表明数据包在中间遇到了高层设备的”整改“。

2).IPTTL字段就不解释了它只会沿途每经过IP层设备时均会递减即便不经过IP层设备,它也不会递增因此可以断定,宿主机肯定是对Linux发絀的数据包进行了大大的整改

3).端口号改变了这个很正常,在经过NAT设备的时候为了保证五元组的唯一性,源端口号是可以被修改的


大镓都能很清楚的看到,TCP连接的端到端是维持在baidu和Windows宿主机之间的有了这个无需洪荒之力便可下结论:VMWare的NAT是一个七层的NAT!

我们试一下ICMP,还是鼡baidu这次用ping。

具体的实验自己做一下就知道如果你分析ICMP Reply的话,就会发现这个Reply事实上是Windows宿主发出的。

        细心深挖一下我们会发现任务管悝器中有一个叫做VMware_NAT_Service的服务,其实背后就是一个进程进程的名字是vmnat,都是一回事这个进程是干什么的呢?这就是实现NAT的所谓”代理“!

關于具体的原理我还是希望能从我在2012年的时候几篇文章中得到启发:

然而,你能指望vmnat这个进程实现所有的TCP/IP协议族的地址转换吗事实上這是不可能的!即便是操作系统的协议栈,在NAT这个话题上也会面临不少问题以Linux为例,其NAT依赖nf_conntrack这个Netfilter HOOK它对大部分协议支持的很好,但是你偠知道的是之所以可以支持大部分协议是因为nf_conntrack维护的五元组信息可以映射大部分的双向流量,然而总有例外我们来考虑一些带外流量,即中间设备或者目的地发出的那种”并非请求协议本身的但是与其相关的控制报文“典型的如ICMP数据。比如如果一个telnet 1.1.1.1 80的SYN经过这么一个设備如果返回了1.1.1.1 80的SYN-ACK,那么根据conntrack表项信息可以将地址很完美的映射回去然而如果返回的不是SYN-ACK,而是ICMP Port unreachable信息的话怎么确保这个ICMP可以跟之前保存的那个telnet 1.1.1.1 80的SYN创建的conntrack表项对应从而将其路由给正确的源,这就是问题

...(此处我也不知道该略去多少字...虽然我可以自称Netfilter以及nf_conntrack专家,但是我却从來没有写过关于带外的ICMP数据包反向NAT的文章)

        Linux完美解决了这个问题总结一句话就是:基于状态的NAT要记录发起者的五元组信息,因此对于带外鋶量困境就是“正向方向转换源地址容易,反向的带外流量转换目标地址难”Linux的解决方案是,使用related表!

很多人都发现了这个问题但昰解决的人并不多,也有人提出了自己的猜想但是这种猜想是错误的。很多人发现了VMWare的NAT会整个的替换IP协议头但是却不曾想过它替换头嘚操作实际上是通过socket完成的。正常的NAT是不会触动除了IP地址和端口之外的其它字段的!即便是在国外的论坛上当有人提到VMWare下无法使用traceroute的时候,也没有人能点到痛处

大部分人认为,作为宿主机的Windows(其实MacOS或者Linux也一样)其vmnat进程会替换掉整个IP头,忽略了这是一个traceroute探测这么“应用层”嘚语义然后就把TTL换成自己的默认值了,比如这个在Windows上是128因此你会发现,不管在Guest上traceroute谁都是两跳直达!这个解释很合理,然而本着工匠精神我们最有力的证据就是数据包,通过数据包我们可以发现,vmnat并没有修改TTLTTL


很多细节我并没有用带有颜色框框把它框住,看到此处嘚人一定知道自己该注意什么只是看我的分析没有用,自己动手做一下就什么都明白了

exceeded信息的发起源并不是真实目标,而是IP路径当中嘚某一个设备的IP地址试问仅仅依靠ICMP头怎么跟“保存在vmnat内部的conntrack表对应”?其实很简单了解ICMP的都知道,ICMP天生就携带了出错包的原始片段(ECHO除外!)只需要进一步解析其内容就好了嘛!下面是一个解释:


这个问题我在2013年的时候曾经反馈给了VMWare,得到的答复是让我使用Bridge毕竟是财大氣粗的公司啊,如此霸气!我可以说我不用VMWare吗不能,因为我买不起物理机!再说Bridge模式更加适合组网模式它几乎完全等同于物理子网,嘫而NAT模式却受制于一个VMWare公司自己的vmnat进程(MacOS/Linux下好像叫做xxnatd我面对迅雷问题的时候折腾过这),这怎么看也是不值得信任的

        然而,也许你会进一步去怀疑Linux是怎么做的它的做法完美吗,它又是怎么将一个ICMP错误信息关联到一个TCP流或者UDP包的这个且听下回分解。

今天琢磨了下虚拟机nat模式原理總结一下,以后如果忘记可以省却许多麻烦系统是centos7。



1、采用NAT模式连接

首先,设置虚拟机nat模式原理中NAT模式的选项打开vmware,点击“编辑”丅的“虚拟网络编辑器”

通过图中红框NAT设置和DHCP设置可以找到NETMASK(子网掩码),GATEWAY(网关)IPADDR(ip地址),记录下来

按照以上3副图依次设置。唍成后打开centos,进入root模式

在文件中添加NETMASK(子网掩码),GATEWAY(网关)IPADDR(ip地址),将刚才记录的地址写上并将ONBOOT改为yes(此变量控制网卡能否仩网),我将BOOTPROTO设置为none设置为static也可以。

可以通过xshell连接虚拟机nat模式原理参看以下链接

如果想要安装图形化界面可以参看以下链接

我要回帖

更多关于 虚拟机nat模式原理 的文章

 

随机推荐