Summary
When an OpenZiti service intercepting Active Directory traffic (DNS on 53, Kerberos on 88, LDAP on 389/636, SMB on 445) is bound by ziti-edge-tunnel running on any domain-joined Windows host — whether that host is a Domain Controller or a regular domain member server — Entra ID–joined Windows clients on the dial side fail to obtain an on-prem Kerberos TGT via the Cloud Kerberos Trust flow.
Moving the bind to an Edge Router with tunneling enabled — without changing any service configs, intercept configs, host configs, identities, posture checks, or service policies — resolves the issue immediately. Dial clients then successfully receive a krbtgt/<DOMAIN> TGT and all downstream Kerberos-dependent operations work.
The common factor in failing configurations is domain-joined Windows host running ziti-edge-tunnel as the bind. The common factor in working configurations is Linux Edge Router as the bind.
Environment
-
OpenZiti controller: 2.0
-
Edge Routers: 2.0, hosted on Azure (Ubuntu), tunneling mode enabled — works as bind
-
ziti-edge-tunnelon Windows hosts: latest version (current beta channel) — fails as bind -
Ziti Desktop Edge for Windows (dial clients): latest beta version
-
Domain Controllers: Windows Server 2019, 2 DCs, healthy replication, AD-integrated DNS
-
Domain member servers tested as bind hosts: Windows Server 2019/2022, fully patched, no special role
-
Identity setup: Hybrid — on-prem AD synced to Entra ID via Entra Connect; Cloud Kerberos Trust configured (
AzureADKerberoscomputer object present); Windows Hello for Business enabled -
Dial client posture: Entra ID–joined, Intune-enrolled, signing in with WHFB
Services involved (representative)
-
CLIENTS_AD_Services_DNS—intercept.v1wildcard*.<domain>:53TCP/UDP,host.v1to127.0.0.1:53(on DC bind) or DC IP (on member-server / router bind) -
CLIENTS_AD_Services— Kerberos / LDAP / SMB ports to DC IPs -
Standard Bind/Dial service policies, no MFA on bind identities, no posture-check blockers
Steps to reproduce
-
Deploy two DCs (Server 2019) with AD-integrated DNS and Cloud Kerberos Trust enabled.
-
Configure the AD-service intercepts above.
-
Test A — bind on DC: install
ziti-edge-tunnelon both DCs, enroll identities, assign Bind policy. From an Entra ID–joined client withDialpolicy, sign in with WHFB and trigger an operation requiring an on-prem TGT (e.g.klist get krbtgt/<DOMAIN>, SMB access to a member server, RDP to an AD-joined host). → fails -
Test B — bind on a domain-joined member server: stop bind on the DCs, install
ziti-edge-tunnelon a Server 2019/2022 member server in the same domain, enroll identity, assign Bind policy withhost.v1pointing at the DC IP. Repeat the same client test. → fails -
Test C — bind on Edge Router (Linux, not domain-joined): stop bind on the member server, enable tunneling on an Edge Router with the same
host.v1config. Repeat the same client test. → succeeds
Steps 3 → 4 → 5 are performed in sequence on the same Ziti overlay with no other changes between them.
Expected behavior
The bind host's OS, domain membership, and Ziti component type (router vs ziti-edge-tunnel) should be transparent to the Kerberos / DNS protocol payloads traversing the fabric. The dial client should obtain a partial TGT from Entra at logon, exchange it via the routed Kerberos service for a full on-prem TGT, and proceed normally — regardless of where the AD-service terminator is hosted.
Actual behavior
-
Bind on DC (
ziti-edge-tunnel): dial client receives0x51f/STATUS_NO_LOGON_SERVERS. No on-prem TGT is issued. Kerberos operational log on the client shows a smart-card / certificate domain identification error consistent with the partial-TGT exchange failing. DNS resolution in isolated tests appears to succeed but the full Cloud Kerberos Trust flow does not complete. -
Bind on domain-joined member server (
ziti-edge-tunnel): same symptom. Member server has no AD role and no port conflicts on 88/389/445, yet the failure mode is identical. This rules out the obvious "ports already in use by Windows AD services on the DC" theory. -
Bind on Edge Router (Linux): dial client successfully obtains
krbtgt/<DOMAIN>TGT and all Kerberos-dependent operations succeed. Service / intercept / host / policy definitions are identical to the failing cases.