TTechclick All lessons
Zscaler Β· Batch 11 Β· Lesson 10L2 / IMPLEMENTATION

ZPA Connectors β€” Deploying App, Branch & Cloud Connectors in Production

Where ZPA stops being a diagram and starts being a real VM. How to deploy App, Branch, and Cloud Connectors β€” sizing, HA, registration, and the firewall + OS gotchas that bite in week 1.

πŸ“… 23 May 2026 Β· ⏱ 14 min read Β· 🏷 10-question assessment included
🎯 By the end of this lesson, you'll be able to

Why this lesson matters β€” connectors are where ZPA becomes real

Lesson 9 left you with a clean architecture: four components, double inside-out tunnel, dark apps, no inbound ports. That diagram is honest, but it hides the fact that one of those four components β€” the App Connector β€” is literally a Linux VM you have to build, harden, register, monitor, patch, scale, and pair into HA groups, in every place an internal app lives. The architecture diagram does not run itself.

This is the lesson where ZPA stops being slideware and becomes a deployment plan. The choices you make here β€” where you place connectors, how many you run per failure domain, what size you give them, which group they join, what your egress firewall allows them to talk to β€” directly determine three things students will be measured on in interviews and in their first 90 days on the job:

The cousins β€” Branch Connector and Cloud Connector β€” solve adjacent problems (office user egress to ZIA, and cloud-workload egress to ZIA respectively). Most people new to ZPA confuse them. We will fix that explicitly, because in production you will be asked to recommend one over the other on day one.

The three connector flavours β€” when to use which

Zscaler ships three connector products. They look similar (lightweight Linux VM, outbound-only, registers to Zscaler Cloud), but they serve completely different traffic patterns. Get this table cold before week one β€” recruiters love asking it.

ConnectorWhat it brokersWhere it sitsWhat it replaces
App ConnectorInbound user requests to your private apps (Jira, SAP, RDP host, internal API). Pure ZPA play.Next to the app β€” in the DC subnet, the AWS VPC, the Azure VNet, the colo.VPN concentrator + reverse proxy + WAF + ADC for internal apps.
Branch ConnectorOutbound user traffic from a small office to ZIA cloud for inspection. Pure ZIA forwarding.At the office edge β€” on a small VM, an x86 appliance, or the office router itself.SD-WAN edge or branch firewall doing GRE/IPSec/PAC to ZIA. Also replaces "tunnel of last resort" config.
Cloud ConnectorOutbound traffic from cloud workloads (EC2, GKE node, Azure VM) to ZIA for inspection β€” without installing Z-App on every instance.Inside the cloud VPC/VNet, anchored to a NAT/route table that catches workload egress.VPC-level NAT gateway + manual proxy config on every workload. Also Z-App on container hosts (which is awful).

Plainer rule of thumb:

One more nuance students miss: Branch Connector does not serve ZPA. If you have a branch office that needs both internet inspection and access to private apps, you deploy Branch Connector at the edge (for ZIA forwarding) and install Z-App on the user devices (for ZPA). Branch Connector and App Connector are not substitutes for each other.

The whole picture on one page

ZPA connector landscape β€” three flavours, one cloud
ZPA connector landscape Central ZPA cloud broker. Left side users and offices. Right side three connector clusters: App Connector at private apps, Branch Connector at office edge, Cloud Connector inside AWS VPC. All arrows outbound to centre. ZPA + ZIA CLOUD Broker Β· Policy Engine Public Service Edges (anycast) accepts established TLS only Roaming user (Z-App) Anywhere Β· laptop / phone β†’ TCP/443 outbound Small branch office No firewall Β· guest WiFi Branch Connector at edge β†’ tunnel to ZIA Cloud workloads EC2 / GKE pods Β· no Z-App β†’ route via Cloud Conn App Connector DC / AWS / Azure Serves: Jira, SAP, RDP β‰₯2 per failure domain β†’ TCP/443 + 9000 outbound Branch Connector Office edge VM / appliance Forwards office user traffic to ZIA Public Service Edges β†’ tunnel egress to ZIA Cloud Connector Inside VPC / VNet Anchors workload egress IP No agent on each instance β†’ tunnel egress to ZIA USERS & SOURCES CONNECTORS ZSCALER CLOUD β›” Every connector dials out only Β· zero inbound ports anywhere

Three connector flavours, one cloud. App Connector serves your apps (right→cloud), Branch Connector serves your office users (left→cloud via its own edge VM), Cloud Connector serves your cloud workloads. Every arrow is outbound; no one in this picture accepts new inbound TCP from outside.

App Connector Simulator Branch Connector Simulator Cloud Connector Simulator

