TTechclick All lessons
Zscaler · Batch 11 · Lesson 2L2 / DEEP DIVE

ZIA architecture deep dive — every component, every hop

In Lesson 1 we placed Zscaler on the map. Now we open the box: Central Authority, Public Service Edges, Nanolog clusters, Sub-Clouds, Service Edges, Trust Pools, and the exact path one packet takes through ZIA. By the end you'll be able to log into a tenant and know exactly where every setting lives — and what breaks when each component is unhealthy.

📅 May 24, 2026 · ⏱ 15 min read · 🏷 10-question assessment included
🎯 By the end of this lesson, you'll be able to

Why this lesson matters

Lesson 1 gave you the vendor-comparison-grade view: "Zscaler is SSE, ZIA replaces SWG, the Exchange brokers everything." That's the slide-deck answer. This lesson gives you the L3-engineer answer: when a user complains "YouTube is blocked but it shouldn't be," you can trace it through CA → PSE → Trust Pool → policy evaluation in 30 seconds because you know where each thing lives.

Every Zscaler troubleshooting call eventually comes down to one of these: "is the right policy on the right PSE for this user's location?" That sentence alone has six concepts in it. Let's unpack each one.

The ZIA cloud — every component on one diagram

Before any deep dive, lock the high-level layout into your head:

