Azure PowerShell を使用してハイブリッド ネットワークに Azure Firewall をデプロイして構成する

オンプレミス ネットワークを Azure 仮想ネットワークに接続してハイブリッド ネットワークを作成する場合、ご利用の Azure ネットワーク リソースへのアクセスを制御する機能が、全体的なセキュリティ プランの中で重要な役割を果たします。

Azure Firewall を使用すれば、許可および拒否するそれぞれのネットワーク トラフィックを定義するルールを使って、ハイブリッド ネットワークにおけるネットワーク アクセスを制御できます。

この記事では、3 つの仮想ネットワークを作成します。

  • VNet-Hub: ファイアウォールは、この仮想ネットワーク内に存在します。
  • VNet-Spoke: スポーク仮想ネットワークは Azure 上のワークロードを表します。
  • VNet-Onprem: オンプレミス仮想ネットワークはオンプレミス ネットワークを表します。 実際のデプロイでは、仮想プライベート ネットワーク (VPN) 接続または Azure ExpressRoute 接続を使用してそこに接続できます。 わかりやすくするため、この記事では VPN ゲートウェイ接続を使用し、Azure に配置された仮想ネットワークがオンプレミスのネットワークを表します。

ハイブリッド ネットワーク内のファイアウォールを示す図。

代わりに Azure portal を使用してこの記事の手順を完了する場合は、「Azure portal を使用してハイブリッド ネットワークに Azure Firewall をデプロイして構成する」を参照してください。

注意

Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を開始するには、Azure PowerShell のインストールに関する記事を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

前提条件

この記事では、PowerShell をローカルで実行する必要があります。 Azure PowerShell モジュールをインストールしておく必要があります。 バージョンを確認するには、Get-Module -ListAvailable Az を実行します。 アップグレードする必要がある場合は、Azure PowerShell モジュールのインストールに関するページを参照してください。 PowerShell のバージョンを確認した後、Login-AzAccount を実行して Azure との接続を作成します。

このシナリオが正しく機能するために重要な要件が 3 つあります。

  • スポーク サブネット上のユーザー定義ルート (UDR) が、Azure Firewall IP アドレスを既定のゲートウェイとして指すこと。 このルート テーブルでは仮想ネットワーク ゲートウェイのルート伝達を "無効" にする必要があります。

  • ハブ ゲートウェイ サブネット上の UDR が、スポーク ネットワークへの次のホップとしてファイアウォール IP アドレスを指すこと。

    Azure Firewall サブネット上に UDR は必要ありません。Border Gateway Protocol (BGP) からルートを学習するためです。

  • VNet-HubVNet-Spoke にピアリングするときは、必ず AllowGatewayTransit を設定します。 VNet-SpokeVNet-Hub にピアリングするときは、UseRemoteGateways を設定します。

この記事の「ルートを作成する」セクションでは、これらのルートを作成する方法を示します。

Note

Azure Firewall には、インターネットへの直接接続が必要です。 AzureFirewallSubnet サブネットによってオンプレミス ネットワークへの BGP を介した既定のルートが学習される場合は、Azure Firewall を強制トンネリング モードで構成する必要があります。 これが既存の Azure Firewall インスタンスであり、強制トンネリング モードで再構成できない場合は、AzureFirewallSubnet サブネットで 0.0.0.0/0 UDR を追加し、NextHopType 値を Internet に設定して、直接のインターネット接続を維持することをお勧めします。

詳細については、「Azure Firewall 強制トンネリング」を参照してください。

直接ピアリングされた仮想ネットワーク間のトラフィックは、UDR が既定のゲートウェイとして Azure Firewall をポイントしている場合でも、直接ルーティングされます。 このシナリオでサブネット間トラフィックをファイアウォールに送信するには、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

この仮想ネットワーク用に作成する VPN ゲートウェイに割り当てるパブリック IP アドレスを要求します。 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 アドレスを指定することはできません。 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 ゲートウェイを作成します。 ネットワーク間構成には、RouteBasedVpnType 値が必要です。 選択した 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 ゲートウェイを作成します。 ネットワーク間構成には、RouteBasedVpnType 値が必要です。 選択した 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 コマンドレットを使用します。-Debug は指定しても指定しなくてもかまいません。

次のコマンドレット例を使用します。ただし、値は実際の値に置き換えてください。 メッセージが表示されたら、"A" を選択して "All" を実行します。 この例では、テストする接続の名前が "-Name" で示されています。

Get-AzVirtualNetworkGatewayConnection -Name $ConnectionNameHub -ResourceGroupName $RG1

コマンドレットの完了後、値を確認します。 次の例は、接続状態 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"

Note

パブリック IP が割り当てられていない VM、または内部の Basic Azure Load Balancer のバックエンド プール内にある VM に対しては、Azure によって既定のアウトバウンド アクセス IP が提供されます。 デフォルト送信アクセス IP メカニズムは、構成できないアウトバウンド IP アドレスを提供します。

次のいずれかのイベントが発生すると、既定のアウトバウンド アクセス IP は無効になります。

  • パブリック IP アドレスが VM に割り当てられます。
  • アウトバウンド規則の有無にかかわらず、VM は標準ロード バランサーのバックエンド プール内に配置されます。
  • Azure NAT Gateway リソースが VM のサブネットに割り当てられます。

フレキシブル オーケストレーション モードの仮想マシン スケール セットによって作成された VM には、既定のアウトバウンド アクセスがありません。

Azure のアウトバウンド接続の詳細については、「Azure での既定の送信アクセス」および「送信接続での送信元ネットワーク アドレス変換 (SNAT)を使用する」を参照してください。

ファイアウォールをテストする

  1. VM-spoke-01 仮想マシンのプライベート IP アドレスを取得してメモします。

    $NIC.IpConfigurations.privateipaddress
    
  2. Azure portal から、VM-Onprem 仮想マシンに接続します。

  3. VM-Onprem 上で Windows PowerShell コマンド プロンプトを開き、VM-spoke-01 のプライベート IP に対して ping を実行します。 応答を取得する必要があります。

  4. VM-Onprem 上で Web ブラウザーを開き、http://<VM-spoke-01 private IP> にアクセスします。 IIS の既定ページが開きます。

  5. VM-Onprem で、プライベート IP アドレスにある VM-spoke-01 へのリモート アクセス接続を開きます。 接続が成功すると、選択したユーザー名とパスワードを使用してサインインできます。

ファイアウォール規則が機能していることを確認したので、次のことができます。

  • スポーク仮想ネットワーク上のサーバーに ping を行う。
  • スポーク仮想ネットワーク上の Web サーバーにアクセスする。
  • RDP を使用してスポーク仮想ネットワーク上のサーバーに接続する。

次に、次のスクリプトを実行して、ファイアウォール ネットワーク ルールのコレクションのアクションを Deny に変更します。

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

Set-AzFirewall -AzureFirewall $azfw

既存のリモート アクセス接続をすべて閉じます。 変更されたルールをテストするには、もう一度テストを実行します。 このとき、すべてが失敗するはずです。

リソースをクリーンアップする

次のチュートリアルのためにファイアウォール リソースを保持しておくことができます。 不要になった場合は、FW-Hybrid-Test リソース グループを削除して、ファイアウォール関連のすべてのリソースを削除します。

次のステップ

Azure Firewall のログを監視する