首先要说的一点就是:你所想的各种情况都是可以实现的。

Office Guide: https://msdn.microsoft.com/en-us/virtualization/hyperv_on_windows/user_guide/setup_nat_network

Other Blogs: http://www.thomasmaurer.ch/2015/11/hyper-v-virtual-switch-using-nat-configuration/

在 Windows 10 Build 10585 版本 和 Windows Server 2016 Technical Preview 4 版本其实已经添加了新的NAT类型的网络模型。
但是现在还不支持UI,不过可以用PowerShell去创建。

参考资料:

http://www.thomasmaurer.ch/2015/11/hyper-v-virtual-switch-using-nat-configuration/

https://msdn.microsoft.com/en-us/virtualization/hyperv_on_windows/user_guide/setup_nat_network

配置命令:管理员身份打开 PowerShell

# 添加一个 NAT 类型的 Switch,最后的 0/24 是固定的,原因自己度娘/谷哥。
New-VMSwitch -Name "xNet" -SwitchType NAT -NATSubnetAddress 192.168.3.0/24
# 为刚添加的 Switch 添加 NetNat
New-NetNat -Name xNet -InternalIPInterfaceAddressPrefix "192.168.3.0/24"
# 上面2个命令就OK了。

上面的报错的话,就走一般点的步骤:

# 1. 创建一个 内部 类型的 VMSwitch。这一步可以在 Hylper-V Manager 里完成。
New-VMSwitch –SwitchName "xNet" –SwitchType Internal
# 成功后,可以用 Get-VMSwitch 看到刚刚添加的 Switch

# 2. 配置 NAT 的网关地址
# This configures the Virtual Network Adapter which was created while creating the Internal Virtual Hyper-V Switch.
New-NetIPAddress –IPAddress 192.168.3.1 -PrefixLength 24 -InterfaceAlias "vEthernet (xNet)"
# 最后一个参数 InterfaceAlias 可以使用 InterfaceIndex 代替的,多敲一下 Tab 键就出来了。
# Index 可以使用 Get-NetAdapter 查看。
# Get-NetIPAddress 可以查看目前已有的 IPAddress ,多余和重复的可以使用 Remove-NetIPAddress 删除。

# 3. Now you can configure the NAT rule
New-NetNat –Name xNetNat –InternalIPInterfaceAddressPrefix 192.168.3.0/24
# After that you have finally created your NAT network and you can now use that network to connect your virtual machines and use IP Address from 192.168.3.2-192.168.3.254.
# 可以使用 Get-NetNat 查看已有。

添加映射:(宿主机和NAT网络做端口映射)

Add-NetNatStaticMapping -NatName "VMSwitchNat" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.29.92.2 -InternalPort 80 -ExternalPort 80

Add-NetNatStaticMapping -NatName "VMSwitchNat" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.16.0.3 -InternalPort 80 -ExternalPort 82

其他命令:

Get-VMSwitch
Get-NetAdapter
Get-NetNat
# 卸载 NetAdapter -> 我的电脑 -> 设备管理器 -> 网络

问题

  1. 当主机同时处在2个局域网中时(虚拟局域网和外网),主机发出的一个请求,怎么判断是应该送到外网,还是局域网?

涉及到 IP 协议的抽象的实现。简单来说就是 IP 地址本身没有内网外网之分。但是设计之初有预留3个网段给内网使用:

  • A类 10.0.0.0–10.255.255.255
  • B类 172.16.0.0–172.31.255.255
  • C类 192.168.0.0–192.168.255.255
    凡是这3个网段内的数据包,都是内网的。3个网段本身没有区别,只是可以容纳的机器数不一样,按需使用。
    而且数据包走哪个网卡,也是通过IP地址和子网掩码自己算出来的,所以没有内网外网之分。
  1. 多个虚拟内网如何区分?

每个虚拟网卡的 IP/子网掩码 是不一样的。