App Connector β€” VMware / AWS / Azure deployment walkthrough

You will deploy more App Connectors than the other two flavours combined, because every place a private app lives needs one. Three deployment surfaces dominate: VMware in the DC, AWS in a VPC, Azure in a VNet. The prereqs are nearly identical; the install mechanics differ slightly.

Prereqs that bite in pilot

Install script β€” AWS (Amazon Linux 2)

This is the path you'll use most often in modern deployments. Spin up an EC2 instance (t3.medium or larger, in a private subnet, with a NAT Gateway for outbound), then bake the connector in via cloud-init userdata:

terminal Β· root on the new RHEL/CentOS host
# 1. Download the App Connector RPM from the ZPA Admin Portal:
#    Administration β†’ App Connectors β†’ Download β†’ Linux (RHEL/CentOS)
#    OR use the published cloud image (AMI / Azure VHD / GCP image)

# 2. Install the RPM on a 2vCPU/4GB minimum RHEL 8/9 or CentOS 8 host
sudo yum localinstall -y zpa-connector-VERSION.x86_64.rpm

# 3. Drop the provision key (copied from the same Admin Portal page)
sudo bash -c 'echo "YOUR_PROVISION_KEY" > /opt/zscaler/var/provision_key'
sudo chown zscaler:zscaler /opt/zscaler/var/provision_key
sudo chmod 600 /opt/zscaler/var/provision_key

# 4. Enable + start the service. Registration happens automatically on first start.
sudo systemctl enable --now zpa-connector

# 5. Verify
sudo journalctl -u zpa-connector -f
# Look for "Successfully enrolled" and "Connected to broker"
⚠No zpa-connector enroll CLI verb exists

Registration is driven by the provision_key file at first systemd start β€” there is no separate enroll sub-command. If you see zpa-connector enroll in a guide, the guide is wrong. The presence of /opt/zscaler/var/provision_key when the service starts is what triggers the one-shot enrollment exchange; on success the connector swaps the key for a per-device cert and you'll never need the key again.

Within roughly 30 seconds the connector appears in the ZPA admin portal as Healthy, attached to whichever Connector Group the provision key was bound to. Repeat the whole exercise on a second EC2 in a different availability zone β€” same Connector Group β€” to satisfy N+1 HA from day one.

VMware (DC) and Azure (VNet) β€” the differences

App Connector auto-update

App Connectors auto-update from the cloud by default β€” Zscaler pushes new versions on its own cadence, no admin action. For change-controlled environments (banking, healthcare): pin a version under Administration β†’ App Connectors β†’ Group β†’ Version Pinning. Without pinning, a connector might silently upgrade on a Tuesday afternoon β€” keep this in your change calendar.

Connector log paths

Log paths: /var/log/zpa/connector.log (active), journalctl -u zpa-connector -f (systemd stream). Set LOG_LEVEL=DEBUG in /etc/zpa-connector/config only for active troubleshooting β€” debug logs are massive.

Capacity sizing β€” concurrent users per connector by app type

The single biggest day-one sizing mistake is treating "concurrent users" as a single number. ZPA throughput depends massively on the protocol mix. A connector that comfortably brokers 1,500 Jira (HTTP) users will buckle at 200 RDP users. Use this as your starting calculator:

App typePer-user bandwidth (avg)~Concurrent users on 2 vCPU / 4 GB connector~Concurrent users on 4 vCPU / 8 GB connector
HTTP/HTTPS app (Jira, Confluence, internal portal)50–150 kbps idle, bursts to 2 Mbps~250–500 (rule of thumb: ~250 sessions/vCPU at minimum spec; scale to 4vCPU/8GB or run 2–3 connectors in the group for 1,000+)~1,000–1,500
SSH / Git over SSH (developer)30–80 kbps800–1,2002,000–2,800
RDP (Windows remote desktop)200 kbps – 2 Mbps depending on resolution150–250400–600
VDI / Citrix HDX200 kbps – 4 Mbps100–200300–450
SMB / CIFS (file share)burst 50 Mbps during transfer40–80 active transfers120–200 active transfers
Voice / SIP over UDP~100 kbps steady, jitter-sensitive200–300500–700

Two rules to take into every sizing conversation:

  1. Always N+1 per group. If your math says one connector handles the load, deploy two. If two handle it, deploy three. The +1 covers patching, hypervisor failure, and unexpected load spikes without a user-visible outage. A "perfectly sized" single connector is a deployment that will fail its first patching window.
  2. Scale horizontally, never vertically. The connector is single-process and gets diminishing returns past 8 vCPU. Five 4-vCPU connectors will out-throughput two 16-vCPU connectors and survive an AZ failure that the bigger pair cannot.

