AzureCLI でファイアウォールポリシーを利用するAzureFirewall(クラシックではないAzureFirewall)を作成してみました。
最下部に 【参考】VM1台とAFWを一括構築するCLIコマンド をまとめていますので、コマンドだけ利用したい場合にはこちらを参考にしてください。
1.事前準備
AzureFirewallを作成するにあたって事前に作成が必要な以下のリソースを作成していきます。
今回は ファイアウォールポリシーを利用した AzureFirewall を作成しますので、ファイアウォールポリシーも事前に作成します。
- リソースグループ(ResourceGroup)
- 仮想ネットワーク(VirtualNetwork)
- パブリックIPアドレス(PublicIPAddress)
- ファイアウォールポリシー(FirewallPolicy)
既に作成済みなどであればこれらのリソースの作成は不要です。
1-1.リソースグループ作成
以下のコマンドで作成します。
$rg_name = "RG-Test-AzureFW"
$location = "japaneast"
# リソースグループの作成
az group create --name $rg_name --location $location
今回は東日本リージョンに作成していきます。
1-2.仮想ネットワーク作成
AzureFirewallを作成する場合には、AzureFirewallSubnet という名前のサブネットを作成する必要があり、そのサブネットは /26 のIPアドレスレンジが必要です。
/25などでも作成可能ですが、余計にIPアドレスを利用するためおすすめはしません。
下部の「/25 の AzureFirewallSubnet でも作成は可能」にも試した結果を記載していますので参考にしてください。
以下のコマンドで作成します。
$vnet_name = "Vnet-Test"
$vnet_address = "10.16.0.0/24"
$subnet_afw_name = "AzureFirewallSubnet"
$subnet_afw_address = "10.16.0.64/26"
# 仮想ネットワークの作成
az network vnet create --name $vnet_name `
--resource-group $rg_name `
--location $location `
--address-prefix $vnet_address `
--subnet-name $subnet_afw_name `
--subnet-prefix $subnet_afw_address
上記ではインターフェースとしてPowershellを利用しているので、改行する際には ` を利用していますが、コマンドプロンプトを利用する場合には、^ を利用する必要がありますのでその点は注意してください。
1-3.パブリックIPアドレス作成
AzureFirewallを作成する場合には、SKU は Standard にする必要があります。
以下のコマンドで作成します。
$pip_afw_name = "pip-afw-test"
$pip_afw_mgt_name = "pip-afw-mgt-test"
# パブリックIPアドレスの作成
az network public-ip create `
--name $pip_afw_name `
--resource-group $rg_name `
--location $location `
--allocation-method static `
--sku standard
1-4.ファイアウォールポリシー作成
ポリシーの中にルールも作成します。
今回はネットワークルールで全ての通信を許可するルールを付与します。
以下のコマンドで作成します。
$afw_policy_name = "afw-policy-test"
$collectiongroup_name = "collection-test-001"
$collectiongroup_priority = 1000 #<100~65000>
$collection_name = "collection-test-001"
$Action = "Allow" #<Allow / Deny>
$collection_priority = 1000 #<100~65000>
$rule_type = "NetworkRule" #<ApplicationRule / NatRule / NetworkRul>
$rule_name = "All-Allow"
$rule_ipprotocol = "Any" #<Any / ICMP / TCP / UDP>
# ファイアウォールポリシーの作成
az network firewall policy create `
--resource-group $rg_name `
--name $afw_policy_name `
--sku Standard
# ポリシー内の規則コレクショングループ作成
az network firewall policy rule-collection-group create `
--resource-group $rg_name `
--policy-name $afw_policy_name `
--name $collectiongroup_name `
--priority $collectiongroup_priority
# 規則コレクション内のフィルターコレクション(規則コレクション)の作成(ネットワークルール)
az network firewall policy rule-collection-group collection add-filter-collection `
--resource-group $rg_name `
--policy-name $afw_policy_name `
--rule-collection-group-name $collectiongroup_name `
--name $collection_name `
--action $Action `
--collection-priority $collection_priority `
--rule-type $rule_type `
--rule-name $rule_name `
--source-addresses "*" `
--destination-addresses "*" `
--destination-ports "*" `
--ip-protocols $rule_ipprotocol
ポリシー作成のコマンドを始めて実行すると、以下のように「拡張機能をインストールしていいか?」と聞かれるので Y(yes) でそのまま進めてください。

