文章目录
vmware的虚拟网络有三种模式:桥接模式、nat模式、host模式。本文探究 nat模式下,虚机相关的报文流。涉及vmware的两个服务:VMnet8接口 和 vmware nat service(服务进程)。
总体报文流
虚机发起访问
虚机访问物理主机协议栈
触发命令ping 192.168.1.3
。
该报文流 途径:
- vm1发出icmp request报文(假设已有arp记录),目的mac是gateway 192.168.86.2的mac地址。
- 报文经过交换转发到192.168.86.2接口,该接口被 vmware nat service服务进程 监听。
- vmware nat service服务进程 收到icmp报文,进行路由查找
- 路由结果命中本机,则直接 发给内核协议栈。
虚机访问外部物理网络
虚机访问公网ip(此处IP为物理主机所在网络的网关192.168.1.1),触发命令ping 192.168.1.1
- 同上1
- 同上2
- 同上3
- 路由结果为出接口为物理接口,此时将报文source ip SNAT为出接口的IP(192.168.1.3),然后由物理接口发出。
回程报文流会额外 在nat service进程中 进行连接状态查找。
物理主机进程 访问虚机
物理主机的进程 访问虚机吗。触发命令ping 192.168.86.100
,这里的进程是ping。
- 主机进程构造icmp报文,路由查找,出接口为VMnet8,直接以VMnet8的mac/ip(192.168.86.1)构造报文头。
win10的nat网络模型
win10 的nat配置 只跟子网相关,不与接口直接关联。因此一般是与 虚拟交换机的三层口 处于同一子网。执行win10 NAT创建命令New-NetNat
时,你只要指定要nat的内网子网,此处不用指定nat后的ip,snat 后的ip由 路由的出接口IP决定,类似linux中的masquerade。类比linux协议栈的话,snat都是在route后的postroute链nat表中 进行的。
# win10 nat 创建流程
# 创建虚拟交换机
New-VMSwitch -SwitchName "NAT" -SwitchType Internal
# 获取虚拟交换机的ifindex,并赋值到变量中
$ifindex = Get-NetAdapter -Name "vEthernet (NAT)" | Select-Object -ExpandProperty 'ifIndex'
# 在虚拟交换机上设置固定IP,用于网关IP
New-NetIPAddress -IPAddress 192.168.56.254 -PrefixLength 24 -InterfaceIndex $ifindex
# 创建nat网络。nat网络只跟子网关联,不与具体接口直接关联
New-NetNat -Name NAT -InternalIPInterfaceAddressPrefix 192.168.56.0/24
参考
win setup nat net
在win10 hype-v创建nat虚拟交换机,管理nat网络,管理nat虚拟交换机
wsl的网络模型
wsl的网络是一个nat网络。wsl中的网络访问其他网络接口时,src ip 都会nat成 出接口ip。
vmware host-only 网络模型
在此网络模型下,主机可以ping通虚机,但是虚机无法ping通主机。虚机vm1从vmnet1发起的连接 会被win内核协议栈block(但没找到显式的block规则)。
疑问解答
VMnet8虚拟网卡的作用?其是否关联nat功能?
vmware nat service 的nat服务是单向发起连接的,只能虚机访问主机,没有实现主机访问虚机。 VMnet8 为 主机访问虚机 提供出接口及其路由规则,没有关联nat功能。
host-only模型中,为何虚机无法访问主机?主机却可以访问虚机?
从host-only概念分析,该网络仅提供 虚机间互相访问的网络功能,因此 虚机无法访问主机 是符合概念模型的。
从实现上分析,VMnet1提供了 主机访问虚机的路径,host-only没有nat模式的nat-service来提供虚机访问主机的功能。而且 VMnet1中 虚机访问主机的报文 会被block。
是否可以禁用VMnet8?
可以的。这种情况下,虚机 依旧可访问 主机及其外网。但是主机无法虚机,因这依赖VMnet8。
nat存在的意义?
nat的作用
snat确保数据包转发到外网,并能够从外网返回。
- 避免主机内部tcp/udp端口冲突。避免 主机内部虚拟网络 影响本机协议栈。比如二者共用ip的情况下,二者端口可能冲突,使用nat可以规避冲突。*
- 避免物理局域网ip冲突。如果 不共享本机物理IP,而直接暴露 内部虚拟网络的私网IP,可能会与 物理局域网的其他暴露私网IP 冲突。