HA β€” Connector Groups and how ZPA Cloud picks a connector

A Connector Group is the unit of HA in ZPA. Group connectors by failure domain β€” usually one group per AWS AZ, one per Azure availability zone, one per DC row, one per branch DC building. Not by application. An app segment gets attached to one or more Connector Groups; when a user request arrives, ZPA Cloud picks any healthy connector from any attached group, weighted by latency and load.

Geometry that works in production:

How a connector actually boots and joins the pool

App Connector boot β†’ enrollment β†’ healthy in pool
App Connector boot and enrollment flow Six numbered steps: VM boots, reads provisioning key, opens outbound TLS to Zen, exchanges key for per-connector cert, registers to ZPA Cloud, ZPA marks Healthy and adds to broker pool. 1 VM boots Β· systemd starts zpa-connector reads /opt/zscaler/var/provision_key 2 DNS-resolves enroll endpoint Β· NTP-syncs clock requires resolvable DNS + chrony in sync 3 Outbound TLS to nearest Zen IP β€” TCP/443 + TCP/9000 egress firewall must allow Zen CIDR list 4 Exchange provisioning key β†’ per-connector cert key consumed (one-shot) Β· cert stored on disk Β· used for all future re-registration connector bound to its Connector Group 5 Connector advertises served segments to ZPA Cloud "I can reach jira-internal.acme.com, sap.acme.com, 10.40.0.0/16:1433" 6 Marked HEALTHY added to broker pool Total elapsed: ~30 seconds on a happy network. Hours on a misconfigured one β€” almost always the egress firewall.

Six steps from cold boot to "Healthy in pool". Steps 3 and 4 are where 90% of failed deployments hang β€” egress firewall blocking TCP/9000, an SSL-inspecting proxy intercepting the Zen TLS, or NTP drift invalidating the enrollment exchange.

Branch Connector β€” when to put it at the office edge

Branch Connector is built for one specific shape of customer pain: a small office, no full-featured firewall, users on guest-grade Wi-Fi, and the business wants their internet traffic inspected by ZIA without buying SD-WAN. Branch Connector ships as a hardware appliance OR as a VM (KVM / Hyper-V / ESXi). The smallest hardware SKU competes with SD-WAN CPE pricing β€” not "NUC in a closet" cheap. Plan for ~$1.5k–$5k per branch hardware + tenant license. All office user traffic is forwarded β€” via a lightweight TLS tunnel β€” to the nearest ZIA Public Service Edge, where full URL filtering, SSL inspection, malware scan, DLP, and sandbox kick in just as if every user were running Z-App.

Use Branch Connector when:

Do not use Branch Connector when:

Cloud Connector β€” when to anchor cloud-workload egress

Cloud workloads β€” EC2 instances, GKE pods, Azure VMs, container hosts β€” egress to the internet for package downloads, API calls, telemetry, and SaaS APIs. Without intervention this egress goes through your VPC's NAT Gateway directly to the internet, completely unfiltered. You don't see what's leaving, you don't apply DLP, you don't catch a compromised container talking to a C2 server.

The naive fix is "install Z-App on every workload". This is awful: containers are ephemeral, autoscaling groups bake new images, the agent install becomes a per-AMI baking concern, and a runtime crash takes a workload offline. Cloud Connector is the answer: a small VM (or a pair, for HA) that you deploy inside the VPC and point your workload subnet route tables at. All outbound traffic from those subnets is captured by Cloud Connector, tunnelled to ZIA Public Service Edges, inspected, and only then released to the internet. The workloads themselves are unmodified.

Use Cloud Connector when:

βœ“Verify β€” is your connector actually healthy?
⚠Common Mistakes β€” the 7 that bite week one
πŸ’‘Pro Tips

Real-world scenario β€” migrating off F5 APM across four DCs

Customer: a mid-size manufacturer running F5 APM as their VPN concentrator for engineering, sales, and contractor remote access. Four data centres: Mumbai, Singapore, Frankfurt, Virginia β€” each running its own Jira, Confluence, Bitbucket, SAP module, and internal toolchain. ~12,000 employees, ~3,000 concurrent VPN users on a typical weekday. F5 APM is two years from end-of-support; the customer wants ZPA before it dies.

Your job: design and deliver the connector layout, then a phased cutover that does not cause a production outage.

Step 1 β€” Connector layout (the design that survives the runbook)

