今天来讨论下Azure虚拟网络中的endpoint功能,虚拟网络是什么相信已经有很多博客有过一些介绍了,对于云比较了解的同学应该不需要再介绍了,各家云厂商对于虚拟网络的叫法虽然不一样,但是本质上都是一个东西,AWS和Ali叫VPC,Azure则叫Virtual Network


Azure 虚拟网络允许许多类型的 Azure 资源(例如 Azure 虚拟机 (VM))以安全方式彼此通信、与 Internet 通信,以及与本地网络通信。一个虚拟网络局限于一个区域;但是,可以使用虚拟网络对等互连将不同区域的多个虚拟网络连接起来。


Azure 资源可以采用下述某种方式安全地相互通信:

  • 通过虚拟网络:可以将 VM 和多个其他类型的 Azure 资源部署到虚拟网络,如 Azure 应用服务环境、Azure Kubernetes 服务 (AKS) 和 Azure 虚拟机规模集。

  • 通过虚拟网络服务终结点:通过直接连接将虚拟网络专用地址空间和虚拟网络的标识扩展到 Azure 服务资源,例如 Azure 存储帐户和 Azure SQL 数据库。 使用服务终结点可以保护关键的 Azure 服务资源,只允许在客户自己的虚拟网络中对其进行访问


可组合使用以下任何选项将本地计算机和网络连接到虚拟网络:

  • 点到站点虚拟专用网络: 在网络中的虚拟网络和单台计算机之间建立连接。要与虚拟网络建立连接的每台计算机必须配置其连接。 这种连接类型适用于刚开始使用 Azure 的人员或开发人员,因为该连接类型仅需对现有网络作出极少更改或不做任何更改。计算机与虚拟网络之间的通信经 Internet 通过加密的通道来发送。

  • 站点到站点: 在本地设备和虚拟网络中部署的 Azure网关之间建立连接。 此连接类型可使授权的任何本地资源访问虚拟网络。本地设备和 Azure 网关之间的通信经 Internet 通过加密的通道来发送。

  • Azure Express Route: 通过 Express Route 合作伙伴在网络和 Azure 之间建立连接。 此连接是专用连接。流量不经过 Internet。



以上是关于Azure虚拟网络的一些基本介绍,注意到在Azure资源之间通信的方法中,有一种是通过一个叫做endpoint的东西,那么什么是这个endpoint,今天来介绍一下


首先来看下endpoint的一些介绍

虚拟网络 (VNet) 服务终结点可通过直接连接将 VNet 的虚拟网络专用地址空间和标识扩展到 Azure 服务。 使用终结点可以保护关键的 Azure 服务资源,只允许在客户自己的虚拟网络中对其进行访问。 从 VNet 发往 Azure 服务的流量始终保留在 Microsoft Azure 主干网络中


目前支持endpoint的服务主要有以下这些

Azure 存储:在所有 Azure 区域正式发布。

Azure SQL 数据库:在所有 Azure 区域正式发布。

Azure SQL 数据仓库:在所有 Azure 区域正式发布。

Azure Database for PostgreSQL 服务器:在可以使用数据库服务的 Azure 区域中通常可用。

Azure Database for MySQL 服务器:在可以使用数据库服务的 Azure 区域中通常可用。

Azure Cosmos DB:在所有 Azure 公有云区域正式发布。

Azure Key Vault:在所有 Azure 公有云区域正式发布。

Azure 服务总线:在所有 Azure 公有云区域正式发布。

Azure 事件中心:在所有 Azure 公有云区域正式发布。


那么Endpoint有什么优势呢?

主要有以下几点:


  • 提高了 Azure 服务资源的安全性:VNet 专用地址空间可能重叠,因此不能用于唯一标识源自 VNet 的流量。通过将 VNet 标识扩展到服务,服务终结点可以将对 Azure 服务资源的访问限定到你的虚拟网络。在虚拟网络中启用服务终结点后,可以通过将虚拟网络规则添加到资源,在虚拟网络中保护 Azure 服务资源。 这完全消除了通过公共 Internet 对资源进行访问的可能性,并仅允许来自自己虚拟网络的流量,从而提高了安全性。


  因为虚拟网络的IP地址很多时候并不一定是唯一的,所以通过IP地址的形式控制网络的进出站流量,很多时候会造成一些误解,并且因为PaaS服务的IP地址经常会发生变化,也没有办法通过IP地址形式控制出入站,所以endpoint是一种很方便的方法,可以通过endpoint直接开启/关闭对于某些PaaS服务的出入站流量。这是一种很有效的补充



  • 来自虚拟网络的 Azure 服务流量的最佳路由:当前,虚拟网络中强制 Internet 流量通过本地和/或虚拟设备(称为强制隧道)的任何路由也会强制 Azure 服务流量采用与 Internet 流量相同的路由。 服务终结点为 Azure 流量提供最佳路由。
    终结点始终将直接来自虚拟网络的服务流量转发到 Microsoft Azure 主干网络上的服务。将流量保留在 Azure 主干网络上可以通过强制隧道持续审核和监视来自虚拟网络的出站 Internet 流量,而不会影响服务流量。

   

  默认情况下,对于从Azure VM访问某些PaaS服务,比如Azure SQL,路由其实是先出站到Internet,然后再访问到PaaS服务的公网IP,这个流量看上去像是在公网走了一圈,其实这些访问还是发生在Azure数据中心内部的,但是确实是先出站到Internet,才会访问PaaS服务的,那么开启endpoint之后会如何呢?开启endpiint之后,会单独添加一条到PaaS服务的路由,访问PaaS服务时会直接跳到PaaS服务,而不会先出站到Internet


