Azure上でpaloaltoを作成してみました。
構成としては、Azure上にあるクライアント端末(仮想マシン)からインターネットに向かう通信をすべてpaloalto経由にするというAzure上でのNVA構成を試してみました。
構成イメージは以下のような形です。

今回はAzureのマーケットプレイスから「VM-Series Next-Generation Firewall from Palo Alto Networks」を利用して作成していきます。
0.構成図
上記でも概要図を載せましたが、より詳細に書くと以下のような構成を作成していきます。

今回はこの環境を作成して、右側の仮想マシンからpaloaltoを経由してインターネットに向けて通信を行いました。
1.Azure上にpaloaltoを構築する
まずは環境を構築していきます。
1-1.マーケットプレイスからpaloaltoを作成
Azureポータルでマーケットプレイスを開き、「palo alto」と検索して「VM-Series Next-Generation Firewall from Palo Alto Networks」を選択し、「Single VM-series Firewall」を選択します。

1-1-1.[基本] タブの設定
[基本] タブを設定します。
今回はライセンスタイプは BYOL ではなく、すべての機能を利用できる Bundle2 を選択します。
![[基本] タブの設定](https://bonjiri-blog.com/wp-content/uploads/deploy-paloalto-on-azure-104-800x731.png)
[注意点] 空のリソースグループの選択が必須
ここで指定するリソースグループはリソースが一切存在しないリソースグループを選択する必要があります。
リソースが存在する場合には以下のように警告が表示されて、paloaltoをデプロイすることができません。

1-1-2.[Networking] タブの設定
[Networking] タブを設定します。
仮想ネットワークは新規作成し、今回は構成図に記載の通りのIPアドレスを利用します。
![[Networking] タブを設定](https://bonjiri-blog.com/wp-content/uploads/deploy-paloalto-on-azure-105-01-800x560.png)
「Deployment Architecture」の選択肢には [Single Arm] か [Two Arm] があります。
[Single Arm] は、プライベート間の通信制御を実装したい場合に利用でき、プライベートサブネットだけが作成されます。
[Two Arm] は、インターネットを利用する通信制御を実装したい場合に利用でき、プライベートサブネットだけでなくパブリック用のサブネットも作成されます。
今回はインターネットも利用するので [Two Arm] を選択します。
![「Deployment Architecture」の選択肢には [Single Arm] か [Two Arm] がある](https://bonjiri-blog.com/wp-content/uploads/deploy-paloalto-on-azure-106-800x109.png)
1-2-3.[VM-Series Configration] タブの設定
[VM-Series Configration] タブを設定します。
![[VM-Series Configration] タブを設定](https://bonjiri-blog.com/wp-content/uploads/deploy-paloalto-on-azure-107-01-800x770.png)
PAN-OSのバージョンはデフォルトで最新のものが選択されていますので、それを利用します。
現時点(2025/8/27時点)では 11.2.5 が選択可能な最新のバージョンでした。
ディスクにSSDを利用したい場合には、サイズで [Standart DS3 v2] などを選択します。
最後に[確認および作成] タブでエラーなどが発生しなければ下部の「作成」をクリックして作成完了です。
1-2.テスト用の仮想マシンを作成
paloaltoの仮想マシンのデプロイは6分くらいで完了してしまいますが、その間にテスト用の仮想マシンをAzureCLIで作成します。
以下の流れで仮想マシンを作成していきます。
- リソースグループを作成
- NSGを作成+RDP接続許可のルールを追加
- 仮想ネットワークを作成
- 仮想マシンの作成
今回はAzureCLIで作成します。
# 任意のパラメータを定義
$rg_name = "rg-test-paloalto"
$location = "japaneast"
$vnet_name = "Vnet-Test-VM"
$vnet_address = "172.16.0.0/24"
$subnet_name = "Subnet-Test-VM"
$subnet_address = "172.16.0.0/25"
$nsg_name = "NSG-Test-VM"
$nsgrule_name = "RDP"
$my_gip = (Invoke-WebRequest https://ipinfo.io/ip).content
$nsgrule_sourceip = $my_gip + "/32"
$nsgrule_port = 3389
$nsgrule_priority = 200
$pip_name = "PIP-Test-VM"
$nic_name = "NIC-Test-VM"
$vm_name = "VM-test-client"
$vm_image = "Win2022Datacenter"
$vm_size = "Standard_B2ms"
$vm_authtype = "password"
$vm_adminname = "xxxxxxx"
# リソースグループの作成
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 $subnet_name `
--subnet-prefix $subnet_address
# NSGの作成
az network nsg create `
-n $nsg_name `
-g $rg_name
# NSGのルール追加
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_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 $subnet_name `
--vnet-name $vnet_name `
--network-security-group $nsg_name
# パブリックIPの作成
az network public-ip create `
-n $pip_name `
-g $rg_name
# ネットワークインターフェースの作成
az network nic create `
-n $nic_name `
-g $rg_name `
--vnet-name $vnet_name `
--subnet $subnet_name `
--public-ip-address $pip_name
# 仮想マシンの作成
az vm create `
-n $vm_name `
-g $rg_name `
--image $vm_image `
--size $vm_size `
--nics $nic_name `
--authentication-type $vm_authtype `
--admin-username $vm_adminname
1-3.paloaltoのOS内設定
paloaltoのデプロイが完了したら、払い出されたPublicIPをブラウザ(今回はChrome)で入力してログインします。
以下ようにpaloaltoのGUIのwebコンソールが表示されますので、今回はGUIで設定していきます。

続いてインターネット向けに通信ができるように最低限の設定をしていきます。
1-3-1.インターフェースの設定
今回作成したpaloaltoは「Azure上にある」ため、VLANなどのL2について気にする必要がなく、L3のみの設定で問題ありません。
なので「ethernet1/1にVLANのタグをつけたサブインターフェースを作成する」といった設定をする必要もないかと思ったので、今回はサブインターフェースを作成せずにインターフェースにIPを設定していきます。
設定する前にAzure上で各インターフェースがどのsubnetに所属しているのか、IPアドレスが何かを調べておきます。

今回はeth1に[Subnet-Untrust_public]が設定されており、IPは[10.0.0.68]でしたのでその値をOS内でも設定していきます。
paloalto内では[NETWORK]‐[Interfaces]より設定します。
ethernet1/1を選択して設定します。
[Interface Type]を「Layer3」として、先ほど調べた[IPアドレス]の値を入力します。
また、入力するIPアドレスの/以降がサブネットのレンジを示すことにも注意です。

続けてeth1/2も同じように設定します。

1-3-2.ゾーンの設定
今回は[Untrust]と[Trust]のゾーンを設定して、それぞれeth1とeth2に対応させます。
先ほどAzureポータル上で「eth1が[Subnet-Untrust_public]」であることを確認したので、[Untrust]ゾーンをeth1に対応させます。
paloalto内では[NETWORK]‐[Zones]より設定します。
赤枠の設定のみでOKです。

必要に応じて[Log Setting]や[Zone Protection Profile]などの設定も追加してください。
続けて[Trust]ゾーンを作成してeth2に対応させます。

1-3-3.仮想ルーターの設定(スタティックルートの設定)
仮想ルータの設定でスタティックルートを設定します。
paloalto内では[NETWORK]‐[Virtual Routers]より設定します。
今回は既存で存在する[default]の仮想ルータを利用し、まず[Router Settings]にてインターフェースを追加します。

次に[Static Routers]を設定します。
今回は[Untrust]ゾーンのeth1を利用して通信がインターネットに出ていくので、デフォルトルートがeth1に向かうように設定を入れます。
また、[Next Hop]の値にはsubnetのデフォルトゲートウェイを指定する必要がありますので注意してください。
今回eth1は、Azure上で「10.0.0.64/26」として定義されたsubnetを利用するので[10.0.0.65]がデフォルトゲートウェイのIPとなりますのでその値を設定しています。

テスト用仮想マシンに向かうスタティックルート(戻りのルート)も同じように追加します。

1-3-4.セキュリティポリシーの設定
今回はインターネット向けの通信をすべて許可する設定を入れます。
paloalto内では[POLICIES]‐[Security]より設定します。
設定値としては送信元ゾーンを[Trust]、宛先ゾーンを[Untrsut]とし、それ以外の値もすべて[any]として許可します。

NAMEの欄に歯車マークがついていて、行自体が色塗りされている下2つのポリシーは編集/削除などできないデフォルトのポリシーです。
1-3-5.NATポリシーの設定
最後にNATポリシーを設定します。
paloalto内では[POLICIES]‐[NAT]より設定します。
今回は送信元ゾーンを[Trust]、宛先ゾーンを[Untrust]として設定します。
また、[Translated Packet]部分では[Source Address Translation]に以下のように設定を入れます。
- Translation Type:Dynamic IP And Port
- Address Type:Interface Address
- Interface:ethernet1/1
- IP Address:10.0.0.68/26
すべてプルダウンで選択可能です。
プライベートアドレスを指定する点に注意です。

1-3-6.コミット
最後にコミットして設定を反映させます。
これでpaloalto内の設定が完了しました。
1-4.(必要があれば)eth0のパブリックIPのSKUを[Standard]に変更
paloalto仮想マシンのデプロイ時にパブリックIPを新規作成し、その際に[Standard]を選択したはずなのですが、デプロイ後に確認してみると[Basic]となっていました。
その場合、eth0のNICのIP構成からパブリックIPを一度デタッチし、パブリックIPをアップグレードさせて、再度eth0のNICのIP構成にアタッチしてSKUを[Standard]にしてください。
ちなみに、MgmtサブネットのNICのパブリックIPが[Basic]であってもインターネット向けの通信は通りますのでここで変更しなくても問題はありません。
ただ、Basic は 2025/9/30 に廃止となって通信ができなくなるので早めに設定を変更したほうがいいと思います。
1-5.Vnetpeeringを作成
ここで再度Azureの設定に戻り、テスト用VMがある仮想ネットワークと、paloaltoがある仮想ネットワークをVnetpeeringで接続させます。
今回はpaloaltoと同じリソースグループにテスト用の仮想マシンも作成したので以下のAzureCLIコマンドで作成できます。
$rg_name = "rg-test-paloalto"
$vnet_name_palo = "vnet-test-paloalto"
$vnet_name_vm = "Vnet-Test-VM"
$peer_name_01 = "vnet-test-paloalto_to_Vnet-Test-VM"
$peer_name_02 = "Vnet-Test-VM_to_vnet-test-paloalto"
# paloalto → VM 向けのピアリング
az network vnet peering create `
--name $peer_name_01 `
--resource-group $rg_name `
--vnet-name $vnet_name_palo `
--remote-vnet $vnet_name_vm `
--allow-vnet-access `
--allow-forwarded-traffic
# VM → paloalto 向けのピアリング
az network vnet peering create `
--name $peer_name_02 `
--resource-group $rg_name `
--vnet-name $vnet_name_vm `
--remote-vnet $vnet_name_palo `
--allow-vnet-access `
--allow-forwarded-traffic
以下のコマンドで作成されたかの確認もできます。
az network vnet peering show `
-g $rg_name `
-n $peer_name_01 `
--vnet-name $vnet_name_palo
az network vnet peering show `
-g $rg_name `
-n $peer_name_02 `
--vnet-name $vnet_name_vm
1-6.RouteTableを作成・Subnetに紐づけ
最後の作業としてルートテーブルを作成して、テスト用の仮想マシンが存在しているsubnetに紐づけます。
システムルートの状態では仮想マシンの通信はpaloaltoに向かないため、ルートテーブルを利用してpaloaltoに向くように設定します。
以下の流れで作成・設定していきます。
- ルートテーブルを作成 + ルールを2つ追加
- ルートテーブルをsubnetに紐づける
以下のAzureCLIのコマンドで作成しましたので参考にしてください。
# RouteTableを作成
$RouteTable = az network route-table create -n "RouteTable-Test-VM" -g $rg_name | ConvertFrom-Json
# RouteTableにルールを追加(インターネット通信がpaloaltoに向かうようにする)
az network route-table route create `
--address-prefix "0.0.0.0/0" `
-n "To-Internet" `
--next-hop-type "VirtualAppliance" `
-g $rg_name `
--route-table-name $RouteTable.name `
--next-hop-ip-address "10.0.0.132"
# RouteTableにルールを追加(自分の端末からの通信だけは直接テスト用仮想マシンにアクセスできるようにする)
az network route-table route create `
--address-prefix $nsgrule_sourceip `
-n "To-Myclient" `
--next-hop-type "Internet" `
-g $rg_name `
--route-table-name $RouteTable.name
# RouteTableをSubnetに紐づける
az network vnet subnet update `
-n "Subnet-Test-VM" `
-g $rg_name `
--vnet-name $vnet_name_vm `
--route-table $RouteTable.name
2つ目のルールは、記載しないと自分の端末からテスト用仮想マシンへの通信が成立しなくなってしまうので追加しています。
このルートテーブルをsubnetに紐づけた時点からテスト用仮想マシン発の通信がpaloaltoに向くようになります。
環境の作成としてはこれで完了です。
2.仮想マシンからインターネットに向けて通信を流す
ルートテーブルを紐づけた時点でテスト用仮想マシンのインターネット向けの通信はpaloaltoに流れていますが、改めて通信を流して確認していきます。
2-1.[www.yahoo.co.jp]に通信する
テスト用の仮想マシンで[www.yahoo.co.jp]にアクセスします。
[www.yahoo.co.jp] は正引きすると [183.79.250.123] でしたので、paloaltoのログにこのIPが流れているかを確認します。

paloalto内の[MONITOR]‐[Logs]‐[Traffic] よりログを確認します。
ログのクエリで( natdst eq 183.79.250.123 )と入力し、確認してみるとログとして検出されるのでpaloaltoを経由してインターネット接続していることがわかります。

2-2.[183.79.250.123]をセキュリティポリシーでDenyする
セキュリティポリシーで宛先が[183.79.250.123]となる通信をdenyさせて、通信ができなくなるかを試してみます。
paloaltoでは上から順にポリシーが評価されていき、一致したポリシーがあるとそれ以降のポリシーは評価されないので、上記で作成した「Allow-To-Internet」よりも上に「Deny-yahoo」というポリシーを作成し、コミットします。

コミット完了後にテスト用仮想マシンでブラウザアクセスを試すと以下のようにyahooのTOPページが開かなくなりました。

また、paloaltoのログを確認すると「Deny-yahoo」のポリシーでdenyとなっていることが確認できます。

3.やってみて気づいたこと
3-1.NATポリシーはプライベートIPを指定してよい
何気に苦戦した部分ですが、NATポリシーにおける[送信元アドレス]はプライベートのIPを利用します。
パブリックIPを指定するものかと思っていたらプライベートIPの指定で問題ありませんでした。
そもそもeth1にはAzureリソースのパブリックIPを付与していませんので、インターネットに出ていく際に、どの値のパブリックIPが利用されるのかはこちらからは分かりません。
考えてみればあたり前ですが気づくのに時間がかかりました。
3-2.デプロイされたパブリックIPのSKUが[Standard]になっていない
上記でも記載しましたが、デプロイ時にMgmtのNICに付与するパブリックIPを新規作成する際にSKUを[Standard]に指定したはずなのですが、デプロイ後に確認してみると[Basic]でした。
![デプロイされたパブリックIPのSKUが[Standard]になっていない](https://bonjiri-blog.com/wp-content/uploads/deploy-paloalto-on-azure-102.png)
なのでスタンダードへと変更する場合には、デプロイ後にパブリックIPをMgmtのNICから一度デタッチして、[Standard]にアップグレードしてから再度アタッチする必要があります。
MgmtサブネットのNICのパブリックIPが[Basic]であってもインターネット向けの通信は通りますが、Basic は 2025/9/30 に廃止となって通信ができなくなるので早めに設定を変更したほうがいいと思います。
3-3. PublicサブネットとPriveteサブネットに Allow-All というNSGが設定されている
マーケットプレイスから構築した場合には、PublicサブネットとPriveteサブネットに Allow-All というNSGが設定されていました。
受信規則に全てのIPからすべてのポートへのアクセスを許可するルールが入っているのですぐに削除したほうが良いです。

4.さいごに
今回初めてAzure上で仮想アプライアンスを構築してみましたが、Azureリソースのことも考える必要があるので、paloaltoの知識だけでなく、Azure側の知識も必要だということが分かりました。
もともとpaloaltoは触っていたこともあるので試しにやってみましたが、気になる点が多々出てきたので、これを機に「Azure上にあるpaloalto」についてもっと調べていこうと思います。^^