Step 2 β€” Cutover plan that avoids drama

  1. Deploy + register connectors in all four DCs. Verify all eight show Healthy. Run the canary segment test from a script for 24 hours; expect zero failures.
  2. Pilot group of 50 users across all four regions, mixed roles. Push the Z-App with ZPA profile enabled to these users only; leave F5 APM available as fallback. Run for 7 days. Watch the connector health graphs, the ZPA Trace User reports, and the user-feedback channel.
  3. Expand to 500 users per region β€” broader role mix, including a few notoriously fussy engineering tools. Another 7 days. Tune segment definitions for any app that surfaces as misconfigured.
  4. Cutover wave 1 β€” engineering org (3,000 users). Flip Z-App ZPA profile via Intune for the whole engineering AD group on a Friday afternoon. Monitor through the weekend. F5 APM still up but no longer the default route.
  5. Wave 2 + 3 β€” sales then back-office orgs over the next two weeks.
  6. Decommission F5 APM after 30 days of stable ZPA-only operation, with a 7-day "switchback window" where APM stays cold-spare in case of catastrophic ZPA regression.

What goes wrong if you skip the regional grouping

This is the war story junior engineers learn the hard way. Imagine you skip Step 1's regional grouping and instead create a single global Connector Group with all eight connectors. ZPA Cloud's broker is latency-aware but not infinitely smart; some Mumbai users will get brokered to Virginia connectors when Virginia is momentarily less loaded than Mumbai. The user's Jira-Mumbai request travels Mumbai user β†’ Mumbai Service Edge β†’ ZPA Cloud β†’ Virginia App Connector β†’ back across the Internet to Mumbai DC's Jira server β†’ all the way back. Round-trip time goes from ~30 ms to ~430 ms. Every Jira page load adds half a second. Users complain. Tickets pile up. You eventually re-architect with regional groups β€” which is what you should have done on day one.

Lesson: Connector Groups are not just an HA boundary, they're a routing boundary. Use them to express "this connector should serve this region's users" as well as "this connector should serve this region's apps". Both meanings are correct simultaneously.

App Connector β€” full lab ZPA Troubleshooting Cloud Connector

Quick reference β€” ZPA connector deployment

β–Ά QUICK LAB Β· ~15 MIN

Deploy an App Connector from scratch:

  1. From ZPA Admin β†’ Administration β†’ App Connectors β†’ Download. Get the latest RPM + provision key.
  2. On a 2vCPU/4GB RHEL VM: sudo yum localinstall -y zpa-connector-VERSION.rpm
  3. Write the provision key: echo "KEY" | sudo tee /opt/zscaler/var/provision_key + chmod 600.
  4. Start: sudo systemctl enable --now zpa-connector
  5. Watch logs: sudo journalctl -u zpa-connector -f β€” wait for "Successfully enrolled" + "Connected to broker".
  6. In ZPA Admin β†’ confirm the connector appears in your App Connector Group with status Up.

πŸ“ Check your understanding

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

Q1

A retail customer has 80 small stores. Each store has a consumer-grade router (no firewall, no IPSec capability) and guest-grade Wi-Fi used by tablet POS terminals. The CISO wants all internet traffic from those tablets inspected by ZIA. Which connector do you recommend at each store?

Correct: c. Branch Connector is purpose-built for branch offices without a capable edge firewall β€” it sits as a small VM/appliance at the edge and tunnels user traffic to ZIA Public Service Edges for full inspection. App Connector (a) serves inbound to private apps, not ZIA forwarding. Cloud Connector (b) is for cloud workloads, not retail branches. Per-device Z-App (d) is operationally painful on a shared POS device and doesn't solve the guest-Wi-Fi case.
Q2

You deploy an App Connector in AWS. It boots, the ZPA admin portal shows it as "Pending" for over five minutes. journalctl -u zpa-connector on the VM shows successful TLS to Zen IP on TCP/443 but timeouts on TCP/9000. What is the most likely cause?

Correct: b. The connector needs both TCP/443 (registration) and TCP/9000 (control channel). 443 working but 9000 blocked is the textbook symptom of a Security Group or egress firewall that allow-listed only "443 to Zen" and forgot the control channel. (a) would fail TCP/443 too. (c) makes no sense as a failure mode. (d) would slow things down, not break them.
Q3

A team has 500 concurrent RDP users hitting Windows jump hosts behind ZPA. They deployed a single 2 vCPU / 4 GB App Connector "because the sizing guide said that handles 1,000 HTTP users". Users now report stalls, click lag, and periodic disconnections. What is the actual problem?

Correct: a. Per the sizing table, a 2 vCPU connector handles ~150–250 concurrent RDP users β€” protocol mix dominates throughput. They also broke the N+1 HA rule with a single connector. RDP is fully supported by ZPA (c is wrong). Branch Connector (b) is for ZIA forwarding, not private app brokering. Always re-size by protocol mix and always deploy N+1.
Q4

