ARM模式下,Azure将公网IP地址作为一个资源(对象)独立出来,通过将其绑定到不同的资源(虚拟机,负载均衡器,应用程序网关等等)上来使用。
那么对于一个虚拟机来说,如果在创建的时候没有为其指定公网IP地址,外部是无法访问其内部的任何服务的(配合负载均衡器使用除外,这个后续再描述),原因是外部没有一个公网地址作为入口或者IP报文的目的端来进行报文发送。反过来,对于没有为网络接口绑定公网IP地址的虚拟机来说,在其内部访问公网的时候,是否能够进行通信呢?
我们通过下面的实验来测试一下:
准备环境:为了便于抓包测试,我们在中国东部创建了一台公网IP地址为139.219.188.238的ARM虚拟机并搭建了DNS Server,用来作为服务器端,在中国北部一个虚拟网络下创建了多台没有公网IP地址的ARM虚拟机作为客户端,同时在这个中国北部的虚拟网络下又创建了一台公网IP为42.159.119.65的虚拟机作为跳板机(原因是没有公网IP地址的虚拟机无法从外部直接RDP,所以需要通过跳板机来内网登陆)。
我们在中国北部的这些没有公网IP的虚拟机内进行DNS解析,并将解析使用的DNS服务器指向中国东部的服务器(139.219.188.238),同时在中国东部的服务器内进行抓包:
在中国东部的虚拟机(139.219.188.238)中的抓包结果:
由于我们在解析时DNS服务器的地址是这台中国东部的服务器,所以在这台服务器上能够抓取到对应的DNS请求的报文,从上面的抓包结果来看,我们发现,尽管我们在创建这些中国北部虚拟机的时候并未指定公网IP地址,但是Azure实际上,仍然允许这些虚拟机进行公网通信,同时,会为这些虚拟机分配一个公网IP地址(上面抓包结果中的42.159.117.176,42.159.117.46,139.217.10.214分别对应上面三台测试的客户端)用于通信。
进一步猜想,会不会这些公网IP地址是以一种隐式的方式分配给这三台客户端的呢?我们测试一下上面这三个IP地址,发现都无法ping通:
C:\Users\DanielHX>ping42.159.117.176
Pinging42.159.117.176 with 32 bytes of data:
Requesttimed out.
Pingstatistics for 42.159.117.176:
Packets: Sent = 1, Received = 0, Lost = 1(100% loss),
Control-C
^C
C:\Users\DanielHX>ping42.159.117.46
Pinging42.159.117.46 with 32 bytes of data:
Requesttimed out.
Requesttimed out.
Pingstatistics for 42.159.117.46:
Packets: Sent = 2, Received = 0, Lost = 2(100% loss),
Control-C
^C
C:\Users\DanielHX>ping139.217.10.214
Pinging139.217.10.214 with 32 bytes of data:
Requesttimed out.
Pingstatistics for 139.217.10.214:
Packets: Sent = 1, Received = 0, Lost = 1(100% loss),
Control-C
^C
对这些IP地址做端口扫描可以发现这些IP地址并没有开放任何端口,所以实际上这些地址并没有与这几台作为客户端的虚拟机进行关联,仅仅是作为一个临时的出口IP地址来让这些虚拟机可以访问公网而已。
使用同一台客户端虚拟机多次进行同样的DNS解析时,可以发现,对于同一台虚拟机,这些临时的IP地址在每次解析时是不变的,也就是会一直作为这台虚拟机的临时公网IP来使用。
我们进一步来做试验,将这几台虚拟机关闭掉,然后再开机。再次抓包:
从抓包可以发现,关闭虚拟机再开机后,这些虚拟机对应的临时公网IP地址也相应地发生了变化,即这些临时的公网IP地址是“动态的”。
那么如果虚拟机前端配置了负载均衡器呢?
我们创建一个外部负载均衡器,为其指定一个公网IP地址,并在这个负载均衡器的后端池里添加一个作为客户端的虚拟机:
在没有为负载均衡器配置负载平衡规则或者NAT规则的时候,为其指定的公共IP地址其实并没有获得具体的IP,所以此时,虚拟机仍然使用之前获得的临时IP地址来与公网通信。
接着我们添加一个NAT规则:
添加完NAT规则后,负载均衡器对应的公网IP也获取到了具体的地址42.159.124.97:
再看一下这台后端池里的虚拟机:
可以看到,这台虚拟机自动会将负载均衡器的前端IP作为自己的公网IP地址来使用,再次在这台虚拟机中进行DNS解析,DNS服务器仍然指向中国东部的那台服务器,并在这台东部的虚拟机内再次抓包,可以看到此时这台客户端虚拟机不再使用之前的临时公网IP地址来进行公网通信,而是使用负载均衡器的前端IP来进行通信:
进一步实验,我们将上面的负载均衡器删除,对应的公网IP删除后,这台客户端虚拟机仍然会使用上面的IP地址42.159.124.97作为其临时IP地址来通信。
总结一下上面的实验结果:
- 对于ARM下的虚拟机,在没有为其配置公网IP,且这台虚拟机没有在负载均衡器后面(或者负载均衡器未配置探测或者NAT规则,其前端IP没有获取到具体地址的前提下)的时候,Azure会为这台虚拟机分配一个临时的公网IP地址,这台虚拟机可以使用这个临时公网地址与公网通信。
- 在不关机的情况下,这个临时公网IP地址不会发生变化,但是虚拟机关机再开机后,这个IP地址会变化。
- 如果没有为虚拟机配置公网IP地址,而虚拟机在负载均衡器后面的时候,虚拟机会自动将负载均衡器的公网IP地址作为自己的公网地址与公网通信。