The DNS Whisperer
Get DNS Into Zscaler
Block + Custom Allow
Steer DNS via NAT Control
DoH + SSL Inspection
DNS Control in the Real World
ZTR NAT Rule — The Default Resolver
ZIA includes a built-in Destination NAT rule called Zscaler Trusted DNS Resolver. When enabled (the default), it intercepts all DNS traffic on port 53 and redirects it to the ZTR co-located in the same data centre the user is connected to.
| Scenario | ZTR NAT Rule | Who Resolves | DNSSEC |
|---|---|---|---|
| Scenario 1 (bypass) | N/A — DNS never reaches ZIA | Internal DNS server | ❌ None |
| Scenario 2 (external) | Disabled | 3rd-party (Cloudflare, etc.) | Depends on resolver |
| Scenario 3 (default) | Enabled | Zscaler ZTR | ✅ Validated |
Zscaler Trusted Resolver (ZTR)
ZTR is Zscaler's fully recursive, DNSSEC-validating resolver. It runs co-located in 160+ Zscaler data centres globally.
| Capability | Detail |
|---|---|
| Location | Co-located with ZIA Service Edge — no extra network hop |
| DNSSEC | Validates signatures on every response. Protects against cache poisoning. |
| Geolocation | Resolves from local DC — CDNs return nearest node to the user |
| ECS support | Not supported (hard architectural limit). Out of scope for this lab session — use an ECS-capable external resolver in production if needed. |
| DoH termination | ZTR does not accept DoH queries directly. Lab 4 demonstrates how this creates a visibility gap and how to close it with a DNS Control rule. |
| Auto-failover | On SERVFAIL/timeout, ZIA forwards DNS to 8.8.8.8 automatically — no config needed. |
| Cost | Included in your ZIA subscription. No separate DNS appliance or contract required. |
Search your inbox for "DNS Whisperer" to find your lab-details email. It contains the four values below — they identify your Zscaler admin tenant for the duration of the session. The examples below use zs44xx as a placeholder — your Student ID will be something different (e.g., zs4517, zs4521, etc.). The Corp: Client PC inside Skytap uses a separate local Windows password that's the same for every student.
| From your tenant email | Example |
|---|---|
| Student FQDN | zs44xx.safemarch.com |
| Zscaler Admin UI | https://console.zscaler.com |
| Username | student@zs44xx.safemarch.com |
| Password | zs44xx+gmsY4 (yours will be different) |
| — the values below are the same for every student — | |
| Corp: Client PC password (Skytap VM) | Admin-123! |
Ctrl + K — to quickly find any feature across all menus.
Ctrl + K) and the magnifying-glass icon in the top-right are the fastest way to navigate during the labs.1a. Open the Zscaler admin console. Use any browser on your own machine.
1b. Authenticate with the credentials from your lab details email. The password in the email is a one-time password. You'll use it for this first sign-in only; ZIdentity will then prompt you to choose a new password (Step 1c) which you'll use for the rest of the labs.
| Field | Value |
|---|---|
| Login ID | student@<Student FQDN> — e.g., student@zs44xx.safemarch.com |
| Password (one-time) | from the email — format <Student ID>+<random suffix>, e.g., zs44xx+gmsY4 |
student@<Student FQDN> account), then the one-time password from the email. Click Sign In.1c. Choose your password for the rest of the lab. ZIdentity prompts you to set a new password right after the first sign-in. This new password — not the one-time password from the email — is what you'll use for every Zscaler sign-in throughout the labs, including when you sign into ZCC inside the VM (Step 4). Pick something memorable.
Re-Login button. Click it to sign in with your new password.2a. Start the Skytap pod.
- Click the Skytap Portal URL provided in your access instructions.
- Your pod contains a single VM — Corp: Client PC. Ensure its checkbox is selected.
- If the machine has not already started, click the Play button to launch it.
2b. Log into the Corp: Client PC as the local Student user.
- Launch the Corp: Client PC from the Skytap portal.
- Click the Ctrl-Alt-Del icon in the Skytap Toolbar.
- Click the Credential (keys) icon in the Skytap Toolbar.
- Click the Insert Credentials icon next to the password field for the
studentusername, or type the password manually:Admin-123!
student username.Admin-123! password is the same for every student.Throughout these labs you will frequently copy commands, URLs, and configuration values from the lab guide into the lab VMs. Skytap provides a clipboard bridge between your local machine and the VM.
3a. Copy text from your host machine to the VM clipboard.
- Click the clipboard icon in the Skytap Toolbar.
- Paste your text into the Copy/paste: field that appears.
3b. Paste the text inside the VM.
- In the VM, use
Ctrl+V(or right-click → Paste) to paste the copied text.
Ctrl+V (not Cmd+V) inside the VM — the VM does not interpret the macOS Command key.ZCC must be signed in and tunneling before the labs work — this is what carries DNS into ZTE.
4a. Open ZCC from the system tray. Right-click the Zscaler icon in the Windows system tray and choose Open Zscaler. The ZCC sign-in window appears.
4b. Sign in with your student admin credentials. Use the same Login ID as Step 1 (student@<Student FQDN>) and the new password you set in Step 1c. Paste the username via the Skytap clipboard if it's faster.
student@<Student FQDN> account into the username field and proceed through the ZIdentity flow.4c. Verify Tunnel Version = v2.0. Once ZCC is signed in, the Zscaler Client Connector window shows the connectivity details. Confirm Tunnel Version = v2.0 - DTLS — that's the mode the labs depend on.
4d. Verify the App Policy is "DNS Lab". Click the More tab in the left sidebar and scroll to the About section. Confirm App Policy: DNS Lab.
4e. Verify traffic is going through Zscaler. Inside the Corp: Client PC browser, open:
If ZCC is tunneling, the page reports "You are accessing the Internet via Zscaler Cloud" along with your Zscaler proxy IP and Gateway IP. If you instead see your raw public IP and a "you are not going through Zscaler" message, ZCC isn't authenticated — revisit 4a/4b.
ip.zscaler.com from inside the Corp: Client PC — the page confirms traffic is routing through the Zscaler Cloud (in this example, Singapore IV) and shows the signed-in user (student@...).✅ Ready for Lab 1
https://console.zscaler.com/ with your student admin account; temporary password changed.nslookup and an empty DNS Insights view. Then we'll edit the Windows App Profile: set Domain Inclusion to * so every query is sent to Zscaler, and add three Domain Exclusions (*.corp.local, *.safemarch.com, *.qradar.com) so internal zones stay on the corporate resolver. After an Update Policy on ZCC, we'll re-run the lookups and confirm two things in DNS Insights: chatgpt.com now shows up (resolved by ZTR), and intranet.corp.local doesn't (the exclusion kept it off Zscaler entirely).On the lab VM, open Command Prompt and run a baseline DNS query:
nslookup chatgpt.com resolves through the local gateway resolver, returning IPv4 + IPv6 records.Now check whether ZIA saw the query. From the Experience Center top menu:
Logs, then under Internet & SaaS click DNS Insights.On the DNS Insights page, click the Logs tab. Set the timeframe to the last 5 minutes. Add a filter Requested Domain Contains chatgpt and click Run Query:
Requested Domain Contains chatgpt shows No data for selected time range. The query bypassed Zscaler entirely.From the Experience Center top menu, navigate to:
Infrastructure → Connectors, then in the left panel Client → Windows.You'll land on the Windows page showing the App Profiles list. Find the row for the DNS Lab policy and click the Edit (pencil) icon in the Actions column:
DNS Lab row.The Edit Windows Policy dialog opens to the DNS tab in the Traffic Steering section. You'll make two changes here:
- Set Domain Inclusion to
*— sends every DNS query to Zscaler. - Add three Domain Exclusions — keeps internal-zone queries on the corporate resolver so they never reach ZIA:
*.corp.local*.safemarch.com*.qradar.com
In the Domain Inclusion field, type *. The field offers "Create ‘*’" as a suggestion — accept it:
* with the Create ‘*’ option selected.Now move to Domain Exclusion and add the three internal zones one at a time, pressing Enter after each. Once all three are listed, click Save at the bottom of the dialog:
*.corp.local, *.safemarch.com, *.qradar.com. Click Save to commit.On the lab VM, open the Zscaler Client Connector application (double-click the tray icon, or right-click → Open). In the left navigation, click the More tab. In the About section, click Update Policy next to the App Policy line:
Run two queries from Command Prompt on the VM — one public, one internal:
chatgpt.com resolves through ZTR. intranet.corp.local returns NXDOMAIN — expected, because the host doesn't really exist; we're using it as a test name that matches the *.corp.local exclusion. The proof of the exclusion working is on the next screen: no log entry in DNS Insights means ZCC never forwarded the query.
nslookup chatgpt.com succeeds via ZTR; nslookup intranet.corp.local hits the local resolver and returns NXDOMAIN because the exclusion kept the query off Zscaler.Open Experience Center → Logs → DNS Insights → Logs and re-run the same filter (Requested Domain Contains chatgpt). The Insights pane that was empty in Step 1 now populates with rows — one per query — attributed to your user, with Resolver Gateway = ZTR:
Now change the filter to Requested Domain Contains intranet and run the query again. The pane is empty — even though you just ran the lookup on the VM. That's the exclusion working: Zscaler never saw the query, so there's nothing to log:
intranet — No data for selected time range. Proof that the *.corp.local exclusion stopped ZCC from forwarding the query.chatgpt row still doesn't appear: re-run Update Policy on the ZCC client; confirm Save was clicked inside the App Profile dialog (it closes silently, easy to miss); give Insights another 30 seconds for log ingest.✅ Verification
chatgpt.com resolved on the VM, but DNS Insights was empty.chatgpt.com appears with Resolver Gateway = ZTR, Action = Allow.intranet.corp.local does not appear — Domain Exclusion stopped ZCC from forwarding it.https://ip.zscaler.com confirms "Internet via Zscaler Cloud" (Z-Tunnel 2.0).https://ip.zscaler.com inside the VM browser. If it confirms you're going through Zscaler Cloud, ZCC is healthy and Lab 2 will work. If not, sign back into ZCC (Prerequisites → Step 4) before continuing.What you just built
The Domain Exclusion list is evaluated before the wildcard Inclusion — that's why these three zones stay on the corporate resolver while everything else flows to Zscaler.
888.com) back out of the block: create a custom URL category for it, add a top-order DNS Control Allow rule that points at that category, and verify 888.com resolves while bet365.com stays blocked. Both queries stay logged in DNS Insights so you can see the block and the allow side-by-side in the audit trail.DNS Control Exclusions containing 888.com and a top-order DNS Control rule that Allows it. After activation, bet365.com stays blocked while 888.com resolves — both visible in Insights with the right Action.
ipconfig /flushdns on the VM before re-testing a domain. Windows keeps cached answers and will happily serve them ahead of your new policy. DNS Insights can also lag by 2–3 minutes before the new query shows up — if the log looks empty, give it a moment and refresh.From the lab VM, run a baseline query against a Gambling-category domain. With no DNS Control rule yet, the query should resolve normally:
www.gambling.com resolves to public CDN IPs. Note these for comparison after the policy is in place.Navigate to DNS Control:
On the DNS Control page, click + Add DNS Filtering Rule:
In the DNS Filtering Rule dialog, set the rule basics:
| Field | Value |
|---|---|
| Rule Order | 1 |
| Rule Name | Block Gambling |
| Rule Status | Enabled |
Block Gambling, Status = Enabled.Switch to the DNS Application tab. Set both Request and Response Categories to Gambling:
| Field | Value |
|---|---|
| Request Categories | Gambling |
| Response Categories | Gambling |
Gambling.Scroll to the bottom. Set Network Traffic action to Block and click Save:
Block. Click Save.The orange Pending Activation indicator appears in the top-right of the Experience Center. Click it, then click Activate:
Confirm normal traffic still works (sanity check that you didn't block too much):
www.google.com still resolves — the rule is targeted at Gambling only.Flush the Windows DNS cache so the previous successful Gambling response isn't served from cache:
Re-run the gambling lookup. The query should now time out — the block fires before resolution:
nslookup gambling.com times out — the DNS Control Block Gambling rule fires before the upstream resolver answers.Filter by your Rule Name = Block Gambling and an appropriate timeframe. Click Apply Filters:
Block Gambling, current day timeframe.The Logs table populates with rows for each blocked query. Each shows the user, source IP, requested domain, response IP, request category, response type, and the Block action:
www.gambling.com blocked, attributed to the lab user. Action column shows Block.888.com is currently caught by the Gambling block from Step 4. To provide an exception, you'll add it to a custom URL category and reference that category in a top-order DNS Control Allow rule.
6a. Create the custom URL Category. Navigate to:
On the URL Categories page, click + Add URL Category. In the dialog, set:
| Field | Value |
|---|---|
| Name | DNS Control Exclusions |
| URL Super Category | User-Defined |
| Scope Type | Any |
| Custom URLs | 888.com — click Add Items to commit |
DNS Control Exclusions, Custom URLs contains 888.com. Click Add Items to commit the URL, then Save.
888.com is saved into the category. Click Save on the dialog.6b. Build a top-order Allow rule in DNS Control. Open the quick-search (top-right magnifier in Experience Center) and search for dns con, then click DNS Control:
dns con surfaces the DNS Control page (Policies → Access Control → Firewall → DNS Control).Click + Add DNS Filtering Rule. In the rule editor, set:
| Field | Value |
|---|---|
| Rule Order | 1 — must be above the Block Gambling rule |
| Rule Name | DNS Control Exclusions |
| Rule Status | Enabled |
DNS Control Exclusions, Status = Enabled. Order 1 puts it above the Block Gambling rule, so it wins the first-match evaluation.Switch to the DNS Application tab. Set both Request and Response Categories to the custom category you just built. In the Action panel, set Network Traffic to Allow:
| Field | Value |
|---|---|
| Request Categories | DNS Control Exclusions |
| Response Categories | DNS Control Exclusions |
| Network Traffic Action | Allow |
DNS Control Exclusions, Action = Allow. Click Save.6c. Activate. Click the orange Pending Activation indicator and confirm:
6d. Verify. From Command Prompt on the VM, test a still-blocked Gambling domain (bet365.com) and the exempted domain (888.com) back-to-back:
bet365.com still times out — it's in the Gambling category but isn't in your custom exemption list, so the Block Gambling rule still fires. 888.com resolves to public IPs because the top-order Allow rule matched first:
nslookup bet365.com times out (still blocked by Gambling rule); nslookup 888.com returns real IPs because the Allow rule matched first.bet365 and you'll see Action = Block, Rule Name = Block Gambling. Filter by 888 and you'll see Action = Allow, Rule Name = DNS Control Exclusions. Full visibility, full audit trail — that's the value of carving out at the DNS Control layer instead of bypassing at the client.✅ Verification
nslookup www.gambling.com and nslookup bet365.com on the VM time out.nslookup 888.com resolves to public IPs.bet365.com with Action = Block and 888.com with Action = Allow.What you just built
Letting all DNS reach Zscaler and carving exceptions at the DNS Control layer keeps every query visible in Insights. The rule order is the policy — the Allow on top wins for 888.com, the Block underneath still catches the rest of the Gambling category.
netflix.com as the test domain to verify the flip. First we'll run a baseline nslookup netflix.com and confirm DNS Insights shows Resolver Gateway = ZTR, Server Protocol = UDP. Then we'll create a named DNS Gateway (Cloudflare) pointing at cloudflare-dns.com, add a top-order NAT Control rule (Network Services = DNS, no domain filter) that redirects all DNS through that gateway, activate, and re-test. The flip lives in DNS Insights: Resolver Gateway becomes Cloudflare, Server Protocol becomes DNS Over HTTPS, HTTP Status Code becomes 200 - OK. Once you've seen the change, we'll delete the NAT rule so the rest of the labs run on ZTR again.Cloudflare DNS Gateway (Primary = cloudflare-dns.com, Protocol = DoH+TCP+UDP, Failure Behavior = Return Error Response). Add a NAT Control rule at Order 1 using Redirect Request Using DoH targeting it — the rule has Network Services = DNS and no destination filter, so it applies to all DNS traffic. Use netflix.com as the probe and confirm in DNS Insights that DNS is now resolving via Cloudflare over DoH. Then delete the rule so ZTR resumes.
From the lab VM, run a baseline DNS query to confirm ZTR is currently answering:
nslookup netflix.com resolves to a mix of IPv4 and IPv6 addresses. We'll keep using this same query throughout the lab to compare the before / after states.Now check how Zscaler logged that query. Navigate to:
Filter Requested Domain Contains netflix, set the timeframe to the last few minutes, and run the query. You should see one row per nslookup attempt, with Resolver Gateway = Zscaler Trusted DNS Resolver and Server Protocol = UDP:
None (DoH-only field, not applicable on UDP). This is the default we're about to flip.
The DNS Gateway is the named, protocol-aware abstraction a NAT Control rule will point at. Build it first, then wire the rule to it.
Open the top-right search in Experience Center (magnifier icon) and type proxies. Click the Proxies and Gateways result:
proxies — the page lives under Infrastructure → Internet & SaaS → Network Policies → Forwarding Control, but search is the fastest way in.On the Proxies & Gateways page, click the DNS Gateways tab. You'll see the predefined Zscaler Trusted DNS Resolver entry. Click + Add DNS Gateway and configure:
| Field | Value |
|---|---|
| Name | Cloudflare |
| Protocol | DNS over HTTPS; TCP; UDP |
| Primary DNS Server | cloudflare-dns.com |
| UDP / TCP Port | 53 (default) |
| DoH Port | 443 (default) |
| Secondary DNS Server | Leave empty |
| Failure Behavior | Return Error Response |
Click Save:
Cloudflare over DoH (with UDP/TCP fallback) targeting cloudflare-dns.com, with Failure Behavior = Return Error Response.
On the Firewall Filtering Policy page, switch to the NAT Control Policy tab. You'll see the predefined Zscaler Trusted DNS Resolver rule already in the list (Rule Order 1). Click + Add NAT Control Rule to layer a custom rule above it:
Zscaler Trusted DNS Resolver rule visible. Click + Add NAT Control Rule.In the Add NAT Control Rule dialog, configure the rule basics:
| Field | Value |
|---|---|
| Rule Order | 1 (above the predefined ZTR rule) |
| Rule Name | Cloudflare DNS |
| Rule Status | Enabled |
| Who, Where, & When | Default (any user, any location, any time) |
Switch to the Services tab. Set Network Services = DNS. Then in the Action panel, pick Redirect Request Using DoH from the DNS Gateway or DNAT IP/FQDN & Port dropdown, and select Cloudflare from the DNS Gateway dropdown:
| Field | Value |
|---|---|
| Services tab → Network Services | DNS |
| Action → DNS Gateway or DNAT IP/FQDN & Port | Redirect Request Using DoH |
| Action → DNS Gateway | Cloudflare |
Click Save:
Cloudflare DNS, Services = DNS, Action = Redirect Request Using DoH via the Cloudflare gateway.Click the orange Pending Activation badge in the top-right of the Experience Center, then click Activate:
Re-run the test query on the VM:
The query still resolves; the Server: line in nslookup doesn't change — ZIA's NAT is invisible to the client. The flip lives in DNS Insights. Re-run the netflix filter and compare against Step 1:
| Column | Before | After |
|---|---|---|
| Resolver Gateway | Zscaler Trusted DNS Resolver | Cloudflare |
| Server Protocol | UDP | DNS Over HTTPS |
| HTTP Status Code | None | 200 - OK |
Surface the Server IP column to confirm the upstream — every netflix row shows a Cloudflare-owned IP (typically 1.1.1.1 or 1.0.0.1 — ZIA resolved cloudflare-dns.com to one of them):
1.1.1.1, 1.0.0.1) — Cloudflare is the upstream resolver.Lab 4 and the Capstone assume DNS is going through ZTR. Remove the NAT Control rule so the predefined ZTR rule takes over again — you can leave the Cloudflare DNS Gateway in place; it does nothing on its own without a rule referencing it.
7a. Delete the NAT Control Rule. Navigate back to NAT Control Policy:
On the NAT Control Policy list, find your Cloudflare DNS rule (Rule Order 1) and click the Edit (pencil) icon in the Actions column:
Cloudflare DNS row.Scroll to the bottom of the Edit NAT Control Rule dialog and click Delete:
7b. Activate. Click the orange Pending Activation badge in the top-right and Activate. This commits the deletion:
Re-run nslookup netflix.com from the VM to confirm resolution still works. Then in DNS Insights, the Resolver Gateway column should be back to ZTR for new queries.
Cloudflare DNS rule will produce confusing behavior in those labs.✅ Verification
What you just built
The client never knows it; the gateway turns plaintext UDP/53 into encrypted DoH on the upstream leg. If Cloudflare is unreachable, the gateway returns an error — a fail-closed posture chosen when resolver provenance matters more than availability. Flip Failure Behavior to Forward to Zscaler Trusted Resolver for the opposite trade-off.
gambling.com loads in Firefox-with-DoH but is blocked in Chrome (plaintext DNS). Add an SSL/TLS Inspection rule with Action = Inspect, Activate, and re-test — Firefox is now blocked too.
Before running the baseline block test, confirm Firefox isn't already using DoH — if it were, the Lab 2 Gambling block would appear broken from the very first test, and you'd waste time chasing the wrong cause.
Open Firefox on the VM. Click the hamburger menu (top-right) and choose Settings:
In the Settings search box, type dns. Scroll to Enable DNS over HTTPS using: and confirm Off is selected (the radio with "Use your default DNS resolver"):
Without DoH configured yet, Firefox uses the Windows system resolver. ZCC tunnels system DNS to ZIA (Lab 1), and the Lab 2 Block Gambling rule fires. Browse www.gambling.com in Firefox — the page should fail to load:
www.gambling.com fails to load with Server Not Found. The DNS query went via system DNS through ZIA and got blocked by the Lab 2 rule.Return to the Firefox Settings tab from Step 1 (or reopen it via the hamburger menu → Settings, search dns). This time, flip the radio from Off to Max Protection. Confirm the provider is Cloudflare (Default):
Reload www.gambling.com in Firefox. The page loads:
www.gambling.com now loads. The DNS query was encrypted to Cloudflare; ZIA saw the HTTPS connection but couldn't read the DNS query inside, so the Lab 2 Block rule didn't fire.Open Chrome and try gambling.com. Chrome (on Windows by default) uses the system resolver — plaintext DNS to ZCC, then ZIA. The Lab 2 rule fires:
gambling.com blocked with DNS_PROBE_FINISHED_NXDOMAIN. The query went via plaintext DNS through ZIA, which blocked it as designed. Same domain, same DNS Control rule, different outcome — the difference is purely the DNS transport (plaintext vs. DoH).Navigate to SSL Inspection policy:
Click + Add SSL/TLS Inspection Rule. Configure the basics:
| Field | Value |
|---|---|
| Rule Order | 1 |
| Rule Name | Inspect All traffic |
| Rule Status | Enabled |
Inspect All traffic, Status Enabled.Scroll to the Action section. Set Action = Inspect. Leave the other fields at their defaults for the lab. Click Save:
Click the orange Pending Activation badge in the top-right of the Experience Center, then click Activate:
Before re-testing, clear out any cached state from the previous DoH-bypass run — otherwise Firefox or the OS may serve the old resolution and the test will look like SSL Inspection didn't work:
- Quit Firefox completely (close all windows, then File → Exit — not just the tab).
- Open Command Prompt and flush the Windows DNS cache:
Windows Command Promptipconfig /flushdns
- Relaunch Firefox and browse to
www.gambling.com.
The page now fails to load — same as the baseline at Step 2:
gambling.com blocked again. SSL Inspection let ZIA decrypt the Cloudflare DoH connection, see the DNS query inside, and apply the Lab 2 block.Filter by Requested Domain Contains gambling. With SSL Inspection on, the DoH queries are now visible to ZIA. The Insights row detail tells you exactly how each query reached the resolver:
Cloudflare DNS on DoH rows and DNS on plaintext rows; Protocol Type column reads DNS Over HTTPS vs UDP. The DoH queries resolved against Cloudflare, not ZTR — that's where Firefox's DoH provider points.✅ Verification
gambling.com blocked.gambling.com loads. Chrome (plaintext) still blocked.Cloudflare DNS, Protocol = DNS Over HTTPS.What you just built
Same encrypted DoH stream, two outcomes. Without inspection, the DNS query inside HTTPS is opaque to ZIA — DNS Control is layer-blind, the block doesn't fire, gambling.com loads. With inspection on, ZIA decrypts, sees the query, and the Lab 2 Block Gambling rule fires normally.
- Firefox on the VM has DoH enabled (Settings → Privacy & Security → DNS over HTTPS → Max Protection, provider = Cloudflare).
- After your rule is active, browsing any site in Firefox fails to resolve. The DoH path is closed.
- DNS Insights shows the DoH attempts with Action = Block, attributed to your new rule.
- Plaintext DNS (e.g.,
nslookup google.comin Command Prompt) still resolves — only DoH is blocked.
Try this without the hints first. You already have SSL Inspection on from Lab 4 — that's what gives ZIA visibility into DoH traffic in the first place.
This can be done via DNS Control policy.
Block DoH rule will catch this traffic first. Either disable it before you start Part B, or build Part B's rule at a higher Order. The two parts are alternative strategies, not stackable.- Firefox with DoH enabled resolves websites normally — no Block fires on its queries.
- In DNS Insights, the same query shows: inbound Network App = Cloudflare DNS (or similar DoH), and the resolution row has Resolver Gateway = ZTR with Server Protocol = UDP.
- That column split is your proof: the user submitted DoH, but ZIA resolved it through ZTR in plaintext.
Three preconditions: SSL Inspection on (Lab 4), no leftover Cloudflare NAT rule from Lab 3 (tear-down was Step 7), and the Block DoH rule from Part A disabled if you built it.
This can be done via DNS Control policy.
- m365-validate-portal.com
- onedrive-secure-doc.app
- outlook-mfa-reset.net
nslookup m365-validate-portal.comon the VM returns the Zscaler block IP.nslookup google.comstill resolves normally — your block is targeted.- DNS Insights filtered by the IOC domain over the last 24h surfaces every user/endpoint that hit it. Pre-activation rows are the impacted users; post-activation rows show Action = Block.
- Loading the IOC URL in Firefox with DoH enabled still hits the block (SSL Inspection from Lab 4 decrypts the DoH).
Try this without the hints first. The skills are all from Labs 1, 2, and 4 — this is a re-application, not new material.
What primitives should you reach for?
Two questions to ask yourself:
- How do you teach DNS Control to recognise three specific FQDNs as a single match-target? Lab 2's Allow exception used the same primitive, just inverted.
- Once DNS Control matches the IOCs, what Action do you set? At what Rule Order, given that the Lab 2 Block Gambling rule already sits at Order 1?
The forensic sweep is a DNS Insights filter — same pattern as Lab 1's verification, but you're looking for who hit the IOC before activation, not after. The DoH check is just re-running the Lab 4 mental model: encrypted DNS bypasses unless something decrypts it.
Menu paths
- Custom URL Category: Policies → Internet & SaaS → URL Categories → + Add URL Category.
- DNS Control rule: Policies → Access Control → Firewall → DNS Control → + Add DNS Filtering Rule. Reference your new custom category in both Request and Response Categories. Action = Block.
- Forensic sweep: Logs → DNS Insights → Logs. Filter Requested Domain Contains <IOC>. Timeframe = last 24h. Each row tells you the user, location, action, and timestamp.
- DoH verification: SSL Inspection from Lab 4 should already be live. Open the IOC URL in Firefox (DoH on) and confirm it's still blocked. If not, revisit Lab 4 to re-activate SSL Inspection.
Concrete field values
Custom URL Category
| Field | Value |
|---|---|
| Name | Phishing IOCs — M365 Campaign |
| Super Category | any (User-defined is fine) |
| Custom URLs | all three IOC FQDNs from the scenario |
DNS Control rule
| Field | Value |
|---|---|
| Rule Order | 1 |
| Rule Name | Phishing Campaign Block |
| Rule Status | Enabled |
| Request Categories | your new custom category |
| Response Categories | same |
| Action / Network Traffic | Block |
Save the rule, click the orange Pending Activation badge, and Activate. Then run the test cases. If DNS Insights doesn't update for 2–3 min, that's normal ingest lag.
Effective immediately, outbound DNS shall block (a) Gambling, (b) Adult Material, and (c) Cryptocurrency. Exception: the Research team may access coindesk.com for market analysis. The control must be auditable. Browser-level DNS encryption shall not allow circumvention.
nslookup bet365.com(Gambling) andnslookup binance.com(Crypto) both return the Zscaler block IP.nslookup coindesk.comresolves to real IPs — the exception works.nslookup google.comstill resolves normally.- DNS Insights filtered by your Compliance Block rule's name surfaces the blocked queries per category. A second filter by the exception rule's name surfaces only the allowed
coindesk.comqueries. That split is your audit-ready report. - Firefox with DoH still hits the block (SSL Inspection from Lab 4 is decrypting it).
Part C's pattern carries here (custom URL Category + Block rule), with one twist: the exception, modelled on Lab 2's 888.com Allow. Try without hints first.
What primitives should you reach for?
Three questions:
- Can one DNS Control rule block three categories at once, or do you need three rules? Check the Request Categories field carefully.
- Where does the exception live? You've built this pattern before — Lab 2 (
888.comAllow) and Part C (IOC Block) both use the same primitive, just for different actions. - Once both rules exist, what determines whether the exception wins on
coindesk.comqueries before the Compliance Block catches it?
Menu paths
- Compliance Block: DNS Control → + Add DNS Filtering Rule. One rule. Set Request + Response Categories to all three (the picker supports multi-select). Action = Block.
- Exception category: Policies → Internet & SaaS → URL Categories → + Add URL Category. Name it for Compliance to audit. Add
coindesk.com. - Exception rule: DNS Control → + Add DNS Filtering Rule. Reference your exception category. Action = Allow. Rule Order matters — remember first-match wins.
- Audit trail: Logs → DNS Insights → Logs. Filter by Rule Name. Two separate filters — one per rule — give you the auditor's split view.
Concrete field values
Compliance Block rule
| Field | Value |
|---|---|
| Rule Order | 2 (below the Part C Phishing rule, or 1 if you skipped Part C) |
| Rule Name | Compliance Block — Gambling / Adult / Crypto |
| Request Categories | Gambling + Adult Material + Cryptocurrency (multi-select) |
| Response Categories | same three |
| Action / Network Traffic | Block |
Exception category
| Field | Value |
|---|---|
| Name | Compliance Exceptions — Crypto Research |
| Custom URLs | coindesk.com |
Exception rule
| Field | Value |
|---|---|
| Rule Order | 1 (must be above the Compliance Block) |
| Rule Name | Compliance Exceptions — Allow Research |
| Request Categories | your new exception custom category |
| Action / Network Traffic | Allow |
Activate both. Test all five success criteria. If coindesk.com is still blocked, the Allow rule isn't at Order 1 — first-match wins.
What you just demonstrated
Four different motivations — a security team blocks DoH outright, an operations team translates DoH inbound and resolves it through ZTR, a SOC contains a phishing campaign, a compliance team enforces a regulatory rule — resolved by the same skill stack from Labs 1–4: DNS Control rules scoped on category and application service, custom URL Categories, deliberate rule ordering, DNS Insights for forensics and audit, SSL Inspection to make encrypted DNS visible. The DNS layer carries real enforcement weight when you use these in combination; you just shipped four production-ready postures without leaving the DNS stack.
10 real-world scenarios drawn from the deck and the labs. Answer all 10, hit Submit, and you'll see your score plus a short explanation for every question — including the ones you got right. You can retake as many times as you want.
cnn.com from a category block by adding it to the App Profile Domain Exclusion list. As the senior admin, what's the right pushback?888.com at Order 3. 888.com is still blocked. The most direct fix?netflix.com rows in DNS Insights still show Resolver Gateway = ZTR. Most likely cause?coindesk.com despite the firm-wide Cryptocurrency block. Auditable, maintainable pattern?C:\Windows\System32\drivers\etc\hosts. The CISO asks: "Why doesn't DNS Control catch that?"Common symptoms attendees hit during the live labs. Find your lab, find your symptom, follow the fix.
chatgpt.com still absent from DNS Insights after configuring Domain Inclusion = **, click Save, then run ZCC tray → More → Update Policy on the VM.www.gambling.com still resolves after activating the Block Gambling ruleipconfig /flushdns then re-test.888.com is still blocked after creating the custom Allow rule888.com (open it under Policies → Internet & SaaS → URL Categories).Cloudflare gateway doesn't appear in the NAT rule's DNS Gateway dropdownCloudflare row exists and was saved, then reopen the NAT rule dialog.ZTR after activating the Cloudflare DNS ruleRedirect Request Using DoH, OR Network Services wasn't set to DNS on the Services tab. NAT Control is first-match — the rule must sit at Order 1 with the correct action. The flip is server-side — nslookup output won't look different; check Insights.Cloudflare only for newer queries; older rows still show ZTRnslookup netflix.com.gambling.com even after enabling DoHgambling.com even after activating SSL InspectionInspect (not Do Not Inspect or Block) and that Activate fired.Phishing IOCs — M365 Campaign entry exists, then re-open the rule.nslookup returns NXDOMAIN instead of the Zscaler block IPcoindesk.com is still blocked after creating the Allow rulecoindesk.com (Policies → Internet & SaaS → URL Categories).coindesk.com even with the Allow rule at Order 1ipconfig /flushdns) before re-testing.Test commands and key configuration values for every lab. All commands run from the lab VM unless noted.
Get DNS Into Zscaler
Block + Custom Allow
bet365.com times out (still Gambling), 888.com resolves (top-order Allow). Both visible in Insights.Steer DNS via NAT Control
ZTR → Cloudflare, Server Protocol flips UDP → DNS Over HTTPS, HTTP Status Code becomes 200 - OK.DoH + SSL Inspection
- Firefox
about:preferences→ searchdns→ Max Protection / Cloudflare - Browse
gambling.comin Firefox → loads (DoH bypass) - Browse same in Chrome → blocked (plaintext DNS)
- Add SSL/TLS Inspection rule with Action = Inspect
- Hard-reload Firefox (Ctrl+Shift+R) → now blocked
- Insights: filter
gambling, check Network App =Cloudflare DNS
DNS Control in the Real World
+ Exclusions: *.corp.local, *.safemarch.com, *.qradar.com
Allow rule @ Order 1
Failure Behavior: Return Error Response
Rule action: Redirect Request Using DoH
ZTE contains the full chain — F/w → DNS Control → NAT Control → resolver. Auth DNS is the only thing truly outside.
Two minutes to make the next version better. All numbered questions are required — the comments are optional. Your feedback is recorded locally; the instructor will collect it after the session.