使用 Azure PowerShell 在混合式網路中部署及設定 Azure 防火牆
將內部部署網路連接到 Azure 虛擬網路來建立混合式網路時,控制對 Azure 網路資源的存取的能力,是整體安全計劃的重要組成部分。
您可以使用定義允許和拒絕網路流量的規則,在混合式網路中使用 Azure 防火牆來控制網路存取。
在本文中,您會建立三個虛擬網路:
- VNet-Hub:防火牆位於此虛擬網路中。
- VNet-Spoke:輪輻虛擬網路代表位於 Azure 的工作負載。
- VNet-Onprem:內部部署虛擬網路代表內部部署網路。 在實際部署中,您可以藉由使用虛擬私人網路 (VPN) 連線或 Azure ExpressRoute 連線進行連線。 為了簡單起見,本文使用 VPN 閘道連線,而位於 Azure 的虛擬網路代表內部部署網路。
如果您想要改為使用 Azure 入口網站來完成本文中的程序,請參閱使用 Azure 入口網站在混合式網路中部署和設定 Azure 防火牆。
注意
建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 若要開始使用,請參閱 安裝 Azure PowerShell。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az。
必要條件
本文要求在本機執行 PowerShell。 您必須已安裝 Azure PowerShell 模組。 執行 Get-Module -ListAvailable Az
以尋找版本。 如果您需要升級,請參閱安裝 Azure PowerShell 模組。 驗證 PowerShell 版本之後,請執行 Login-AzAccount
以建立與 Azure 的連線。
要讓此案例正常運作有三項重要需求:
輪輻子網路上使用者定義的路由 (UDR) 會指向 Azure 防火牆 IP 位址,作為預設閘道。 在此路由表上,必須停用虛擬網路閘道路由傳播。
中樞閘道子網路上的 UDR 必須指向防火牆 IP 位址,作為輪輻網路的下一個躍點。
Azure 防火牆子網路不需要任何 UDR,因為可從邊界閘道協定 (BGP) 得知路由。
當您對等互連 VNet-Hub 與 VNet-Spoke 時,請務必設定
AllowGatewayTransit
。 當您對等互連 VNet-Spoke 與 VNet-Hub 時,請設定UseRemoteGateways
。
本文稍後的建立路由一節會說明如何建立這些路由。
注意
「Azure 防火牆」必須能夠直接連線到網際網路。 若您的 AzureFirewallSubnet 子網路得知透過 BGP 傳送至內部部署網路的預設路由,則須將 Azure 防火牆設為強制通道模式。 若此為現有 Azure 防火牆執行個體且無法重新設定強制通道模式,則建議在 AzureFirewallSubnet 子網路上新增 0.0.0.0/0 UDR,並將 NextHopType
值設為 Internet
,以維持直接的網際網路連線。
如需詳細資訊,請參閱 Azure 防火牆強制通道。
即使 UDR 指向 Azure 防火牆作為預設閘道,系統仍會直接路由直接對等互連虛擬網路之間的流量。 在此案例中若要將子網路對子網路流量傳送到防火牆,UDR 必須在這兩個子網路上同時明確包含目標子網路網路首碼。
若要檢閱相關的 Azure PowerShell 參考文件,請參閱 New-AzFirewall。
如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
宣告變數
下列範例使用本文中的值來宣告變數。 在某些情況下,您可能需要以自己的值取代一些值,才能在您的訂用帳戶中運作。 視需要修改變數,然後將其複製並貼到您的 PowerShell 主控台中。
$RG1 = "FW-Hybrid-Test"
$Location1 = "East US"
# Variables for the firewall hub virtual network
$VNetnameHub = "VNet-Hub"
$SNnameHub = "AzureFirewallSubnet"
$VNetHubPrefix = "10.5.0.0/16"
$SNHubPrefix = "10.5.0.0/24"
$SNGWHubPrefix = "10.5.1.0/24"
$GWHubName = "GW-hub"
$GWHubpipName = "VNet-Hub-GW-pip"
$GWIPconfNameHub = "GW-ipconf-hub"
$ConnectionNameHub = "hub-to-Onprem"
# Variables for the spoke virtual network
$VnetNameSpoke = "VNet-Spoke"
$SNnameSpoke = "SN-Workload"
$VNetSpokePrefix = "10.6.0.0/16"
$SNSpokePrefix = "10.6.0.0/24"
$SNSpokeGWPrefix = "10.6.1.0/24"
# Variables for the on-premises virtual network
$VNetnameOnprem = "Vnet-Onprem"
$SNNameOnprem = "SN-Corp"
$VNetOnpremPrefix = "192.168.0.0/16"
$SNOnpremPrefix = "192.168.1.0/24"
$SNGWOnpremPrefix = "192.168.2.0/24"
$GWOnpremName = "GW-Onprem"
$GWIPconfNameOnprem = "GW-ipconf-Onprem"
$ConnectionNameOnprem = "Onprem-to-hub"
$GWOnprempipName = "VNet-Onprem-GW-pip"
$SNnameGW = "GatewaySubnet"
建立防火牆中樞虛擬網路
首先建立資源群組,以包含本文中的資源:
New-AzResourceGroup -Name $RG1 -Location $Location1
定義要包含在虛擬網路中的子網路:
$FWsub = New-AzVirtualNetworkSubnetConfig -Name $SNnameHub -AddressPrefix $SNHubPrefix
$GWsub = New-AzVirtualNetworkSubnetConfig -Name $SNnameGW -AddressPrefix $SNGWHubPrefix
建立防火牆中樞虛擬網路:
$VNetHub = New-AzVirtualNetwork -Name $VNetnameHub -ResourceGroupName $RG1 `
-Location $Location1 -AddressPrefix $VNetHubPrefix -Subnet $FWsub,$GWsub
要求一個公用 IP 位址,以配置給您將建立給虛擬網路使用的 VPN 閘道。 請注意,AllocationMethod
值是 Dynamic
。 您無法指定想要使用的 IP 位址。 該 IP 位址會以動態方式配置給您的 VPN 閘道。
$gwpip1 = New-AzPublicIpAddress -Name $GWHubpipName -ResourceGroupName $RG1 `
-Location $Location1 -AllocationMethod Dynamic
建立輪輻虛擬網路
定義要包含在輪輻虛擬網路中的子網路:
$Spokesub = New-AzVirtualNetworkSubnetConfig -Name $SNnameSpoke -AddressPrefix $SNSpokePrefix
$GWsubSpoke = New-AzVirtualNetworkSubnetConfig -Name $SNnameGW -AddressPrefix $SNSpokeGWPrefix
建立輪輻虛擬網路:
$VNetSpoke = New-AzVirtualNetwork -Name $VnetNameSpoke -ResourceGroupName $RG1 `
-Location $Location1 -AddressPrefix $VNetSpokePrefix -Subnet $Spokesub,$GWsubSpoke
建立內部部署虛擬網路
定義要包含在虛擬網路中的子網路:
$Onpremsub = New-AzVirtualNetworkSubnetConfig -Name $SNNameOnprem -AddressPrefix $SNOnpremPrefix
$GWOnpremsub = New-AzVirtualNetworkSubnetConfig -Name $SNnameGW -AddressPrefix $SNGWOnpremPrefix
建立內部部署虛擬網路:
$VNetOnprem = New-AzVirtualNetwork -Name $VNetnameOnprem -ResourceGroupName $RG1 `
-Location $Location1 -AddressPrefix $VNetOnpremPrefix -Subnet $Onpremsub,$GWOnpremsub
要求一個公用 IP 位址,以配置給您將建立給虛擬網路使用的閘道。 請注意,AllocationMethod
值是 Dynamic
。 您無法指定想要使用的 IP 位址。 該 IP 位址會以動態方式配置給您的閘道。
$gwOnprempip = New-AzPublicIpAddress -Name $GWOnprempipName -ResourceGroupName $RG1 `
-Location $Location1 -AllocationMethod Dynamic
設定及部署防火牆
現在將防火牆部署到中樞虛擬網路中:
# Get a public IP for the firewall
$FWpip = New-AzPublicIpAddress -Name "fw-pip" -ResourceGroupName $RG1 `
-Location $Location1 -AllocationMethod Static -Sku Standard
# Create the firewall
$Azfw = New-AzFirewall -Name AzFW01 -ResourceGroupName $RG1 -Location $Location1 -VirtualNetworkName $VNetnameHub -PublicIpName fw-pip
#Save the firewall private IP address for future use
$AzfwPrivateIP = $Azfw.IpConfigurations.privateipaddress
$AzfwPrivateIP
設定網路規則:
$Rule1 = New-AzFirewallNetworkRule -Name "AllowWeb" -Protocol TCP -SourceAddress $SNOnpremPrefix `
-DestinationAddress $VNetSpokePrefix -DestinationPort 80
$Rule2 = New-AzFirewallNetworkRule -Name "AllowRDP" -Protocol TCP -SourceAddress $SNOnpremPrefix `
-DestinationAddress $VNetSpokePrefix -DestinationPort 3389
$Rule3 = New-AzFirewallNetworkRule -Name "AllowPing" -Protocol ICMP -SourceAddress $SNOnpremPrefix `
-DestinationAddress $VNetSpokePrefix -DestinationPort
$NetRuleCollection = New-AzFirewallNetworkRuleCollection -Name RCNet01 -Priority 100 `
-Rule $Rule1,$Rule2 -ActionType "Allow"
$Azfw.NetworkRuleCollections = $NetRuleCollection
Set-AzFirewall -AzureFirewall $Azfw
建立及連線 VPN 閘道
中樞和內部部署虛擬網路都是透過 VPN 閘道連線。
建立中樞虛擬網路的 VPN 閘道
建立中樞虛擬網路的 VPN 閘道組態。 VPN 閘道器組態定義要使用的子網路和公用 IP 位址。
$vnet1 = Get-AzVirtualNetwork -Name $VNetnameHub -ResourceGroupName $RG1
$subnet1 = Get-AzVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet1
$gwipconf1 = New-AzVirtualNetworkGatewayIpConfig -Name $GWIPconfNameHub `
-Subnet $subnet1 -PublicIpAddress $gwpip1
現在建立中樞虛擬網路的 VPN 閘道。 網路對網路組態需要 RouteBased
的 VpnType
值。 視您選取的 SKU 而定,建立 VPN 閘道通常需要 45 分鐘或更久的時間。
New-AzVirtualNetworkGateway -Name $GWHubName -ResourceGroupName $RG1 `
-Location $Location1 -IpConfigurations $gwipconf1 -GatewayType Vpn `
-VpnType RouteBased -GatewaySku basic
建立虛擬網路的 VPN 內部部署閘道
建立內部部署虛擬網路的 VPN 閘道組態。 VPN 閘道器組態定義要使用的子網路和公用 IP 位址。
$vnet2 = Get-AzVirtualNetwork -Name $VNetnameOnprem -ResourceGroupName $RG1
$subnet2 = Get-AzVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet2
$gwipconf2 = New-AzVirtualNetworkGatewayIpConfig -Name $GWIPconfNameOnprem `
-Subnet $subnet2 -PublicIpAddress $gwOnprempip
現在建立虛擬網路的 VPN 內部部署閘道。 網路對網路組態需要 RouteBased
的 VpnType
值。 視您選取的 SKU 而定,建立 VPN 閘道通常需要 45 分鐘或更久的時間。
New-AzVirtualNetworkGateway -Name $GWOnpremName -ResourceGroupName $RG1 `
-Location $Location1 -IpConfigurations $gwipconf2 -GatewayType Vpn `
-VpnType RouteBased -GatewaySku basic
建立 VPN 連線
建立中樞與內部部署閘道之間的 VPN 連線。
取得 VPN 閘道
$vnetHubgw = Get-AzVirtualNetworkGateway -Name $GWHubName -ResourceGroupName $RG1
$vnetOnpremgw = Get-AzVirtualNetworkGateway -Name $GWOnpremName -ResourceGroupName $RG1
建立連線
在此步驟中,您會建立從中樞虛擬網路到內部部署虛擬網路的連線。 這些範例顯示共用金鑰,但您可以針對共用密鑰使用您自己的值。 但請務必確認該共用金鑰必須適用於這兩個連線。 建立連線可能需要一段時間才能完成。
New-AzVirtualNetworkGatewayConnection -Name $ConnectionNameHub -ResourceGroupName $RG1 `
-VirtualNetworkGateway1 $vnetHubgw -VirtualNetworkGateway2 $vnetOnpremgw -Location $Location1 `
-ConnectionType Vnet2Vnet -SharedKey 'AzureA1b2C3'
建立從內部部署到中樞的虛擬網路連線。 此步驟類似前一個步驟,只不過您是建立從 VNet-Onprem 到 VNet-Hub 的連線。 請確認共用金鑰相符。 稍候幾分鐘就會建立連線。
New-AzVirtualNetworkGatewayConnection -Name $ConnectionNameOnprem -ResourceGroupName $RG1 `
-VirtualNetworkGateway1 $vnetOnpremgw -VirtualNetworkGateway2 $vnetHubgw -Location $Location1 `
-ConnectionType Vnet2Vnet -SharedKey 'AzureA1b2C3'
驗證連線
您可以使用 Get-AzVirtualNetworkGatewayConnection
Cmdlet,並在搭配或不搭配 -Debug
的情況下驗證成功連線。
請使用下列 Cmdlet 範例,但是將值設定為與您狀況相符的值。 如果出現提示,請選取 A
以執行 All
。 在此範例中,-Name
是指您想要測試的連線名稱。
Get-AzVirtualNetworkGatewayConnection -Name $ConnectionNameHub -ResourceGroupName $RG1
完成 Cmdlet 之後,請檢視值。 下列範例顯示 Connected
的連線狀態,以及輸入和輸出位元組:
"connectionStatus": "Connected",
"ingressBytesTransferred": 33509044,
"egressBytesTransferred": 4142431
對等互連中樞與輪輻虛擬網路
現在對等互連中樞與輪輻虛擬網路:
# Peer hub to spoke
Add-AzVirtualNetworkPeering -Name HubtoSpoke -VirtualNetwork $VNetHub -RemoteVirtualNetworkId $VNetSpoke.Id -AllowGatewayTransit
# Peer spoke to hub
Add-AzVirtualNetworkPeering -Name SpoketoHub -VirtualNetwork $VNetSpoke -RemoteVirtualNetworkId $VNetHub.Id -AllowForwardedTraffic -UseRemoteGateways
建立路由
請使用下列命令來建立這些路由:
- 透過防火牆 IP 位址,從中樞閘道子網路到輪輻子網路的路由
- 透過防火牆 IP 位址,從輪輻子網路開始的預設路由
#Create a route table
$routeTableHubSpoke = New-AzRouteTable `
-Name 'UDR-Hub-Spoke' `
-ResourceGroupName $RG1 `
-location $Location1
#Create a route
Get-AzRouteTable `
-ResourceGroupName $RG1 `
-Name UDR-Hub-Spoke `
| Add-AzRouteConfig `
-Name "ToSpoke" `
-AddressPrefix $VNetSpokePrefix `
-NextHopType "VirtualAppliance" `
-NextHopIpAddress $AzfwPrivateIP `
| Set-AzRouteTable
#Associate the route table to the subnet
Set-AzVirtualNetworkSubnetConfig `
-VirtualNetwork $VNetHub `
-Name $SNnameGW `
-AddressPrefix $SNGWHubPrefix `
-RouteTable $routeTableHubSpoke | `
Set-AzVirtualNetwork
#Now, create the default route
#Create a table, with BGP route propagation disabled. The property is now called "Virtual network gateway route propagation," but the API still refers to the parameter as "DisableBgpRoutePropagation."
$routeTableSpokeDG = New-AzRouteTable `
-Name 'UDR-DG' `
-ResourceGroupName $RG1 `
-location $Location1 `
-DisableBgpRoutePropagation
#Create a route
Get-AzRouteTable `
-ResourceGroupName $RG1 `
-Name UDR-DG `
| Add-AzRouteConfig `
-Name "ToFirewall" `
-AddressPrefix 0.0.0.0/0 `
-NextHopType "VirtualAppliance" `
-NextHopIpAddress $AzfwPrivateIP `
| Set-AzRouteTable
#Associate the route table to the subnet
Set-AzVirtualNetworkSubnetConfig `
-VirtualNetwork $VNetSpoke `
-Name $SNnameSpoke `
-AddressPrefix $SNSpokePrefix `
-RouteTable $routeTableSpokeDG | `
Set-AzVirtualNetwork
建立虛擬機器
建立輪輻工作負載和內部部署虛擬機器,並將其放在適當的子網路中。
建立工作負載虛擬機器
在輪輻虛擬網路中建立虛擬機器,其執行 Internet Information Services (IIS)、沒有公用 IP 位址且允許 Ping。 出現提示時,輸入虛擬機器的使用者名稱和密碼。
# Create an inbound network security group rule for ports 3389 and 80
$nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name Allow-RDP -Protocol Tcp `
-Direction Inbound -Priority 200 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix $SNSpokePrefix -DestinationPortRange 3389 -Access Allow
$nsgRuleWeb = New-AzNetworkSecurityRuleConfig -Name Allow-web -Protocol Tcp `
-Direction Inbound -Priority 202 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix $SNSpokePrefix -DestinationPortRange 80 -Access Allow
# Create a network security group
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $RG1 -Location $Location1 -Name NSG-Spoke02 -SecurityRules $nsgRuleRDP,$nsgRuleWeb
#Create the NIC
$NIC = New-AzNetworkInterface -Name spoke-01 -ResourceGroupName $RG1 -Location $Location1 -SubnetId $VnetSpoke.Subnets[0].Id -NetworkSecurityGroupId $nsg.Id
#Define the virtual machine
$VirtualMachine = New-AzVMConfig -VMName VM-Spoke-01 -VMSize "Standard_DS2"
$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName Spoke-01 -ProvisionVMAgent -EnableAutoUpdate
$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $NIC.Id
$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName 'MicrosoftWindowsServer' -Offer 'WindowsServer' -Skus '2016-Datacenter' -Version latest
#Create the virtual machine
New-AzVM -ResourceGroupName $RG1 -Location $Location1 -VM $VirtualMachine -Verbose
#Install IIS on the VM
Set-AzVMExtension `
-ResourceGroupName $RG1 `
-ExtensionName IIS `
-VMName VM-Spoke-01 `
-Publisher Microsoft.Compute `
-ExtensionType CustomScriptExtension `
-TypeHandlerVersion 1.4 `
-SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server"}' `
-Location $Location1
#Create a host firewall rule to allow pings in
Set-AzVMExtension `
-ResourceGroupName $RG1 `
-ExtensionName IIS `
-VMName VM-Spoke-01 `
-Publisher Microsoft.Compute `
-ExtensionType CustomScriptExtension `
-TypeHandlerVersion 1.4 `
-SettingString '{"commandToExecute":"powershell New-NetFirewallRule –DisplayName "Allow ICMPv4-In" –Protocol ICMPv4"}' `
-Location $Location1
建立內部部署虛擬機器
建立簡單虛擬機器,您可用來透過遠端存取連線到公用 IP 位址。 從該處,您可透過防火牆接著連線到內部部署伺服器。 出現提示時,輸入虛擬機器的使用者名稱和密碼。
New-AzVm `
-ResourceGroupName $RG1 `
-Name "VM-Onprem" `
-Location $Location1 `
-VirtualNetworkName $VNetnameOnprem `
-SubnetName $SNNameOnprem `
-OpenPorts 3389 `
-Size "Standard_DS2"
注意
無論是未獲指派公用 IP 位址的 VM,或位於內部基本 Azure 負載平衡器後端集區的 VM,Azure 都會為其提供預設輸出存取 IP。 預設輸出存取 IP 機制能提供無法自行設定的輸出 IP 位址。
發生下列其中一個事件時,會停用預設輸出存取 IP:
- 公用 IP 位址會指派給 VM。
- 無論有沒有輸出規則,都會將 VM 放在標準負載平衡器的後端集區中。
- Azure NAT 閘道資源會指派給 VM 的子網。
您在彈性協調流程模式中使用虛擬機器擴展集建立的 VM 沒有預設輸出存取。
如需 Azure 中輸出連線的詳細資訊,請參閱 Azure 中的預設對外存取與針對輸出連線,使用來源網路位址轉譯 (SNAT)。
測試防火牆
取得然後記下 VM-spoke-01 虛擬機器的私人 IP 位址:
$NIC.IpConfigurations.privateipaddress
從 Azure 入口網站,連線到 VM-Onprem 虛擬機器。
在 VM-Onprem 上開啟 Windows PowerShell 命令提示字元,然後 Ping VM-spoke-01 的私人 IP。 您應該取得回覆。
在 VM-Onprem 上開啟網頁瀏覽器,並瀏覽至
http://<VM-spoke-01 private IP>
。 IIS 預設頁面應該會開啟。從 VM-Onprem,針對位於私人 IP 位址的 VM-spoke-01 開啟遠端存取連線。 您的連線應會成功,而且應該能夠使用您所選的使用者名稱和密碼登入。
既然您已確認防火牆規則正在運作,您可以:
- Ping 輪輻虛擬網路上的伺服器。
- 瀏覽至輪輻虛擬網路上的網頁伺服器。
- 使用 RDP 連線到輪輻虛擬網路上的伺服器。
接下來,執行下列指令碼,將防火牆網路規則集合的動作變更為 Deny
:
$rcNet = $azfw.GetNetworkRuleCollectionByName("RCNet01")
$rcNet.action.type = "Deny"
Set-AzFirewall -AzureFirewall $azfw
關閉任何現有的遠端存取連線。 再次執行測試,以測試變更的規則。 這次所有測試應該都會失敗。
清除資源
您可以保留防火牆資源,以供下一個教學課程使用。 如果您不再需要這些項目,刪除 [FW-Hybrid-Test] 資源群組以刪除所有防火牆相關資源。