在Azure中,可以通过App Service快速部署,构建自定义站点(PaaS服务)。默认情况下,这些站点被访问URL都是面向公网,通过公网进行解析。为了最好的安全保障,是否可以有一种功能实现只能内网访问呢?并且为了在企业内部使用,还需要配置私有的自定义域名(如myapp.aaa)?
说明:虽然App Service提供了可以集成虚拟网络(内网),但是这样的集成是指作为App Service服务器实例可以访问到虚拟网络VNET 中的资源(如SQL Service,内网API等),而App Service自身的访问还是通过公网URL访问。所以它并不能实现内网访问App Service目的
前言
架构
分析需求,为了实现本文目标,在Azure中所需要创建的资源有:
1) 应用服务 App Service,部署应用并启用私有终结点(Private Endpoint),提供最终端的访问服务
2) 虚拟网络 VNET,企业的内网,只能在该网络中才能访问应用服务
3) 虚拟机VM,部署在虚拟网络中,一方面作为自定义DNS服务器,同时也作为内网客户端,测试内网访问应用服务是否成功
4) (可选)可解析的公网域名,主要用于App Service的自定义域名所有权验证,使用后可删除
5) (可选) 应用程序网关Application Gateway,实现关联内网自定义域名和应用服务App Service的网关
准备Azure资源
如资源已经创建,可跳过此部分
一:新建应用服务
- 登录Azure门户(中国区): https://portal.azure.cn/
- 选择App Service,点击“Add”创建新的Web App
- Subscription为默认订阅或选择合适的订阅
- Resource Group 点击“Create new”,输入“myCorpRG”
- Web App Name 输入“myinternalapp01”
- Publish为默认Code模式
- Runtime Stack选择.NET 5, Operating Ssystem为Windows,也可根据自己需求选择
- Region选择China North 2 或者China East 2 (因Private Endpoint功能在中国区只有2区支持)
- App Service Plan 点击“Create new”,输入“myinternalplan”
- Sku and size 需要至少选择Premium V2 P2v2, 也可选择PremiumV3 和 Isolated,其他定价层不支持Private Endpoint
- Monitoring Tab页中,本文不开启Application Insights,如实际项目需要,可以开启。
- 点击“Review + Create”,创建Web App资源
动画演示:
参考官方创建文档:
在 Azure 中创建 ASP.NET Core Web 应用:https://docs.azure.cn/zh-cn/app-service/quickstart-dotnetcore?tabs=netcore31&pivots=platform-windows
Using Private Endpoints for Azure Web App:https://docs.microsoft.com/en-us/azure/app-service/networking/private-endpoint
二:新建虚拟网络
- 选择Virtual networks,点击“Add/Create”创建新的Virtual networks
- Resource Group选择“myCorpRG”, 为上一节创建应用服务时所建,保持实验中所有资源在同一个组中
- Virtual Network Name输入 myinternalvnet01
- Region选择China North 2,保持本次实验中所有资源在同一个区域
- IP Addresses根据默认值而定,如10.3.0.0/16(有效内网地址范围 10.3.0.0 ~ 10.3.255.255。共计65536个IP地址)
- Subnet 子网,除了默认的default外,还需要创建2个
- 为App Service Private Endpoint创建一个新子网, name: appprivatesubnet, address 10.3.1.0/24
- 为Application Gateway创建一个新子网, name: appgatewaysubnet, address 10.3.2.0/24
- 点击Next按钮,其他Security,Tags保持默认值
- 点击Review +Create, 创建Virtual networks资源
快速入门:使用 Azure 门户创建虚拟网络:https://docs.azure.cn/zh-cn/virtual-network/quick-create-portal
三:新建虚拟机
该虚拟机在本次实验中即作为自定义的DNS服务器,同时也作为实验中访问Web App 站点的客户端
- 选择Virtual machine,点击“Add/Create”创建新的Virtual machine
- Resource Group选择“myCorpRG”, 为第一节创建应用服务时所建,保持实验中所有资源在同一个组中
- Virtual machine name输入myinternalvm01
- Image 选择 Windows Server 2019 Datacenter – Gen1, 也可以根据自己的情况选择,需要能作为内网的DNS 服务器
- Size 选择 Standard_DS2_v2, 实际需求中可以选择更高的定价层
- 设置RDP虚拟机的Username 和Password, 如myadmin, 1qaz@WSX3edc
- Inbound ports 看起3389,用于RDP连接
- 下一步,设置Disks,如无其他需求,保持默认即可
- 下一步设置Networking,选择第二步中创建的Virtual network(myinternalvnet01)
- 选择subnet为默认的default。
- Public IP点击Create New,创建一个新的公网IP,用于RDP连接,Name输入myinternalvm01-ip, SKU选择Basic,Assignment为Dynamic方式,动态分配IP地址
- 点击Next按钮,其他Management, Advanced,Tags保持默认值
- 点击Review +Create, 创建Virtual machine资源
快速入门:在 Azure 门户中创建 Windows 虚拟机:https://docs.azure.cn/zh-cn/virtual-machines/windows/quick-create-portal
四:配置Private Endpoint
- 登录Azure App Service门户(中国区): https://portal.azure.cn/?l=en.en-us#blade/HubsExtension/BrowseResourceBlade/resourceType/Microsoft.Web%2Fsites
- 选择myinternalapp01 App Service,点击“Networking”并选择Private Endpoint Connections
- 点击“Add”,输入Private Endpoint的名称myappprivate01
- 选择Virtual network为myinternalvnet01
- 选择Subnet为appprivatesubnet
- Integrate with private DNS zone为 No,自己搭建DNS服务器(当然,也可以选择Private DNS Zone)
- 点击OK,创建成功
PS: Private Endpoint启动成功后,App Service即无法从公网访问,需要在Virtual Network (myinternalvnet01)所在的VM中访问,但需要配置正确的DNS,CNAME及A记录,在下一节中即将介绍
五:实现默认App Service域名内网访问
根据Private Endpoint启用后的DNS配置文档,需要在内网的DNS服务器中配置两条DNS记录
myinternalapp01.chinacloudsites.cn | CNAME | myinternalapp01.privatelink.chinacloudsites.cn |
A | 10.3.1.4 私网IP地址可以在VNET中Connected devices(已连接设备)查看内网IP地址 |
RDP到VM(myinternalvm01) 并启用DNS服务
- 添加CNAME和A记录
- 在VM中启动DNS Manager
- 右键点击Forward Lookup Zones,选择New Zone
- 默认选择使用Primary zone
- 输入Zone名称 chinacloudsites.cn
- 下一步,下一步,点击Finish按钮
- 等待Zone创建完成后,选择chinacloudsites.cn Zone, 右键添加新CNAME 和A记录
- 回到Azure门户中,在虚拟网络(VNET)中设置自定义DNS Server,IP地址为10.3.0.4
- 重启VM,然后RDP并验证默认域名访问是否成功:myinternalapp01.chinacloudsites.cn
Private Endpoint DNS: https://docs.microsoft.com/en-us/azure/app-service/networking/private-endpoint#dns
六:配置自定义域名(内网)
根据以上的步骤,已经可以通过默认的App Service域名访问成功。接下来的步骤就是配置内网的自定义域名。如myapp.aaa。如果在内网DNS中直接配置CNAME指向App Service默认域名,虽然通过nslookup或者nameresolver.exe解析能够指向App Service的内网IP,但是在访问时候会遇见404错误
为了解决自定义域名访问404的问题,必须使此域名(myapp.aaa)与App Service的进行域名绑定,因为域名并没有aaa的顶级域名,所以通过验证域名所有权的方式无法实现绑定到aaa不是公认的域名。
- 但是如果有一个公有域名(如xxx.com)可以临时借用,用于验证App Service与域名之间的所有权,当验证成功后,就可以在公网DNS上解除CNAME,或A记录的绑定。然后在内网DNS中配置域名与App Service的CNAME记录。实现在内网中自定义域名的访问。详细的配置步骤见方案一
- 但是如果没有这样的一个公网域名,且必须在内网中使用如aaa的域名,则可以通过网关的方式实现。使用基于虚拟网络搭建的Application Gateway,让myapp.aaa域名与Application Gateway的内网IP地址绑定,让请求转换到App Service。详细的配置步骤见方案二
方案一:添加应用程序App Service自定义域名
此实验中,使用myapp.mylubu.com作为与App Service进行域名绑定,并验证域名所有权
1) 进入App Service的Custom Domain页面,点击Add custom domain按钮
2) 输入myapp.mylubu.com,点击 validate。提示Domain ownership验证失败,需要在DNS上配置一个CNAME记录和一个asuid.{subdomain}记录
3) 实验中使用的时Azure的Public DNS Zone,进入mylubu.com DNS Zone,添加CNAME记录
4) 添加asuid.myapp的TXT记录
5) 回到App Service的Custom Domain页面(#1), 重复验证myapp.mylubu.com域名,直至成功后绑定域名成功
6) 再次回到Public DNS Zone页面。删除为mylubu.com添加的CNAME和TXT记录
7) RDP到VM中,进入私网DNS服务器,为myapp.mylubu.com配置内网DNS CNAME记录。
8) 在VM中访问myapp.mylubu.com成功
PS:在验证域名所有权时,myapp.mylubu.com必须公网可解析
将现有的自定义 DNS 名称映射到 Azure 应用服务:https://docs.azure.cn/zh-cn/app-service/app-service-web-tutorial-custom-domain
方案二:新建应用程序网关Application Gateway实现域名转换
创建内网应用程序网关,在网关中设置后端池为App Service。
- 选择Application gateways,点击“Add/Create”创建新的application gateway
- Application gateway name输入 myinternalappgateway01
- Tier 选择 Standard, 因实验中只需要开启Private IP地址即可
- 其他Instance Count, SKU size, HTTP2等设定。保持默认
- Virtual Network中选择 myinternalvnet01
- Subnet选择 appgatewaysubnet, 均在创建虚拟网络时准备好。
- Next : Forntends页面中,Forntend IP address type选择 Private,并且Use a specific private IP address 设置为No,然系统自动分配一个内网IP。
- Next : Backends 页面中,点击“Add a Backend Pool”, Name输入backendpool01,Target Type设置为App Services , Target选择 myinternalapp01
- Next : Configuration 页面中,配置Routing rule, 点击Add a routing rule
- Rule name输入为 rule01
- Listener name输入 listener01
- Frontend IP选择 Private
- Protocol 为HTTP
- Port 为80, Listener的其他选项则选择默认值
- 在Backend Targets中,设置Target type为Backend pool
- Backend target选择第12步中创建的backendpool01
- HTTP settings则需要点击”Add new”按钮,新增HTTP的规则
- HTTP settings name 输入 httpsetting01
- Backend Protocol 选择HTTP, Backend Port为80端口
- Additional settings部分全部保持默认值
- Host Name部分中,设定Override with new host name 为Yes, Host name override为 Pick Host name from backend target
- Create custom probes为默认值 Yes
- 点击Add按钮,回到Configuration配置页面
- 点击Next : Tags
- 点击 Next : Review + Create。创建Application Gateway。
- 在Application Gateway中查看Backend Pool Healthy状态。等待状态值为正常后,RDP到VM中,使用Application Gateway的内网IP地址访问,验证是否成功访问App Service。
- 为内网域名myapp.aaa添加A记录,指定到Application Gateway的Private IP。
- 验证myapp.aaa成功访问app service
PS:当应用程序网关创建好之后,在Backend Health中查看后端池的健康状态非常重要。只有状态为Healthy的后端才能成功访问
使用 Azure 应用程序网关定向 Web 流量 - Azure 门户:https://docs.azure.cn/zh-cn/application-gateway/quick-create-portal
七:下载Azure资源包
本文实验使用的所有资源模板文件下载: https://files.cnblogs.com/files/lulight/myCorpRG-ARM-Template.zip
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!