最近在学习极客时间上的一门课程<趣谈网络协议>,里面有涉及到虚拟机网络的一些东西.正好一直在接触,站在巨人的肩膀上,我也来写写.
为什么需要用虚拟网络呢?我在现实世界中扯网线不可以嘛?其实是完全 OK 的,但是这样做的话,成本会非常高,主要有以下几个方面:
- 1 ,客户那边需要一台系统, OK ,自己去购买一台服务器,供客户使用.一台服务器可以使用至少是 10 年,在这期间,客户和你解除了合作关系,这台服务器还要不要?可别忘了,当时买这台服务器,可是花了价钱,还要把服务器放在机柜里,布线等等这些过程.
- 2 ,客户那边说,给我的这台系统,内存不够用了,怎么办?用的是真实服务器,还能怎么办?把服务器停机弄下来再把内存条装上去.这个过程,客户那边如果还在用服务器,你就这么给弄下来了?还有一点,这个过程是需要人手动去做的,这个人力成本有算进去嘛?一台需要一个人,如果规模大起来,上万台服务器,其中有 100 台服务器需要更换内存,再用人力去解决问题?
- 3 ,资源利用率不高.客户那边只需要一个 4 核 8G 的配置,但是服务器一般没有这么低的配置,所以剩下的资源怎么办?只能闲置.
- 4 ,这台服务器我给了这个用户使用,然后使用期限到期了,这位用户没有续费,是不是就需要重装系统之后,才能给下一位客户使用?
这个需求挺大的,对吧?所以就有了虚拟机的概念.
虚拟机想要上网,就需要来聊聊虚拟机中的网络是如何工作的.
如果你在自己的笔记本上面倒腾过虚拟机,那你对虚拟机的三种联网方式应该会比较熟悉:仅主机模式,桥接模式和 NAT 模式.
下面就一个一个模式的来说说,正好倒腾虚拟机这么久,没有很系统的总结过.
仅主机( host-only )模式
这种模式,一般不常用,但是也来介绍一下.
这种模式提供的只是,物理机和虚拟机之间的相互访问,只是可以实现物理机和虚拟机之间的数据交换,但是虚拟机是没办法访问 Internet 的.
实现物理机和虚拟机之间的数据交换有两种方式:一是动态 IP 地址,另外一种是静态 IP 地址.
如果是采用动态 IP 地址的话,那就要多做一步:需要将你的网络共享.
如果是采用静态 IP 地址的话,虚拟机的 IP 设置,网关, DNS 设置都要注意和虚拟机网卡中相同.
此时,你的虚拟机是可以和物理机进行相互访问的.
但是请注意,此时你的虚拟机是访问不了 Internet 的!!!
host-only 模式,只是负责让你的虚拟机和物理机之间可以相互访问,并不负责让你的虚拟机联网.所以这种模式,一般都不常用.
毕竟你倒腾虚拟机,是为了能够上网搭建个集群什么的,对吧.
桥接( Bridge )模式
桥接,桥接,意思就是大家都在一个区域内,只是呢,需要一座桥来连接起来.
有前提的:就是大家要在一个区域内,也就是说距离不能太远.要不然你在北极,我在南极,这个桥建不起来,对吧.
通过这种方式,让虚拟机联网是最快的.因为它就类似于你在局域网中有另外一台电脑,只要虚拟机所在的物理机可以上网,那么通过桥接模式,也就可以上网了.
但有一点要注意,就是要保证虚拟机的 IP 和所在局域网的 IP 没有冲突.
如果你的物理机所在局域网 IP 地址没什么限制,用这种方法上网就行了,对新手也比较友好.如果 IP 地址比较稀缺,那就最好不要用这种方法上网.
NAT ( Network address translate ) 模式
其实 NAT 联网这种方式,不单单在虚拟机中有应用,在实际中也有应用.比如:你的公司买了一个公网 IP : 114.114.114.114 ,但是你却发现,公司里面是有很多个 IP 地址的.
这就是 NAT 模式.具体工作原理就是:公司里面的一个 IP 地址是 192.168.111.111 这个地址想要访问 Internet ,此时这个 IP 地址所发送的请求会被包装成一个数据包,然后这个数据包会通过一个网关或者路由器,这个网关或者路由器的 IP 地址就是公司买的公网 IP .这样网关或者路由器在要发送数据包时,对数据包的 IP 协议层数据进行更改(也就是 NAT ),这样你就可以很顺利的去访问 Internet .这种方法的存在解决了两个问题: 1 , IP 地址稀缺问题; 2 ,公司的局域网 IP 也可以上网.
同样的道理,在虚拟机中 NAT 模式上网,也是如此.所以虚拟机中的网络 IP 地址,就算和物理机所在局域网的 IP 地址不一样,甚至不在一个网段内,也是 OK 的.在这里,物理机的 IP 地址就相当于虚拟机的网关,因而在这种模式下,虚拟机是可以 ping 通物理机的,但是物理机不能 ping 通虚拟机.
在这种模式下,联网方式也有两种:一是动态获取 IP 地址,另外一种是设置静态 IP 地址.
同样,对于新手来说,虚拟机的联网方式,使用动态获取 IP 地址就好了,具体就是在配置文件中,只需要将 onboot 改为 yes ,然后重启网卡,虚拟机就可以连接到网络上了.
如果想要设置静态 IP 地址也可以,就需要修改虚拟机网卡的网关,子网掩码和 DNS .
一般来说,使用动态获取 IP 地址这种方式就满足了大部分的需求,另外对于静态 IP 地址这一块,我一直没有实践过,怕误导,就不细说了.如果您感兴趣,可以细细钻研一下.
以上.
推荐阅读:
[Kubernetes]浅谈容器网络
[Kubernetes]谈谈容器跨主机网络
感谢您的阅读~