在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
當在複雜的環境中面臨問題,格物之道需:濁而靜之徐清,安以動之徐生。 雲中,恰是如此!