An InfoSec team mandates that every outbound HTTPS request from corporate machines goes through their on-prem Forcepoint proxy, which performs full SSL inspection. After connector deployment, App Connectors stay in "Pending". What's the cleanest fix?

Correct: d. The connector's outbound TLS to Zen is mutually-authenticated with Zscaler's certs. Forcepoint re-signing the traffic with the corporate CA breaks that validation and the session is rejected. The right fix is to bypass SSL inspection (typically via destination-IP allow-list) for the Zscaler Zen CIDR ranges. (a) is not how PKI works between two unrelated CAs. (b) is fabricated β€” the control channel is TCP. (c) is overkill and won't be approved.
Q5

A bank wants 6 internal apps reachable via ZPA. To "keep it simple" the architect creates one big Connector Group containing 4 App Connectors spread across 2 DCs, and attaches all 6 app segments to that single group. What's the principal weakness?

Correct: b. Connector Groups are the unit of HA and the routing boundary. Pooling across DCs in one group means ZPA Cloud can broker a user to the "wrong" DC's connector β€” wasted latency. Better: one group per DC (cg-dc1, cg-dc2), each app segment attached to its native DC's group with the other DC as secondary failover. (a) and (d) are made-up rules; (c) misses the architectural problem.
Q6

A platform team runs 200 ephemeral Kubernetes pods that need to call third-party APIs over the internet. The CISO mandates ZIA inspection of all that egress, with stable source-IP for vendor allow-listing. Per-pod agents are not feasible. Which connector and pattern fits?

Correct: c. Cloud Connector is built for exactly this: cloud-workload egress to ZIA, no agent on each workload, stable anchor IP. App Connector (a) brokers inbound to private apps. Branch Connector (b) is for offices, not VPCs. Per-container Z-App (d) is the anti-pattern Cloud Connector exists to replace.
Q7

An engineer enabled unattended OS auto-patching on App Connector VMs "to be good about security". Three months later, after a scheduled connector software update, every connector crashes on restart with library-mismatch errors. What's the corrective policy?

Correct: a. Connectors are sensitive to underlying library versions because they ship a self-contained TLS / crypto stack. The mature policy is: disable unattended-upgrades, scope to security errata, patch one connector of the HA pair at a time during a controlled window β€” exactly how you patch firewall HA pairs. (b) leaves CVEs unpatched. (c) is wasteful. (d) is the anti-pattern that creates the outage you're trying to avoid.
Q8

A new App Connector deployed in a hardened RHEL 9 image registers fine over TCP/443 but never advertises any segments to ZPA Cloud, and shows as "Disconnected" within 60 seconds. Logs say "auth ok, control channel handshake timeout". setenforce 0 temporarily β€” connector immediately goes healthy. Best long-term action?

Correct: d. The behaviour confirms SELinux is blocking outbound TCP/9000 from the connector process. The right fix is to install the Zscaler-supplied SELinux policy module (so the connector gets the contexts it needs) and re-enable enforcing β€” keeping the hardening benefit without breaking the connector. (a) sacrifices security. (b) doesn't address the actual cause. (c) avoids the issue rather than fixing it.
Q9

You're cutting over 3,000 engineering users from F5 APM to ZPA in 4 DCs. After deploying and registering 8 App Connectors (2 per DC), what is the safest next step before flipping the AD group?

Correct: b. Phased rollout (pilot 50 β†’ expand 500 β†’ wave by org) with the legacy path available as fallback is the standard low-risk cutover. It surfaces app-segment mistakes and policy gaps before they hit thousands of users. (a) trusts a green dot too much β€” connectors can be healthy while specific app segments are misconfigured. (c) and (d) optimize for speed and create user-facing outages.
Q10

A team installs Branch Connector at five small offices to forward internet traffic to ZIA. Users at those offices then complain they cannot reach the internal Jira (a ZPA-protected private app) despite "having Branch Connector". What's the correct fix?

Correct: c. Branch Connector is a ZIA-only forwarder β€” it does not broker ZPA app segments. For private-app access, users need Z-App with the ZPA service profile on their devices, in addition to whatever ZIA-side mechanism (Branch Connector / GRE / Z-App) is forwarding their internet traffic. (a) is a fabricated control β€” there's no "ZPA permissions" toggle on Branch Connector. (b) is the wrong product. (d) doesn't move traffic through ZPA at all.
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?

Module 11 wires policy on top of the connectors β€” App Segments, Segment Groups, Access Policies, Posture Profiles, and the timeout policies that decide when a session must reauthenticate.