1. windows真机+vmware虚拟机
2. 云平台,虚拟机A(有公网ip,有内网ip)+虚拟机B(只有内网ip)
3. linux真机+kvm虚拟机
------------------------------------------------------------------------------
第一种:windows真机+vmware虚拟机
这个在前一篇文章已列出
VMware虚拟机连接公网,和WindTerm_单机版vm 上网-CSDN博客
补充两点:
a. vmware的eth0可以不用dhcp自动分配的那个内网ip,只用手动设置的那个eth0的内网ip也行
b. 如果要多台虚拟机都连接公网,其实都配置的和第一台网络模式一样就可以。为什么说这个?因为管理员可能会考虑,其他的虚拟机,通过第一台虚拟机来访问公网。不用这样。其他虚拟机也是一张网卡和windows真机NAT,一张网卡用来连接windterm就行。相当于所有虚拟机网络模式都是差不多一样的,内网ip地址不一样就行了。
-----------------------------------------------------------------------------------
第二种: 云平台
云平台的虚拟机,也称为云主机
云主机是以kvm虚拟化技术为底层原理,利用openstack等平台性技术,动态给用户调度虚拟机资源。
实际操作:环境准备,两个内网主机不在同一个subnet
1. 给A主机所在子网,新建一个自定义路由表,创建后关联A主机所在子网
2. 配置B主机所在子网的路由表,公网目的:0.0.0.0/0,下一跳类型:云服务器,下一跳:A主机的内网ip
3. 配置A主机的NAT,rps
4. NAT脚本开机自启
为什么两个主机要在不同子网?
因为在相同子网的话,不会触发NAT规则。
这个A主机作为网关,其实可以理解为一个路由器,路由器本身连接的A主机的子网,比如192.168.1.0/24,这个网段的是可以访问公网的,所以如果B主机也是这个网段的IP,网关则默认为它也是可以访问公网的,就不会触发修改源IP的这个NAT规则。而云平台又默认为只有A主机才可以直接访问公网,因为公网IP绑定的是这个主机,不是这个网段。所以,B主机要用NAT模式,把A主机当做路由器的话,就不能和A主机在同一个subnet。如果B主机和A主机在同一个subnet了,就不会触发A主机的NAT规则。
从内核层面来讲,用iptables来调整四表五链的时候
也就是说,内核处理网络流量是有四张表五个链来处理的,其中一张表是NAT表,
NAT(network address translation)网络地址转换
在input链,B主机和A主机的内网ip属于同一个子网,那么B主机的数据包就不会进入NAT表,不会用net.ipv4.ip_forward这个参数,路由会像对待A主机的数据包一样,直接往公网发,所以就没有触发NAT规则。
如果B主机和A主机不在一个子网,那么B主机的流量到达路由,路由就会根据NAT规则,对这个非本机子网的数据包进行源地址转换。以NAT的方式访问公网
再往细了讲,我们需要对四表五链进行详细的分析
以及四表五链在内核的设计上是如何实现的,
需要对内核编译和内核代码的实现逻辑进行分析
再往细了讲,内核的代码编译之后和cpu指令集的交互逻辑
就可以说明四表五链的底层工作原理
通过四表五链再往应用层,就能清晰理解数据包的转发逻辑
由于内容较多,本篇文章暂不往代码层分析。
以应用的实现逻辑为主。
掌握这些,可以实现功能,对于用户来讲可以专注于服务的实现。
对于底层代码,可以看Linux内核源码
配置方法可以参考:
【云服务器 配置公网网关-操作指南-文档中心-腾讯云】 https://cloud.tencent.com/document/product/213/38839?from=copy
---------------------------------------------------------------------------------------------------
第三种:linux真机+kvm虚拟机
因为kvm虚拟机是搭建的虚拟网桥,网桥模式可以设置为nat,连接这个网桥的kvm虚拟机就可以连接公网。
自己手动做一个虚拟机,需要一个虚拟配置文件.xml,声明虚拟机需要的cpu内存网卡等信息
还需要一个存储文件.img,这个文件相当于一个硬盘,这个文件里面需要有一个可以启动的操作系统。
虚拟机做好之后,连接nat的网桥,就可以通过linux真机访问公网。
linux真机如果安装了图形界面,也可以通过kvm虚拟机管理器,来图形化操作创建虚拟机。
总的来说,在Linux真机上创建kvm虚拟机,虚拟机连接公网是比较方便的。
参考:libvirt: Network XML formatlibvirt, virtualization, virtualization APIhttps://libvirt.org/formatnetwork.html#nat-based-network