网络虚拟化系列文章


理解Hyper-V外部网络、内部网络和私有网络

Hyper-V虚拟化结构说明

Hyper-V是type 1类的虚拟化管理程序(VMM),所以物理机(安装Hyper-V管理程序的系统)和Hyper-V所创建的虚拟机在同一个层次,都在Hyper-V系统(Hyper-V层,即Hypervisor)之上。

换句话说,物理机也算是Hyper-V之上的虚拟机,只是它比较特别,安装了Hyper-V管理工具,即托管了Hyper-V的管理工具,所以它才称之为宿主机,也称为管理主机(Management OS)。实际上,宿主机相当于一个安装了操作系统的Hyper-V虚拟层的客户端管理工具。

理解宿主机也是『虚拟机』特别是理解它是管理Hyper-V的虚拟机很重要,不搞清楚宿主机的角色层次,就没法搞清楚Hyper-V虚拟网络。

Hyper-V有三种类型的网络:

  • External:外部网络
  • Internal:内部网络
  • Private:私有网络(专有网络)

三种网络都是通过创建虚拟交换机(或虚拟网桥)来实现的。它们可以进行互相转换,只不过图形界面下无法操作完成转换,但在PowerShell下通过命令行是可以设置虚拟网卡、虚拟交换机的,比如将外部网络的虚拟交换机跟物理网卡取消绑定,这个虚拟交换机就变成了内部网络的虚拟交换机,将内部网络的虚拟交换机和宿主机的虚拟网卡断开连接,就成为了专有网络的虚拟交换机。

外部网络(External)

当创建外部网络时,会在Hyper-V管理程序所在宿主机(即物理机)上创建一个虚拟交换机,同时还会为宿主机创建一个虚拟网卡,并将其连接到虚拟交换机上(创建外部网络时会自动将宿主机上原来的IP地址设置到此虚拟网卡上)。所有放在外部网络上的虚拟机也都会连接到此虚拟交换机上。

但不仅如此,但创建外部网络时,还会将原来的物理网卡变成特殊的物理设备,虚拟交换机会绑定(即连接)此特殊的物理设备。绑定后,该物理设备不能再做任何事,但却使得虚拟交换机变成可扩展的Hyper-V虚拟交换机。可扩展的虚拟交换机允许功能扩展,比如可以定制扩展功能进行筛选、丢弃以及转发数据包到指定的交换机端口上。

外部网络的模型如图:

要理解这个模型,需理解本文章开头说的:物理机其实也是Hyper-V虚拟化平台上的一个虚拟机,只不过它是特殊一点的虚拟机,它安装了Hyper-V虚拟化的管理工具。因此,物理机和虚拟机是平等的,它也使用虚拟网卡,和手动创建的虚拟机的网卡一样,都连接在虚拟交换机上。

外部网络特性

  1. 外部网络内的所有节点(包括宿主机上自动创建的虚拟网卡)在同一个网段,且和宿主机上的虚拟网卡同网段,它们能互相通信(因为都连接在一个虚拟交换机上)。
  2. 外部网络内的所有节点数据都能够通过绑定了物理网卡的虚拟交换机发送出去。

创建Hyper-V外部网络细节

下面是创建Hyper-V外部网络时的网卡信息。

在创建外部网络之前,只有一个本地连接网络Eth0,它已经绑定了物理网卡Intel 82574,其IP地址是192.168.200.65,网关指向的是物理网卡所在网段的网关。

当创建外部网络时,需要指定该外部网络的虚拟交换机要连接的物理网卡(what do you want to connect this virtual switch to?),下图中外部网络的虚拟交换机是连接到Intel 82574。

装完外部网络后,网卡的信息如下图:

注意,虚拟交换机不会显示在这里。

上图中,原来带有的IP地址已经设置到了vEth(out)网卡上,它是Hyper-V为宿主机分配的虚拟网卡,该网卡已经连接到了虚拟交换机上,其网关指向了物理网卡所在网段的网关。

Eth0是物理网卡对应的适配器,它绑定到了物理网卡,因为它既要连虚拟交换机,又要连外部交换机或路由器,所以它开启了一个称为Hyper-V扩展虚拟交换机协议的功能,且它没有配置ipv4。

使用Powershell命令行,可以查看已有的虚拟网卡、物理网卡和虚拟交换机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 物理网卡是Eth0
PS C:\Windows\system32> Get-NetAdapter -Physical

Name InterfaceDescription ifIndex Status
---- -------------------- ------- ------
Ethernet0 Intel(R) 82574L Gigabit Network Conn... 13 Up

