前言
在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
二:新建虛擬網路
- 登入Azure門戶(中國區): https://portal.azure.cn/
- 選擇Virtual networks,點選“Add/Create”建立新的Virtual networks
- Subscription為預設訂閱或選擇合適的訂閱
- 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 站點的客戶端
- 登入Azure門戶(中國區): https://portal.azure.cn/
- 選擇Virtual machine,點選“Add/Create”建立新的Virtual machine
- Subscription為預設訂閱或選擇合適的訂閱
- Resource Group選擇“myCorpRG”, 為第一節建立應用服務時所建,保持實驗中所有資源在同一個組中
- Virtual machine name輸入myinternalvm01
- Region選擇China North 2,保持本次實驗中所有資源在同一個區域
- 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記錄,在下一節中即將介紹
動畫演示:
參考官方建立文件:
Using Private Endpoints for Azure Web App:https://docs.microsoft.com/en-us/azure/app-service/networking/private-endpoint
五:實現預設App Service域名內網訪問
根據Private Endpoint啟用後的DNS配置文件,需要在內網的DNS伺服器中配置兩條DNS記錄
myinternalapp01.chinacloudsites.cn |
CNAME |
myinternalapp01.privatelink.chinacloudsites.cn |
myinternalapp01.privatelink.chinacloudsites.cn |
A |
10.3.1.4 私網IP地址可以在VNET中Connected devices(已連線裝置)檢視內網IP地址 |
RDP到VM(myinternalvm01) 並啟用DNS服務
- 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。
- 登入Azure門戶(中國區): https://portal.azure.cn/
- 選擇Application gateways,點選“Add/Create”建立新的application gateway
- Subscription為預設訂閱或選擇合適的訂閱
- Resource Group選擇“myCorpRG”, 為第一節建立應用服務時所建,保持實驗中所有資源在同一個組中
- Application gateway name輸入 myinternalappgateway01
- Region選擇China North 2,保持本次實驗中所有資源在同一個區域
- 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