使用 Azure PowerShell 在混合式網路中部署和設定 Azure 防火牆

將內部部署網路連接到 Azure 虛擬網路來建立混合式網路時,控制對 Azure 網路資源的存取的能力,是整體安全計劃的重要組成部分。

您可以使用 Azure 防火牆,使用定義允許和拒絕網路流量的規則來控制混合式網路中的網路存取。

在本文中,您會建立三個虛擬網路:

  • VNet-Hub:防火牆位於此虛擬網路中。
  • VNet 輪輻:輪輻虛擬網路代表位於 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 輪輻時進行設定AllowGatewayTransit。 將 VNet 輪輻對等互連VNet-Hub 時設定UseRemoteGateways

本文稍後的建立路由一節說明如何建立這些路由。

注意

「Azure 防火牆」必須能夠直接連線到網際網路。 如果您的 AzureFirewallSubnet 子網透過 BGP 學習到內部部署網路的預設路由,您必須以強制通道模式設定 Azure 防火牆。 如果這是無法在強制通道模式中重新設定Internet的現有 Azure 防火牆 實例,建議您在 AzureFirewallSubnet 子網NextHopType新增 0.0.0.0.0/0 UDR,並將設定為 維持直接因特網連線的值。

如需詳細資訊,請參閱 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 位址。 它會動態配置給您的 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 位址。 它會動態配置給您的閘道。

$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 閘道。 網路對網路組態需要 VpnType 的值 RouteBased。 根據您選取的 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 閘道。 網路對網路組態需要 VpnType 的值 RouteBased。 根據您選取的 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-OnpremVNet-Hub 的連線。 請確定共用金鑰相符。 聯機會在幾分鐘后建立。

New-AzVirtualNetworkGatewayConnection -Name $ConnectionNameOnprem -ResourceGroupName $RG1 `
-VirtualNetworkGateway1 $vnetOnpremgw -VirtualNetworkGateway2 $vnetHubgw -Location $Location1 `
-ConnectionType Vnet2Vnet -SharedKey 'AzureA1b2C3'

驗證連線

您可以使用 Cmdlet,搭配或不使用 -Debug來驗證成功的連線Get-AzVirtualNetworkGatewayConnection

使用下列 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

建立虛擬機器

建立輪輻工作負載和內部部署虛擬機,並將其放在適當的子網中。

建立工作負載虛擬機器

在輪輻虛擬網路中建立執行 網際網路資訊服務 的虛擬機 (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"

注意

Azure 會針對未獲指派公用 IP 位址或位於內部基本 Azure 負載平衡器後端集區中的 VM,提供預設輸出存取 IP。 預設輸出存取 IP 機制能提供無法自行設定的輸出 IP 位址。

發生下列其中一個事件時,會停用預設輸出存取 IP:

  • 系統會指派公用 IP 位址給 VM。
  • 無論有沒有輸出規則,都會將 VM 放在標準負載平衡器的後端集區中。
  • Azure NAT 閘道資源會指派給 VM 的子網。

在彈性協調流程模式中使用虛擬機器擴展集建立的 VM 不會有預設輸出存取。

如需 Azure 中輸出連線的詳細資訊,請參閱 Azure 中的預設對外存取針對輸出連線使用來源網路位址轉譯 (SNAT)

測試防火牆

  1. 取得並記下 VM-spoke-01 虛擬機的私人 IP 位址

    $NIC.IpConfigurations.privateipaddress
    
  2. 從 Azure 入口網站,連線到 VM-Onprem 虛擬機器。

  3. 在 VM-Onprem 上開啟 Windows PowerShell 命令提示字元,並偵測 VM-spoke-01 的私人 IP 您應該會收到回復。

  4. 在 VM-Onprem開啟網頁瀏覽器,然後瀏覽至 http://<VM-spoke-01 private IP>。 IIS 預設頁面應該會開啟。

  5. VM-Onprem,在私人 IP 位址開啟 VM-spoke-01 的遠端訪問連線。 您的連線應該會成功,而且您應該能夠使用您選擇的使用者名稱和密碼登入。

既然您已確認防火牆規則正常運作,您可以:

  • Ping 輪輻虛擬網路上的伺服器。
  • 流覽至輪輻虛擬網路上的網頁伺服器。
  • 連線 到輪輻虛擬網路上的伺服器,方法是使用 RDP。

接下來,執行下列文稿,將防火牆網路規則集合的動作變更為 Deny

$rcNet = $azfw.GetNetworkRuleCollectionByName("RCNet01")
$rcNet.action.type = "Deny"

Set-AzFirewall -AzureFirewall $azfw

關閉任何現有的遠端訪問連線。 再次執行測試,以測試變更的規則。 這次所有測試應該都會失敗。

清除資源

您可以保留防火牆資源以供下一個教學課程使用。 如果您不再需要這些資源,請刪除 FW-Hybrid-Test 資源群組,以刪除所有防火牆相關資源。

下一步

監視 Azure 防火牆 記錄