实际举例来说,比如从Azure VM访问Azure SQL

不开Endpoint:在Azure SQL中看到的client IP会是一个公网IP

开启Endpoint: 在Azure SQL中看到的client IP会是一个私网 IP


  • 设置简单,管理开销更少:不再需要使用虚拟网络中的保留公共 IP 地址通过 IP 防火墙保护 Azure 资源。 无需使用 NAT 或网关设备即可设置服务终结点。 只需单击一下子网,即可配置服务终结点。 不会产生与终结点维护相关的额外开销。

    

  和第一点比较类似,开启endpoint对于控制安全来讲,会方便很多


当然了,endpoint本身也存在一些限制,比如:


  • 该功能仅适用于使用 Azure 资源管理器部署模型部署的虚拟网络。

  • 终结点在 Azure 虚拟网络中配置的子网上启用。 终结点不可用于从本地发往 Azure 服务的流量。

  • 对于 Azure SQL,服务终结点仅适用于虚拟网络区域中的 Azure 服务流量。对于 Azure 存储,为了支持 RA-GRS 和 GRS 流量,终结点还进行扩展以包括虚拟网络所部署到的配对区域。

  • 就 ADLS Gen 1 来说,VNet 集成功能仅适用于同一区域中的虚拟网络。

光这么说可能对于endpoint的理解,还是比较模糊


下边来举个实际的例子,比如现在有这么一个需求,希望禁止所有VM出站到internet的流量,仅保留到Azure SQL或者Azure database for MySQL的这种流量

这种规则当然是要靠NSG实现的,那么规则如何设置呢?


首先来看下基本环境的搭建,实验基本包含以下Azure组件

l Azure VM * 1: EndpointVM

l Azure SQL * 1: EndpointSQL


首先,第一步创建VM

clip_image002

clip_image004

clip_image006

clip_image008



第二步:创建Azure SQL

clip_image002[4]

clip_image004[4]

clip_image006[4]

这里需要注意,Azure SQL中有项设置叫allow access to Azure services

clip_image008[4]


这个是什么意思呢?我们可以通过一个实验了解

以下是一个在我本地的服务器,通过连接工具访问Azure SQL时可以看到会被提示IP不在白名单中

clip_image010

clip_image012


但在Azure VM通过SSMS进行连接测试,发现可以访问

clip_image014


关闭允许访问Azure服务选项后再次测试

clip_image016


再次在Azure VM中访问

clip_image018


此时会发现已经没办法访问了

clip_image020


因此实际上允许访问Azure服务这个选项开启后,Azure VM不需要添加白名单即可访问Azure SQL服务

再次测试开启允许访问Azure服务,同时在安全组直接限制所有出站

clip_image022

clip_image024


开启允许访问Azure服务选项,但是限制所有的出站,再次测试访问情况,访问失败提示超时

也就是说:开启允许访问Azure服务选项时,只是不需要单独开IP的白名单,当时不是直接走内网,实际走的也是公网,只不过在检测时因为是Azure的IP,所以直接放行了,这和开启endpoint是不一样的

关闭允许访问Azure服务选项

clip_image026

clip_image028


之后添加Endpoint

clip_image030

clip_image032

clip_image034

clip_image036


可以看到endPoint已经添加成功

clip_image038


之后添加虚拟网络规则

clip_image040

clip_image042


再次测试,仍然无法访问

clip_image044


添加到Azure SQL的允许出站的规则

clip_image046

clip_image048

clip_image050


再次测试

clip_image052


可以连接

clip_image054

所以,总结来说,通过endpoint,可以非常方便控制IaaS VM对于PaaS服务的访问情况