# 所有网卡:Eth0是物理网卡,vEth(out)是虚拟网卡
PS C:\Windows\system32> Get-NetAdapter

Name InterfaceDescription ifIndex Status
---- -------------------- ------- ------
vEthernet (out) Hyper-V Virtual Ethernet Adapter #2 4 Up
Ethernet0 Intel(R) 82574L Gigabit Network Conn... 13 Up

# 虚拟交换机:out虚拟交换机已经连接到物理网卡上
PS C:\Windows\system32> Get-VMSwitch

Name SwitchType NetAdapterInterfaceDescription
---- ---------- ------------------------------
out External Intel(R) 82574L Gigabit Network Connection

内部网络(Internal)

创建内部网络时,会在宿主机上创建一个虚拟交换机以及一个虚拟网卡,该虚拟网卡以及所有内部网络节点都连接到此内部网络虚拟交换机上,所以所有内部网络的节点和宿主机之间都能互相通信。

注意,内部网络的虚拟交换机不连接物理网卡,所以内部网络的数据默认无法传出整个虚拟环境,只能在虚拟环境下通信。

创建Hyper-V内部网络细节

宿主机上创建内部网络后,会创建一个虚拟网卡,如下图的vEth(in),它会自动连接到内部网络虚拟交换机上。

需要手动设置内部网络中虚拟网卡的ip地址信息,并且将所有内部网络的ip设置为同一网段才能互相通信。例如,我准备将内部网络设置为10.10.10.0/24网段。

设置宿主机的vEth(in)虚拟网卡信息,其地址为10.10.10.10/24,不设置网关。

然后设置虚拟机的网卡信息,我有三台虚拟机,将它们放入内部网络后,手动修改它们的ip地址分别为:10.10.10.20/24、10.10.10.30/24、10.10.10.40/24。

然后测试宿主机内部网络地址10.10.10.10和其它虚拟机之间的两两互通信。测试时一定要关闭所有节点的防火墙。

内部网络与外界通信

内部网络因为没有连接到物理网卡,所以默认无法和虚拟环境之外的外部网络通信。

但是,可以在宿主机上,将外部网络中的虚拟网卡out或者物理网卡共享给内部网络中的虚拟网卡in(相当于开启了ip_forward转发功能),然后设置内部网络中的网卡,让它们的网关指向宿主机的虚拟网卡in的地址即可。如有域名解析必要,还需设置DNS服务器地址。

如下图,设置网络共享。

设置共享后,会自动修改in网卡IP地址,所以还需手动将in网卡地址重新设置回内部网络的地址10.10.10.10/24。

假设10.10.10.40主机想要和外界通信,设置该主机的网关为10.10.10.10即可,下面我还设置了DNS服务器:

现在10.10.10.40就可以和外界通信了。

Hyper-V默认虚拟交换机

Hyper-V还有一个在图形界面下不可修改的默认虚拟交换机(默认网络),设置为默认网络模式的虚拟机可与其他虚拟机以及宿主机之间互相通信,还能连接外网。

默认网络其实也是内部网络,只不过它配置了NAT功能。

私有网络(Private)

私有网络和内部网络的区别只有一点:不会为宿主机创建连接在私有网络虚拟交换机上的虚拟网卡。所以私有网络环境中,各虚拟机可以互相通信,但是不能和宿主机通信。

创建私有网络后,宿主机上不需要做任何操作,直接修改私有网络中的各虚拟主机的ip地址为同一网段即可。

外部、内部和私有网络的关系和转换

三种网络都是通过创建各自网络的虚拟交换机实现的,不同类型的网络对待宿主机上的网卡方式不同:

  • 外部网络会将虚拟交换机绑定到物理网卡,同时创建一个虚拟网卡并连接到虚拟交换机上
  • 内部网络为宿主机提供连接到内部网络虚拟交换机的虚拟网卡
  • 私有网络不会在宿主机上提供连接到私有网络虚拟交换机的虚拟网卡

实际上,它们是可以进行转换的。只不过Hyper-V图形界面管理工具没有提供该功能,但是可以通过在宿主机上使用Powershell命令行来操作。

例如:

  • 内部网络转换为私有网络:只需将宿主机上连接到内部网络虚拟交换机的虚拟网卡断开即可,也可以直接移除该虚拟网卡。
  • 私有网络转变成内部网络:在宿主机上添加虚拟网卡并连接到内部网络的虚拟交换机。
  • 外部网络转换成内部网络:在外部网络虚拟交换机上移除物理网卡即可。
  • 内部网络转换成外部网络:在内部网络虚拟交换机上添加物理网卡即可。