Azure上でpaloaltoのVMを構築してみました。
構成としては、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. [基本] タブの設定
[基本] タブを設定します。
![[基本] タブの設定](https://bonjiri-blog.com/wp-content/uploads/deploy-and-test-paloalto-on-azure-050.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-1-3. [VM-Series Configration] タブの設定
[VM-Series Configration] タブを設定します。
![[VM-Series Configration] タブを設定](https://bonjiri-blog.com/wp-content/uploads/deploy-and-test-paloalto-on-azure-051.png)
今回はライセンスタイプは BYOL ではなく、すべての機能を利用できる Bundle2 を選択します。
また、PAN-OSのバージョンはデフォルトで最新のものが選択されていますので、それを利用します。
現時点(2026/9/10時点)では 12.1.405 が選択可能な最新のバージョンでした。
ディスクにSSDを利用したい場合には、サイズで [Standard D8s v4] などを選択します。
最後に[確認および作成] タブでエラーなどが発生しなければ下部の「作成」をクリックして作成完了です。
1-1-4. NSGの設定確認
作成後にできたpaloaltoVMでは、プライベート通信とパブリック通信を担うNICとサブネットに対して Allow-All-In というルールが存在するNSGが紐づけされています。

この状態だと、すべての通信を受け付ける状態になっていますが、このルールがないとDestinationNAT時に通信ができなくなるのでこのままにしておきます。
※この部分ですごくハマってトラシューにものすごく時間を要しました。。
セキュリティ的な観点では、PANOS内でマネジメントプロファイルなどで許可をしていない限り外部から侵害されることはないと思いますので、いったんはこのままで進めます。
また、マネジメントのIPは別のNSGが紐づいており、そちらは送信元が作成時に指定したIPアドレスからとなっているので、こちらはNSGでしっかり制御されていますので安心です。

また参考までですが、NSGを設定しない場合にはデフォルトでInboundはDenyの挙動になります。

1-1-5. パブリック通信を担うIPにパブリックIPを追加
上記で構築した場合、デプロイ後にパブリック通信を担うIPにはパブリックIPがアタッチされていない状態となります。
Azureでは、2025年10月1日以降に作成された仮想マシンについては、既定の送信アクセスが適用されないため、インターネットへのアウトバウンド通信のためには「明示的なアウトバウンド接続方法を選択」する必要があります。
つまり、パブリックIPやNATGatewayを利用しないとインターネット通信ができません。

なので、今回のpaloaltoVMにもパブリックIPが必要となります。
以下のAzureCLIコマンドを利用してアタッチします。
$pip_name_untrust = "pip-test-untrust001"
$rg_name = "rg-test-paloalto"
# eth1のNIC名を取得
$nic_name_eth1 = az network nic list `
--resource-group $rg_name `
--query "[?contains(name, 'eth1')].name" `
-o tsv
# パブリックIPの作成
az network public-ip create `
-n $pip_name_untrust `
-g $rg_name
# ネットワークインターフェースの更新
az network nic ip-config update `
--resource-group $rg_name `
--nic-name $nic_name_eth1 `
--name "ipconfig-public" `
--public-ip-address $pip_name_untrust1-2. テスト用の仮想マシンを作成
paloaltoの仮想マシンのデプロイは15分くらいで完了しますが、その間にテスト用の仮想マシンを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)で入力してログインします。
このとき https:// としないとコンソールにアクセスできないので注意してください。
以下ようにpaloaltoの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 の値にはAzureのsubnetのデフォルトゲートウェイを指定する必要がありますので注意してください。
今回eth1は、Azure上で 10.0.0.64/26 として定義されたsubnetを利用するので 10.0.0.65 がデフォルトゲートウェイのIPとなりますのでその値を設定しています。

テスト用仮想マシンに向かうスタティックルート(戻りのルート)も同じように追加します。
この時の Next-Hop はPaloaltoの eth2 のサブネットのデフォルトゲートウェイとなります。

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

行自体が色塗りされている2つのNAME欄に歯車マークがついたポリシーがありますが、これらは編集/削除などできないデフォルトのポリシーです。
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. 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_vm1-4-1. (参考)異なるRGの場合のVnetピアリング
Vnetが所属するRGが異なる場合のVnetピアリングは以下で設定できます。
$rg_name_palo = "rg-paloalto"
$rg_name_vm = "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 側から見たTestVMのVNetのID
$remote_vnet_vm_id = az network vnet show `
--resource-group $rg_name_vm `
--name $vnet_name_vm `
--query id -o tsv
# VM側から見たPaloAltoのVNetのID
$remote_vnet_palo_id = az network vnet show `
--resource-group $rg_name_palo `
--name $vnet_name_palo `
--query id -o tsv
# paloalto → VM 向けのピアリング
az network vnet peering create `
--name $peer_name_01 `
--resource-group $rg_name_palo `
--vnet-name $vnet_name_palo `
--remote-vnet $remote_vnet_vm_id `
--allow-vnet-access `
--allow-forwarded-traffic
# VM → paloalto 向けのピアリング
az network vnet peering create `
--name $peer_name_02 `
--resource-group $rg_name_vm `
--vnet-name $vnet_name_vm `
--remote-vnet $remote_vnet_palo_id `
--allow-vnet-access `
--allow-forwarded-traffic
1-5 .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.name2つ目のルールは、記載しないと自分の端末からテスト用仮想マシンへの通信が成立しなくなってしまうので追加しています。
このルートテーブルを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する
セキュリティポリシーで宛先が www.yahoo.co.jp となる通信をdenyさせて、通信ができなくなるかを試してみます。
まず先に www.yahoo.co.jp のIPオブジェクトを作成します。
OBJECTS > Addresses からオブジェクトを追加します。
Type を FQDN にすると www.yahoo.co.jp を登録できます。

次に、ポリシーを作成します。
paloaltoでは上から順にポリシーが評価されていき、一致したポリシーがあるとそれ以降のポリシーは評価されない仕様です。
そこで上記で作成した Allow-To-Internet よりも上に Deny-yahoo というポリシーを作成し、コミットします。

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

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

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


