Skip to content

Network Topology — Authoritative Reference

Scope: address plan, VNets/VPCs, subnets, peering, firewall placement — both clouds. Routing detail (UDR design, next-hop rationale, asymmetric-routing rules) lives in UDR Routing Design — one source per fact; this doc does not duplicate route tables. Provenance: rebased from azure-infra and aws-infra Terraform on 2026-06-10 (review issue #138). Every table cites its source file. If this doc and Terraform disagree, Terraform wins — fix the doc.


Generated diagram

<!-- topology:start -->

Auto-generated from azure-infra Terraform by scripts/gen-topology.ts (DOCS-161). Diagram source: architecture/network-topology.mmd; rendered image: public/network-topology.svg (re-render after topology changes). Hub firewalls are hexagons.

VNets: 16 · peerings: 13

Network topology — generated from azure-infra Terraform <!-- topology:end -->


Azure Address Plan

VNetCIDRSubscriptionStatusSource
vnet-firewall (PublicFW hub)10.99.0.0/16FirewallLivefirewall/net_vnet.tf
vnet-privatefw (PrivateFW hub)10.98.0.0/16FirewallLivefirewall/net_privatefw.tf
vnet-identity10.10.0.0/16IdentityLiveidentity/net_vnet.tf
vnet-rodc10.11.0.0/16IdentityLiveidentity/net_rodc.tf
vnet-prod10.20.0.0/16ProductionLiveprod/net_vnet.tf
vnet-dev10.30.0.0/16DevelopmentLivedev/net_vnet.tf
vnet-dmz10.6.0.0/16DashboardLivedmz/net_vnet.tf
vnet-logging10.40.0.0/16LoggingLivelogging/net_vnet_logging.tf
CiriusSvcsVNET10.4.0.0/16FirewallDecommission-bound — blocked on PA LDAP/RADIUS migration off legacy DCs; see CiriusSvcs VNet Dependenciesfirewall/decommission-cirius-svcs-vnet.tf
vnet-dashboard10.5.0.0/16Decommissioned — not in code (historical references only)identity/net_vnet.tf:77 comment

Subnets (live VNets)

VNetSubnetCIDRNotesSource
vnet-firewallmgmt-subnet10.99.0.0/24PA/Panorama mgmtfirewall/net_vnet.tf
vnet-firewallpublic-subnet10.99.1.0/24PA untrustfirewall/net_vnet.tf
vnet-firewallprivate-subnet10.99.2.0/24PA trust; syslog VM, AW VLCfirewall/net_vnet.tf
vnet-firewallsnet-cae-syslog10.99.3.0/27Container Apps delegatedfirewall/net_vnet.tf
vnet-firewallsnet-private-endpoints10.99.4.0/24AMPLS private endpointsfirewall/net_ampls_pe.tf
vnet-firewalltwingate-subnet10.99.5.0/24ACI delegatedfirewall/net_vnet.tf
vnet-firewallbackup-aci-subnet10.99.6.0/24ACI delegatedfirewall/net_vnet.tf
vnet-privatefwmgmt / untrust / trust10.98.0.0/24 / 10.98.1.0/24 / 10.98.2.0/24PrivateFW interfacesfirewall/net_privatefw.tf
vnet-identityad-subnet10.10.1.0/24DCs + NPSidentity/net_vnet.tf
vnet-rodcrodc-subnet10.11.0.0/24RODC onlyidentity/net_rodc.tf
vnet-prodservers / workers10.20.1.0/24 / 10.20.2.0/24PHI workloadsprod/net_vnet.tf
vnet-devservers / workers10.30.1.0/24 / 10.30.2.0/24dev/net_vnet.tf
vnet-dmzdmz-servers-subnet10.6.1.0/24dmz/net_vnet.tf
vnet-loggingsnet-cae-agents10.40.1.0/27Container Apps delegatedlogging/net_vnet_logging.tf

Azure Peering (live)

Hub-and-spoke around the two firewalls. All direct spoke↔spoke peerings were deliberately removed — their /16 system routes bypassed the Palo Altos (removal notes live as comments in each VNet's Terraform).

HubPeered spokesSource
vnet-firewall (PublicFW)vnet-privatefw, vnet-dmz, vnet-rodc, vnet-loggingfirewall/net_vnet.tf, firewall/net_ampls_pe.tf
vnet-privatefw (PrivateFW)vnet-prod, vnet-identity, vnet-dev, CiriusSvcsVNET (decommission-bound)firewall/net_privatefw.tf

Spoke assignment rule: internal workload spokes (prod, identity, dev, legacy svcs) hang off PrivateFW; edge/special spokes (DMZ, RODC, logging PEs, Twingate) hang off PublicFW. The RODC explicitly does not peer with PrivateFW (identity/net_rodc.tf). Default routes and per-spoke UDRs: see UDR Routing Design.

Azure Firewalls

NVAVMMgmtUntrustTrustNotesSource
PublicFWCIRIUS-SVCS-FW10.99.0.410.99.1.4 (+public IP)10.99.2.4VM-Series BYOL, D3_v2firewall/net_firewall.tf
PrivateFWCIRIUS-PVT-FW10.98.0.410.98.1.410.98.2.4VM-Series BYOL; license borrow from AWS DR PA pending (VPNLYR-032)firewall/net_privatefw.tf
PanoramaCIRIUS-SVCS-PANORAMA10.99.0.5 (+public IP)12.1.2, 100GB log disk, delete lockfirewall/net_panorama.tf

GlobalProtect

FactValueSource
Portal/gatewaypvt.ciriusgroup.com:7000 (loopback 10.10.10.1)panos-infra/net_panos_gp.tf
AuthOneLogin SAML; split tunnel 10.0.0.0/8; DNS 10.10.1.10/.11panos-infra/net_panos_gp.tf
Client pool⚠️ Conflicting sources: PAN-OS Terraform says 10.97.0.0/24; NSGs across the estate treat 10.96.101.0/24 as the live VPN range. Likely the running legacy pool is 10.96.101.0/24 and 10.97.0.0/24 is the gated rebuild.panos-infra/net_panos_gp.tf:54 vs firewall/net_privatefw.tf:60-85
Phase 2 stateControl plane gated off (gp_phase2_enabled = false) — blocked on wildcard cert + OneLogin SAML profile import to Panoramapanos-infra/net_panos_gp.tf:21-31

Identity Hosts & DNS

HostIPRoleStatusSource
ACTDIRAZP01 / ACTDIRAZP0210.10.1.10 / 10.10.1.11Writable DCs (WS2022)Liveidentity/svr_ad.tf, identity/svr_ad2.tf
ACTIDMAZP0110.10.1.12NPS + MFA ext + Entra ConnectLiveidentity/svr_actidmazp01.tf
ACTRODC0110.11.0.10RODC — sole DC for DMZLiveidentity/svr_rodc.tf
ACTDIRAP01 / ACTDIRAP0210.4.4.4 / 10.4.4.5Legacy DCs (PA LDAP/RADIUS still bound)Decommission-blockedfirewall/decommission-cirius-svcs-vnet.tf
ACTDIRAP04 / ACTDIRAP05dynamicLegacy DCsJune 2026 decommissionfirewall/decommission-ad_e182ebbc.tf
actdirawp01 / actdirawp02 (AWS)10.40.1.10 / 10.40.2.10DR DCs — dr.ciriusgroup.internalLiveaws-infra/identity/svr_ad.tf

DNS per VNet: identity / prod / dev / privatefw / rodc → 10.10.1.10–.11; firewall + dmz → 10.11.0.10 (RODC); CiriusSvcsVNET → legacy 10.4.4.4–.5. Source: each VNet's dns_servers block.


AWS Address Plan (DR — 7-account org)

VPCCIDRAccountTGWStatusSource
vpc-firewall10.99.0.0/16 (mgmt .0/24, public .1/24, private .2/24, tgw-attach .30.0/28 + .30.16/28)Networking 238342914131Yes (appliance mode)Livefirewall/net_vpc.tf, firewall/net_tgw.tf
identity-vpc10.40.0.0/16 (10.40.1.0/24 2a, 10.40.2.0/24 2b)Identity 414134953818YesLiveidentity/net_vpc_module.tf
prod-vpc10.50.0.0/16 (10.50.1.0/24, 10.50.2.0/24)Prod 807267566999YesLiveprod/net_vpc_module.tf
dev-vpc10.60.0.0/16Dev 040067931468Retired (.rm files; TGW attachment commented out pending rebuild)dev/net_vpc_module.rm
Management-VPC10.10.0.0/16 (10.10.1.0/24, IGW-routed)Management 206820231356No — deliberately unattachedLivemain/management_vpc.tf
Logging / Backup accountsno VPCs038901680748 / 863609217450grep aws-infra/logging, aws-infra/backup

Transit Gateway design

central-tgw (default association/propagation off, RAM-shared to identity/prod/dev accounts). Two route tables: tgw-rt-eastwest (firewall attachment associated; fw/identity/prod propagate) and tgw-rt-egress (spoke attachments associated; static 0.0.0.0/0 + spoke CIDRs → firewall VPC attachment). Net effect: all inter-spoke and internet traffic from spokes hairpins through the Palo Alto in the firewall VPC. Source: firewall/net_tgw.tf.

AWS hosts (firewall account)

HostIPOS / imageSource
CIRIUS-AWS-FW10.99.0.4 mgmt (+EIP) / 10.99.1.4 public (+EIP) / 10.99.2.4 privatePAN-OS m5.xlargefirewall/net_firewall.tf
CIRIUS-AWS-PANO10.99.0.5 (+EIP)Panorama t3.xlarge, 100GB log diskfirewall/net_panorama.tf
syslogawp10.99.2.5Ubuntu 24.04 t3.smallfirewall/net_rsyslog.tf

Cross-cloud overlap note: AWS Management-VPC (10.10.0.0/16) overlaps Azure vnet-identity, and AWS vpc-firewall (10.99.0.0/16) mirrors Azure vnet-firewall. The clouds are separate routing domains with no cross-cloud routes in code — tolerated by design, but it rules out ever routing those prefixes between clouds.


Known Infrastructure Inconsistencies (found during the 2026-06-10 rebase)

These are Terraform-side issues surfaced while rebasing this doc — tracked as azure-infra / aws-infra issues, listed here so readers don't "correct" the doc back to the broken state:

  1. prod route to-dev-spoke (10.30.0.0/16) points at 10.99.2.4 while identity's equivalent and dev's default use 10.98.2.4 — violates the asymmetric-routing rule in UDR Routing Design. (prod/net_vnet.tf:84-93)
  2. prod still carries to-dashboard-spoke 10.5.0.0/16 → 10.99.2.4 although that VNet is decommissioned. (prod/net_vnet.tf:97-106)
  3. AWS: identity spoke routes and the firewall TGW return table still reference retired 10.60.0.0/16 (dev) — blackhole at the TGW. (identity/net_vpc_module.tf:27, firewall/net_vpc.tf:74-80)
  4. GP client pool defined as 10.97.0.0/24 in PAN-OS TF but 10.96.101.0/24 in NSGs (see GlobalProtect above).
  5. Stale comment in firewall/net_vnet.tf:118-119 claims prod/identity return routes were removed; the routes are live (the comment, not the code, is wrong).

Internal use only — Cirius Group