ZIA cloud — full component map
ZIA full component map Layered ZIA architecture: tenant config plane (Central Authority + Admin Portal) on top, sub-cloud constraint layer in middle, Public Service Edge pools below, Nanolog cluster on the side, all feeding traffic to the Internet at the bottom. TENANT CONFIG PLANE — one per Zscaler cloud (you share this with ~4000 other tenants, isolated by tenant ID) Central Authority (CA) ZIA Admin Portal (admin.zscaler.net) policy push SUB-CLOUD (optional per-tenant constraint) "Use only EU PSEs" or "only FedRAMP-eligible PSEs" — data-residency / compliance NANOLOG CLUSTER Compressed logs (~50:1) Searchable in Web Insights Streams to SIEM via NSS /api/v1/insights/* PSE Pool — IN Mumbai · Chennai · Delhi Sub-Cloud: standard PSE Pool — APAC SG · HK · Tokyo · Sydney Sub-Cloud: standard PSE Pool — EU FRA · LON · AMS · PAR Sub-Cloud: GDPR 🌐 INTERNET / SaaS

Three layers — config (CA + Admin Portal), constraint (Sub-Cloud), enforcement (PSE pools grouped by region and Trust Pool). Nanolog sits beside the enforcement plane and feeds logs into Web Insights + your SIEM.

Component-by-component breakdown

Central Authority (CA) — the brain

The CA is the single config plane. One CA per Zscaler cloud (zscaler.net, zscloud.net, etc.). When you save a URL Filtering rule in the Admin Portal, you're writing to the CA. The CA then pushes that policy to every PSE in seconds via Zscaler's internal control-plane mesh.

The CA is multi-tenant — your company shares it with ~4000 others — but tenant isolation is enforced at the row level on every read. You never see another tenant's rules. The Org ID is shown in Administration → Company Profile → Org ID — not in the URL — and you'll need it on every Zscaler support call.

Public Service Edge (PSE) — the enforcement plane

PSEs are the actual servers (VMs running in Zscaler-operated data centres) that intercept user traffic, evaluate policy, and proxy to the internet. ~150+ PSE pools live worldwide; each pool typically has 4–8 active PSEs behind a single GeoDNS-resolved IP (Zscaler uses GeoDNS — not anycast — for ZIA PSE selection). Inside the PSE the Single Scan Multi-Action (SSMA) engine parses each packet once and runs every check (URL filter, SSL inspect, malware, DLP, IPS, sandbox) in parallel — that's why Zscaler can do SSL inspection at line rate where on-prem proxies usually need to serialise checks.

Every PSE has the same code running. The differences between PSEs are: (a) physical location, (b) which Trust Pool they're assigned to. Otherwise they're interchangeable.

Sub-Clouds — the tenant constraint layer

By default your tenant can land on any PSE in your Zscaler cloud (best-latency wins). A Sub-Cloud is a per-tenant constraint that says "for these users / these locations, only use this subset of PSEs." Real reasons to use Sub-Clouds:

You configure Sub-Clouds in Administration → Resources → Sub-Cloud. Then attach them to Locations (per-site) or Departments (per-user-group).

Service Edges (Private + Virtual) — when public PSEs aren't enough

Three flavours, easy to confuse — keep them straight:

TypeLives whereWhy use it
Public Service Edge (PSE)Zscaler data centresDefault. Most tenants only use these.
Private Service EdgeCustomer's own DC / VMStrict data-sovereignty or air-gapped environments. Same code as PSE, customer-operated.
Virtual Service Edge (VSE)Hyperscaler VM (AWS / Azure)Burst capacity or specific region where Zscaler lacks a PSE. Customer-owned VM, customer-billed cloud compute.

L1/L2 engineers may never touch Private or Virtual Service Edges. But know they exist — interviewers ask the difference.

Sub-Cloud variants — compliance flavours of each Zscaler cloud

Sub-Cloud variants: Each Zscaler cloud (zscalerone, zscalertwo, zscalerthree, zscloud, etc.) has variants — standard, GDPR (EU-resident processing), FedRAMP (US gov), Compliance (PCI/HIPAA isolation). The variant constrains the PSE list your tenant can land on. SSL Trust Store config is separate (under Administration → SSL Inspection).

Nanolog Cluster — the log plane

Nanolog is a separate cluster of servers per Zscaler cloud. Every PSE streams transaction metadata (URL, response code, file hash, user, location, policy hit) to Nanolog in real time. Inside Nanolog the data is compressed (~50:1 ratio — that's how Zscaler stores billions of transactions cheaply) and indexed for Web Insights queries. NSS / Cloud NSS connects to Nanolog and ships records to your SIEM. End-to-end latency PSE → Nanolog → query: typically 2–5 min for Web Insights (UI search index) and ~1 min for NSS streaming to your SIEM.

The packet walk — one HTTPS request, every component touched

Trace one packet: a Mumbai-based user opens github.com/zscaler/private-repo in Chrome. Here's exactly what happens, in order:

Full ZIA packet walkthrough — Mumbai user → github.com
ZIA packet walkthrough — 9 numbered steps Step-by-step linear flow: 1 Chrome resolves DNS, 2 ZCC intercepts, 3 Z-Tunnel 2.0 to GeoDNS-nearest PSE, 4 PSE checks location policy, 5 SSMA inspects, 6 Allow + log to Nanolog, 7 PSE-initiated outbound to GitHub, 8 Response back through PSE, 9 To Chrome. 1 Chrome on laptop GET github.com (DNS) 2 ZCC intercepts (Z-Tunnel 2.0) all TCP/UDP → tunneled, GeoDNS → Mumbai PSE 3 Mumbai PSE matches Location: "Mumbai-HQ" → applies its policy bundle Location ID found via source IP / ZCC enrollment → no Sub-Cloud constraint hit 4 SSMA inline — single parse, parallel checks URL=Tech/Dev · SSL inspect=ON · Malware scan · IPS · DLP · CASB · Sandbox All checks return ALLOW → policy hit logged 5 PSE → github.com outbound, PSE IP 6 HTTP 200 + body → PSE re-encrypts → ZCC 7 Async → Nanolog ~50:1 compressed 8 2–5 min in UI ~1 min NSS → SIEM Web Insights search policy=ALLOW

Eight numbered steps from a Mumbai laptop's browser to GitHub and back. Note step 3 — Location matching happens at the PSE, not at the CA. The PSE looks up the source identity (ZCC enrollment ID or source IP) and decides which Location's policy bundle to apply. If the Location is wrong, the wrong policy applies — that's the #1 ZIA misconfiguration in production.

Trace this packet in our simulator Cloud Connector Lab

The ZIA Admin Portal — guided tour

Log in at https://admin.zscaler.net (or your cloud's URL — admin.zscalerthree.net, admin.zscloud.net). The sidebar has 6 sections. Here's what lives where — memorise this layout, it's identical across every Zscaler tenant in the world:

Sidebar sectionWhat's insideYou'll spend time on…
DashboardTenant-wide stats, top categories, threats blocked, bandwidthDaily morning glance — anomaly detection
PolicyURL Filtering · Cloud App Control · FW · IPS · DNS · Malware · Sandbox · DLP90% of your day-job is here
AdministrationLocations · Sub-Locations · Departments · Users · Auth · Sub-CloudsDay 1 of a new tenant rollout
InsightsWeb · Firewall · DNS · Tunnel logs (Nanolog-backed search UI)Every troubleshooting call
AnalyticsPre-built reports, Risk Assessment, Compliance dashboardsMonthly exec review
Activation"Activate" button — pushes your saved-but-staged config to all PSEsAfter every change (don't forget!)
Common Mistake — forgetting to Activate

Every change in the ZIA Admin Portal is staged until you click Activation → Activate. Engineers new to Zscaler save a policy, refresh the page, and assume it's live. It isn't — it sits in the staging area until you push it. The Activation banner at the top of every page ("You have unsaved changes") is your reminder. Forgetting this is responsible for half the "I changed the rule but nothing happened" tickets.

Locations & Sub-Locations — the identity-by-IP layer

A Location in ZIA is a named source identity that maps to one or more public IPs. Your Mumbai HQ has IP 203.0.113.10 on its internet gateway? Create a Location called "Mumbai-HQ" with that IP. Every request hitting a PSE from 203.0.113.10 is now identified as coming from Mumbai-HQ, and the policy bundle for Mumbai-HQ applies.

A Sub-Location is a refinement within a Location. Same Mumbai-HQ has a separate Wi-Fi guest VLAN behind the same public IP? Create Sub-Location "Mumbai-HQ-Guest-WiFi" with the internal IP range (e.g. 10.20.30.0/24). Now the PSE distinguishes "Mumbai-HQ employee on LAN" from "Mumbai-HQ guest on Wi-Fi" — different URL Filtering rules, different bandwidth limits.

For roaming users (laptop on home Wi-Fi), there's no stable public IP. So roaming users are identified via their ZCC enrollment instead — the ZCC client sends an authenticated header that the PSE recognises. The Location for roaming users is usually a special "Road Warrior" Location with no IP, and matches via ZCC auth.

Configure a Location — the steps

ZIA Admin Portal · GUI steps
Administration → Resources → Locations → + Add Location

  Name:                Mumbai-HQ
  Public IP:           203.0.113.10
  Country:             India
  Timezone:            Asia/Kolkata
  Auth Required:       Yes  (forces user authentication)
  Cookie SSO:          Yes  (transparent SAML re-auth)
  XFF Forwarding:      Yes  (preserves real client IP in logs)
  Caution:             Off  (warning page on first visit)
  Bandwidth:           Use Sub-Location rules
  Profile:             Standard (Sub-Cloud not applied)

Save → top banner shows "1 staged change"
→ Activation → Activate Now
   (global activation is usually 60–90s in your region, up to 5 min worldwide)

Configure a Sub-Location

ZIA Admin Portal · Sub-Location for guest Wi-Fi
Administration → Locations → Mumbai-HQ → Add Sub-Location

  Name:                Mumbai-HQ-Guest-WiFi
  IP Range:            10.20.30.0/24
  Inherit policy:      No  (override parent — guests get stricter rules)
  Bandwidth Cap:       50 Mbps (down) / 20 Mbps (up)
  URL Filter Override: Yes → "Guest-Restricted" rule set

Save → Activate
💡Pro Tip — XFF and your internal logging

Always enable X-Forwarded-For (XFF) Forwarding on every Location. With it on, the PSE preserves the original client's internal IP (e.g. 10.20.30.45) in the request to the destination. Internal apps behind the PSE that log XFF will see the real source. Without XFF, every internal log shows the same PSE egress IP — useless for forensics.

Verify — confirm Location is correctly assigned to a user's traffic

After creating a Location, ask a user at that site to open https://ip.zscaler.com. The page returns:

If the Location field shows "Unknown" or the wrong name, your IP is wrong or the change hasn't been Activated yet.

Common production gotchas (you'll hit these)

Common Mistakes — bookmark these

Real-world scenario — branch IP changed, half the office is "wrong"

Sunday morning, the Pune branch's ISP swaps circuits during a planned outage. Public IP changes from 203.0.113.10 to 198.51.100.50. Monday morning, the Pune team complains: "YouTube which was blocked at the office is now allowed. And the corporate intranet is asking for re-auth every request."

Your debug path, using everything from this lesson:

  1. Ask a Pune user to hit https://ip.zscaler.com. It returns the new public IP 198.51.100.50 and Location: Road Warrior (the default catch-all). That's the root cause — ZIA is treating them as roaming users, not as Pune-HQ.
  2. Roaming users get the default URL Filtering policy (looser — YouTube allowed). And without the Pune Location's Cookie SSO setting, users re-auth on every request.
  3. Fix: Administration → Locations → Pune-HQ → update Public IP to 198.51.100.50 → Save → Activation → Activate Now. Wait 60s. Re-test with ip.zscaler.com — Location should now show "Pune-HQ".
  4. Validate in Web Insights — filter by Location=Pune-HQ for the last 5 minutes; you should see Pune traffic returning. Cookie SSO re-engages, intranet auth stops popping.

Total fix time once you know the path: about 2 minutes. The whole incident would have been zero minutes if the branch network team had pinged you about the IP swap before Sunday.

Branch IP swap troubleshooting drill Real Tenant Troubleshooting

📌 Quick reference (memorise before Module 3)

QUICK LAB · ~15 MIN

Trace a request end-to-end:

  1. From your laptop with ZCC running, open DevTools and load https://www.cnn.com. Note Response headers — find any X-Zscaler-* markers.
  2. In ZIA Admin → Analytics → Web Insights, search for your username in the last 5 min. Find the request, click into details — note: PSE name, Sub-Cloud, location, policy hit.
  3. Compare PSE name to your tenant's published cenr list — verify it's in your trust pool.

📝 Check your understanding

10 scenario questions — same depth you'll see in interviews + ZDTA practice exams. Pick one answer per question. You need 70% (7 of 10) to mark this lesson complete on your profile.

Q1

You changed a URL Filtering rule in the ZIA Admin Portal at 9:05 AM. At 9:30 AM, users still report the old behaviour. What's the first thing to check?

Correct: (c). The #1 ZIA newbie mistake. Every Admin Portal change is staged until you click Activate. The banner at the top of every page warns "you have unsaved changes" but it's easy to miss. (a) the CA push is per-tenant — once activated, regional rollout is typically 60–90 s, full-worldwide up to 5 min. (b) is possible but rarer than missed activation. (d) Nanolog health affects log visibility, not policy enforcement.
Q2

A user at the Pune branch hits https://ip.zscaler.com and the page returns Location: Road Warrior instead of the expected "Pune-HQ". What's the most likely cause?

Correct: (a). Location identification at the PSE is keyed on source IP. If the public IP changes (very common during ISP circuit swaps) and you don't update the Location's IP field, the PSE can't match the source → falls back to the "Road Warrior" default with the wrong policy. (b) Sub-Cloud constraints select PSEs, not Locations. (c) SSL Trust Store affects decryption, not source identity. (d) Nanolog is a log plane — never blocks live identification.
Q3

Your Mumbai HQ has 4000 employees on the corporate LAN (192.168.0.0/16) AND a guest Wi-Fi network on 10.20.30.0/24, both behind the same single public IP. How do you give employees and guests different URL Filtering rules?

Correct: (b). Sub-Locations exist for exactly this — refining inside a Location by internal IP range so you can apply distinct policies. (a) ZIA doesn't allow two Locations sharing the same public IP — they'd collide on PSE lookup. (c) Sub-Clouds restrict which PSEs are used; they don't split users by IP. (d) App Connectors are ZPA components — irrelevant here (ZIA = internet-bound).
Q4

SOC asks you why their internal Splunk logs show the same source IP (the PSE's egress) for every user request crossing the Zscaler tenant — they want the real client IP. What's the fix?

Correct: (d). XFF Forwarding is a per-Location toggle. With it on, the PSE adds (or preserves) the X-Forwarded-For HTTP header containing the client's real source IP. Internal apps and SIEMs that read XFF then see the real source. (a) NSS streams Zscaler logs, not internal app logs. (b) Private Service Edge doesn't change how XFF is set. (c) Trusting the PSE in Splunk doesn't give you the client IP if it's not in the request.
Q5

A German subsidiary's GDPR audit requires that all their web traffic only be inspected in EU PSEs — never US or APAC. The rest of the company can use any PSE. You configure which feature, and attach it where?

Correct: (c). Sub-Clouds are the per-tenant PSE constraint feature — exactly for data-residency requirements. Attach to a Location or Department to scope it. (a) SSL Trust Store controls CA trust for decryption, not PSE geographic selection. (b) Private Service Edge is overkill (more cost, more ops); Sub-Cloud is enough. (d) Separate tenant adds licensing cost and breaks unified policy management.
Q6

Walk through the ZIA packet flow correctly. Which sequence describes what happens when a Mumbai user opens github.com via Z-Tunnel 2.0?

Correct: (b). The CA pushes policy to the PSE in advance — it's never in the live data path. Nanolog receives an async log copy, also not in the data path. The PSE does Location lookup + SSMA in-line, then initiates its own outbound connection to the destination on the user's behalf (the user never touches the destination IP directly). (a)/(d) wrongly put CA in-line. (c) Nanolog is logs, not auth.
Q7

A user complains about an SSL certificate error visiting an internal HR app. The PSE is doing SSL inspection. Where do you look first in the Admin Portal?

Correct: (a). Web Insights is the per-transaction debug view. Filter by user/URL/timeframe and the SSL Inspection event detail tells you whether the cert chain failed, was pinned, or matched an exemption rule. From there you check Policy → SSL Inspection for any "do not inspect" rule for this domain. (b) Sub-Clouds isn't a per-transaction view. (c) Analytics is for trends, not individual events. (d) Dashboard is tenant-wide aggregates.
Q8

You're explaining ZIA to a junior who keeps confusing CA and PSE. What's the cleanest one-liner for each?

Correct: (b). Clean separation: CA = write-plane, PSE = run-plane, push direction is CA → PSE. (a) is the opposite. (c) wrongly assigns SSL inspection (PSE's job) and logging (Nanolog's job). (d) they are very different components.
Q9

An air-gapped defence customer cannot allow user traffic to leave their physical premises but wants ZIA-equivalent inspection. Which Service Edge variant fits?

Correct: (d). Private Service Edge is purpose-built for this — the customer hosts the appliance on-prem, but the policy still comes from the same CA (multi-cloud control plane). (a) Public PSE is in Zscaler DCs — fails the air-gap requirement. (b) Virtual SE in AWS still leaves premises — fails air-gap. (c) App Connector is ZPA (private apps), not ZIA (internet-bound).
Q10

After creating a new Location, you want a fast, end-user-friendly way to confirm the PSE is mapping their traffic to the right Location. What's the single fastest check — no admin login needed?

Correct: (c). https://ip.zscaler.com is the universal diagnostic — anyone with a browser whose traffic is going through Zscaler can hit it and instantly see Cloud, PSE, Location, and inspection status. Bookmark it as the first command in any ZIA troubleshooting playbook. (a) traceroute doesn't surface ZIA's logical Location. (b) too slow + admin login needed. (d) reboot is a cargo-cult fix.
Lesson complete — saved to your profile.
Almost! Review the sections above and try again — you need 70% (7 of 10) to mark this lesson complete.

What's next — Lesson 3

You can now map every component, walk the packet, and configure Locations + Sub-Locations. Next lesson opens up identity: how ZIA and ZPA both authenticate users — SAML SSO assertion walkthrough, IdP integration (Azure AD / Okta / Ping), SCIM provisioning, and ZIdentity.