上記コマンド実行後にも作成されたリソースの詳細がインターフェースに表示されますが、

以下のコマンドでも作成されたリソースを確認できます。
# 作成されたポリシーの確認
az network firewall policy list
# 作成された規則コレクショングループの確認
az network firewall policy rule-collection-group list `
--resource-group $rg_name `
--policy-name $afw_policy_name
AzureCLI でファイアウォールポリシーの追加(ルールの追加)をする方法については、
下部の「ファイアウォールポリシーの規則コレクションにルールを追加する」に記載していますので参考にしてください。
2.AzureFirewall を作成する
事前準備が完了したら AzureFirewall を作成します。
以下のコマンドで作成可能です。
$afw_name = "afw-test"
$sku = "AZFW_VNet" ` #<AZFW_Hub / AZFW_VNet>
$tier = "Standard" #<Basic / Standard / Premium>
$afw_conf_name = "conf-afw-test"
# AzureFirewalの作成
az network firewall create `
--resource-group $rg_name `
--location $location `
--name $afw_name `
--sku $sku `
--tier $tier `
--public-ip $pip_afw_name `
--vnet-name $vnet_name `
--conf-name $afw_conf_name `
--firewall-policy $afw_policy_name
上記コマンド実行後にも作成されたリソースの詳細が表示されますが、
以下のコマンドでも作成されたAzureFirewallの設定を確認することができます。
# 作成されたAzureFirewallの確認
az network firewall list
3.ファイアウォールポリシーの規則コレクションにルールを追加する
以下のコマンドで既存の規則コレクションにルールを追加することができます。
このコマンドでは上記で設定した規則コレクション [Collection-Test] にルールを追加しています。
$add_rule_name = "Test-Add-Rule"
$add_rule_ipprotocol = "TCP" #<Any / ICMP / TCP / UDP>
# ポリシー内の規則コレクションにルール追加
az network firewall policy rule-collection-group collection rule add `
--resource-group $rg_name `
--policy-name $afw_policy_name `
--rule-collection-group-name $collectiongroup_name `
--collection-name $collection_name `
--rule-type $rule_type `
--name $add_rule_name `
--source-addresses "*" `
--dest-addr "*" `
--destination-ports "*" `
--ip-protocols $add_rule_ipprotocol
以下のコマンドで設定されているルールの一覧を確認することができます。
# ポリシー内の規則コレクションのルールの確認
az network firewall policy rule-collection-group collection list `
--resource-group $rg_name `
--policy-name $afw_policy_name `
--rule-collection-group-name $collectiongroup_name
4.やってみて気づいたこと
/25 の AzureFirewallSubnet でも AzureFW は作成可能
/26以外のサブネットで作成したらどうなるのかについても調べてみました。
結論から言うと /25 のサブネットでも作成は可能です。
ただし、/26 で十分とmicrosoftも記載している中で /25 を指定するメリットはないと思うので、
/26 で作成したほうが良いと感じました。
参考:サービスのスケールに応じてファイアウォール サブネットのサイズを変更する必要はありますか。
・/25で作成したAzureFirewallSubnet

・接続されているデバイスに Azurefirewall のIPアドレスが存在

・AzureFirewall でも上記サブネット内のIPアドレスが付与

[ –conf-name ] の指定がないとネットワーク情報が連携されない
AzureCLIで作成する際に少しはまった点ですが、
設定値として「–conf-name(IP構成)」を指定しないと、AzureFWの作成自体は可能ですが、
プライベートIPやパブリックIPの設定値が null の状態でデプロイされます。
・CLIでは「–vnet-name」は指定していますが、作成結果にもネットワーク情報はなく、

・作成されたAzureFWではネットワークに関する情報が null となっている。

なので、[ –conf-name ] の指定をして AzureFirewall を作成する必要があります。
[参考] デフォルトの状態で DefaultNetworkRuleCollectionGroup は利用できない
Azureポータルで操作する際には、規則コレクションを作成する際にデフォルトの規則コレクショングループとして [DefaultNetworkRuleCollectionGroup] を選択できます。
一方でAzureCLIではデフォルトの状態でこの規則コレクショングループを指定して規則コレクションを作成することができません。
明示的に [DefaultNetworkRuleCollectionGroup] を作成する必要があります。
デフォルトの状態で [DefaultNetworkRuleCollectionGroup] を指定して規則コレクションを作成した場合、以下のようなエラー(ResourceNotFound)となります。
![デフォルトの状態で [DefaultNetworkRuleCollectionGroup] を指定して規則コレクションを作成した場合のエラー](https://bonjiri-blog.com/wp-content/uploads/create-azurefirewall-with-azurecli-002-800x269.png)
・[DefaultNetworkRuleCollectionGroup] を作成する
以下のコマンドで作成することができます。
#ポリシー内の規則コレクショングループ作成
az network firewall policy rule-collection-group create `
--resource-group RG-Test-AzureFW `
--policy-name FW-Policy-Test `
--name DefaultNetworkRuleCollectionGroup `
--priority 500
作成後には [DefaultNetworkRuleCollectionGroup] を利用してルールなどを作成可能となります。
#規則コレクション内のフィルターコレクション(規則コレクション)の作成
az network firewall policy rule-collection-group collection add-filter-collection `
--resource-group RG-Test-AzureFW `
--policy-name FW-Policy-Test `
--rule-collection-group-name DefaultNetworkRuleCollectionGroup `
--name Collection-Test `
--action Allow `
--collection-priority 1000 `
--rule-type NetworkRule `
--rule-name All-Allow-Default `
--source-addresses "*" `
--destination-addresses "*" `
--destination-ports "*" `
--ip-protocols Any
【参考】VM1台とAFWを一括構築するCLIコマンド
上記を参考にしつつ、AFWと疎通確認用VM1台とルートテーブルでVMからインターネット向け通信をAFWに向けるような構成を以下のコマンドで一括作成します。
AFWのSKUは Basic としています。
## VM作成パラメータ
$rg_name = "RG-Test-AFW"
$location = "japaneast"
$vnet_name = "Vnet-Test-AFW"
$vnet_address = "10.16.0.0/24"
$subnet1_name = "Subnet-Client"
$subnet1_address = "10.16.0.0/26"
$subnet_afw_name = "AzureFirewallSubnet"
$subnet_afw_address = "10.16.0.64/26"
$subnet_afw_mgt_name = "AzureFirewallManagementSubnet"
$subnet_afw_mgt_address = "10.16.0.128/26"
$nsg1_name = "NSG-Test-Windows"
$nsgrule_name = "AllowRDP"
$my_gip = (Invoke-WebRequest https://ipinfo.io/ip).content
$nsgrule_sourceip = $my_gip + "/32"
$nsgrule_port = 3389
$nsgrule_priority = 200
$pip1_name = "PIP-VM-Test-Client"
$pip_afw_name = "pip-afw-test"
$pip_afw_mgt_name = "pip-afw-mgt-test"
$nic1_name = "NIC-VM-Test-Client"
$vm1_name = "VM-Test-Client"
$vm1_image = "Win2022Datacenter"
$vm_size = "Standard_B2ms"
$vm_authtype = "password"
$vm_adminname = "xxxxxxxx"
# リソースグループの作成
az group create `
-l $location `
-g $rg_name
# 仮想ネットワークの作成とクライアント用サブネットの追加
az network vnet create `
-n $vnet_name `
-g $rg_name `
-l $location `
--address-prefix $vnet_address `
--subnet-name $subnet1_name `
--subnet-prefix $subnet1_address
# AFW用サブネットの追加
az network vnet subnet create `
-g $rg_name `
--vnet-name $vnet_name `
-n $subnet_afw_name `
--address-prefixes $subnet_afw_address
az network vnet subnet create `
-g $rg_name `
--vnet-name $vnet_name `
-n $subnet_afw_mgt_name `
--address-prefixes $subnet_afw_mgt_address
# NSGの作成
az network nsg create `
-n $nsg1_name `
-g $rg_name
# NSGのルール追加
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg1_name `
-n $nsgrule_name `
--source-address-prefixes $nsgrule_sourceip `
--destination-port-range $nsgrule_port `
--priority $nsgrule_priority
# NSGをサブネットに適用
az network vnet subnet update `
-g $rg_name `
-n $subnet1_name `
--vnet-name $vnet_name `
--network-security-group $nsg1_name
# VM用パブリックIPの作成
az network public-ip create `
-n $pip1_name `
-g $rg_name
# ネットワークインターフェースの作成
az network nic create `
-n $nic1_name `
-g $rg_name `
--vnet-name $vnet_name `
--subnet $subnet1_name `
--public-ip-address $pip1_name
# 仮想マシンの作成
az vm create `
-n $vm1_name `
-g $rg_name `
--image $vm1_image `
--size $vm_size `
--nics $nic1_name `
--authentication-type $vm_authtype `
--admin-username $vm_adminname
## AzureFirewall関連リソースのパラメータ
$afw_policy_name = "afw-policy-test"
$collectiongroup_name = "collection-test-001"
$collectiongroup_priority = 1000
$collection_name = "collection-test-001"
$Action = "Allow"
$collection_priority = 1000
$rule_type = "ApplicationRule"
$rule1_name = "Allow-Internet"
$rule1_destination_fqdns = "*"
$rule1_destprotocol1 = "Https=443"
$afw_name = "afw-test"
$tier = "Basic"
$afw_conf_name = "conf-afw-test"
$afw_mgt_conf_name = "conf-afw-mgt-test"
$routetable_name = "rt-test-afw"
$rt_route1_name = "route_to_myself"
$rt_route2_name = "route_to_internet"
$destiprange = "0.0.0.0/0"
# AzureFirewallポリシーの作成
az network firewall policy create `
--resource-group $rg_name `
--name $afw_policy_name `
--sku Basic
# ポリシー内の規則コレクショングループ作成
az network firewall policy rule-collection-group create `
--resource-group $rg_name `
--policy-name $afw_policy_name `
--name $collectiongroup_name `
--priority $collectiongroup_priority
# 規則コレクション内のフィルターコレクション(規則コレクション)の作成
az network firewall policy rule-collection-group collection add-filter-collection `
--resource-group $rg_name `
--policy-name $afw_policy_name `
--rule-collection-group-name $collectiongroup_name `
--name $collection_name `
--action $Action `
--collection-priority $collection_priority `
--rule-type $rule_type `
--rule-name $rule1_name `
--source-addresses $subnet1_address `
--target-fqdns $rule1_destination_fqdns `
--protocols $rule1_destprotocol1
# AFW用パブリックIPの作成
az network public-ip create `
-n $pip_afw_name `
-g $rg_name `
--allocation-method Static `
--sku Standard
# AFW管理用パブリックIPの作成
az network public-ip create `
-n $pip_afw_mgt_name `
-g $rg_name `
--allocation-method Static `
--sku Standard
# AzureFirewalの作成(tierはBasic)
az network firewall create `
--resource-group $rg_name `
--location $location `
--name $afw_name `
--sku AZFW_VNet `
--tier $tier `
--public-ip $pip_afw_name `
--vnet-name $vnet_name `
--conf-name $afw_conf_name `
--m-conf-name $afw_mgt_conf_name `
--m-public-ip $pip_afw_mgt_name `
--firewall-policy $afw_policy_name
# ルートテーブルの作成
az network route-table create `
-g $rg_name `
-n $routetable_name
# ルートテーブルをSubnet-Clientに適用
az network vnet subnet update `
-g $rg_name `
-n $subnet1_name `
--vnet-name $vnet_name `
--route-table $routetable_name
# ルートテーブルのルートを作成(自分のグローバルIPはAFW経由しない)
az network route-table route create `
-g $rg_name `
-n $rt_route1_name `
--route-table-name $routetable_name `
--address-prefix $nsgrule_sourceip `
--next-hop-type Internet
# ルートテーブルのルートを作成(インターネット向け通信をAFW経由にする)
$afw_conf_info = az network firewall ip-config show -g $rg_name -f $afw_name -n $afw_conf_name | ConvertFrom-Json
$afw_privateip = $afw_conf_info.privateIpAddress
az network route-table route create `
-g $rg_name `
-n $rt_route2_name `
--route-table-name $routetable_name `
--address-prefix $destiprange `
--next-hop-ip-address $afw_privateip `
--next-hop-type VirtualAppliance