Tailscale provides device identity, key distribution, access policies, address and DNS management, and the ability to automatically find available transport paths on top of WireGuard. The most direct way to understand it is to trace "a laptop accessing a company server's HTTPS service": first determine who the other party is and whether the connection is allowed, then decide how the encrypted packets reach their destination, and finally handle application authentication and business operations.
Question to Explore
Location
Can it still be considered peer-to-peer with a coordination server?
Control Plane and Data Plane
Why does the first ping go via DERP, but later become direct?
Connection Establishment and Upgrade
Do devices on the same tailnet automatically allow each other?
Identity and Grants
Why does the business still fail even though the domain name is resolved?
Addresses, DNS, and Diagnostics
What is the difference between relays, subnet routers, and exit nodes?
Encryption Termination Boundaries
Will the network immediately disconnect if the coordination service goes offline?
Caching, Expiration, and Revocation
Control Plane and Data Plane
The coordination service associates login identities, node public keys, and network configurations, distributing the necessary information to clients. Normal forwarding of business packets does not require asking the coordination service for every packet; clients perform encryption, routing, and filtering based on the state they have obtained. Centralized coordination and peer-to-peer communication are not contradictory.
There are three types of data transmission paths: direct UDP between nodes, DERP relays, and Peer Relay within the tailnet. They can all carry WireGuard ciphertext between nodes, so the statement "user data does not pass through the coordination service" holds true. However, it cannot be further written as "user data will never pass through any central server". Connection Types
Mesh indicates that nodes can establish overlay network connections with each other according to policy; it does not require all devices to maintain all pairwise active sessions continuously upon boot. With 100 devices, there are 4,950 potential pairs; if only each client accesses two servers, the actual active relationships are determined by business needs. Public key distribution, path discovery, and business traffic are not the same kind of overhead.
Identity: Login Credentials Do Not Equal Tunnel Private Keys
When joining the network, devices generate keys locally; users log in via an identity provider or use an auth key for non-interactive registration. The control plane associates identity with devices and node public keys, then distributes information according to configuration. Node private keys remain at the endpoint and should not be sent to other peers or management servers. Tailscale Identity
Material
Purpose
Should Not Be Confused With
Machine key
Identifies the device to the control plane, protects corresponding communication
Not the user token for each business request
Node key
Participates in WireGuard authentication and encryption between nodes
Not the administrator API token
Auth key
Allows device registration, suitable for automated onboarding
Not the WireGuard session symmetric key
Tailnet Lock key
Provides additional signature trust for accepted node public keys
Not a replacement for application HTTPS certificates
Servers with tags participate in policies under their tag identity. It is not accurate to simply think that tagging a server is just adding a display note to a username. Tag granting authority itself must be managed; otherwise, if a device can be tagged with high privileges, it may change the resources it can access. Identity and Tags
End-to-end encryption still relies on "the public key obtained indeed belongs to the node that should be trusted." Tailnet Lock adds the condition that node public key acceptance must be signed by a trusted node, reducing the risk of the control plane arbitrarily inserting nodes; it does not solve problems such as compromised endpoints, excessive application permissions, or all available network paths being blocked. Tailnet Lock Whitepaper
Path Establishment: Available Paths First, Then Continuously Strive for Direct Connection
The common establishment process is to first obtain a usable relay channel via DERP, while exchanging discovery information and probing candidate addresses; once the direct connection is successful, it switches to direct UDP. If the direct connection cannot be established, capable clients can use available Peer Relay; otherwise, they continue to use DERP. Here, it is important to distinguish between "expected path priority" and "the path the first packet actually takes"; relays should not be written as the last step appearing only after all probing is completely finished. Connection Establishment Timing
NAT traversal requires satisfying both address mapping and ingress filtering conditions. STUN helps observe external mappings but does not create arbitrary open ingress for the local machine; probing from both ends can prompt the gateway to establish state allowing return traffic, but complex NAT, multi-layer gateways, and UDP restrictions may still cause direct connections to fail. Help from port mapping protocols does not mean the device has obtained a public IP unconstrained by firewalls. Basic mechanisms can be found in Ports and NAT.
DERP carries not only encrypted business packets but also DISCO discovery messages; therefore, "accessing DERP" itself does not prove that all current business traffic goes through the relay. Clients save the DERP map and select the appropriate relay region; regional distance and link conditions affect actual performance. DERP Servers
Peer Relay is a device configured as a relay within the tailnet. It requires a compatible client version, reachable relay UDP ports, and corresponding usage permissions. A single ordinary node located on the public network will not automatically cause all peers to treat it as a relay. Peer Relays
How to Estimate Relay Latency
Assume the direct one-way propagation from A to B is 20 ms. When going via R, A→R is 15 ms and R→B is 35 ms. Assuming symmetric return and ignoring queuing: the direct RTT is 40 ms, and the relay RTT is 100 ms. This is a teaching budget for given paths, not a fixed performance metric for DERP or Peer Relay. Real throughput is also affected by packet loss, congestion, CPU, bandwidth, and outer transport layers.
nodes=100assertnodes*(nodes-1)//2==4950paths_ms={'direct':[20],'relay':[15,35]}rtt_ms={name:2*sum(hops)forname,hopsinpaths_ms.items()}assertrtt_ms=={'direct':40,'relay':100}# Three serial request round-trips; does not include handshake, computation, queuing, or transferring large objects.
assert3*(rtt_ms['relay']-rtt_ms['direct'])==180print('Potential connection count and given path delay budget passed')
Authorization: Understand Network Connectivity and Business Permissions Separately
Current Tailscale documentation describes network-layer and application-layer capabilities using grants, while ACLs are still supported. Network-layer authorization can express "the engineering group can connect to TCP 443 on devices with the web tag"; it does not automatically make that user an administrator of the Web application. Grants, ACL
The following is an independent minimal policy example; usernames must be replaced with actual tailnet members; assume the destination device has legally obtained tag:web. When appending to an existing policy, other broad allow rules will still take effect; this single rule should not be understood as overriding or revoking existing permissions.
This example allows the matching subject to initiate specified connections; return traffic is handled according to already allowed connections. It does not authorize the server to arbitrarily create new connections to the client, nor does it grant TCP 22. tagOwners manages who can assign tags, not who is allowed to connect to these devices. Grants Syntax
Check
Example Result
Next Layer May Still Fail
Alice's regular user device accesses web:443
Matches the above network authorization
Host firewall, service listening, TLS
Same device accesses web:22
No allow rule in this example
Not because TCP handshake is slow
Alice uses web:443 to call the delete bill interface
Network may be reachable
Application should still authorize based on tenant and action
Device receives DNS response
Only name resolution is completed
Does not prove port permission or service health
Application-layer app capabilities require corresponding application integration recognition; any traditional web service will not automatically implement that business permission just because a capability name appears in the policy file.
Addresses, MagicDNS, and Routing Are Three Different Things
A device's Tailscale address is an address within the overlay network, not its current public IP address on the Wi-Fi exit. When changing networks, the outer endpoint can change; the application continues to use the same node name or overlay address, reducing dependency on the underlying location, but it is still subject to node registration and address lifecycle constraints.
MagicDNS generates names for tailnet devices, allowing users to access them using device names. Name resolution answers "what is the target address," routing answers "which interface or gateway to hand it to," and access policies answer "whether it is allowed." After adding traditional subnets to the tailnet, their existing internal domain names are not necessarily automatically registered by MagicDNS; usually, internal DNS and split DNS configuration are also required. MagicDNS, Subnet Routers
Subnet Routers, Exit Nodes, and Relays: See Who Terminates WireGuard
Role
Main Purpose
Where WireGuard Protection Extends To
Ordinary Node
Accessing peers with the client installed
Peer Node
DERP / Peer Relay
Forwards ciphertext between two nodes
Still to the final Tailscale peer
Subnet Router
Accessing subnet resources without client installation
Subnet Router
Exit Node
Accessing the internet via a selected exit
Exit Node
When accessing traditional servers, the subnet router resolves the inner IP packet and then sends it into the target network. If the application uses HTTPS, application-layer TLS can continue to protect the connection to the server; if sending plain HTTP, the latter half will not be automatically encrypted just because the first half had WireGuard.
Linux kernel routing and userspace netstack routing describe how to forward after decryption. The former forwards inner packets by the kernel; the latter handles connections in userspace. One cannot infer that Tailscale necessarily hands WireGuard encryption/decryption to wireguard.ko just because it is in "kernel mode". Kernel vs. netstack
Subnet accessibility usually requires satisfying routing publication and approval, client adoption of corresponding routes, policy allowance, and forwarding/return path establishment. Default SNAT makes the traditional server see the router's address, simplifying the return path; after disabling SNAT, the target network must know how to return to the original source. Preserving source IP and having no-config return routes are not two effects that can be obtained for free simultaneously. Subnet SNAT
Coordination Service Offline: Different Fates for Existing Communications and Management Changes
Clients cache keys and filtering rules, so communication between existing nodes may continue when the control plane is unreachable. It is not permanently autonomous: key expiration, endpoint changes, insufficient cache, or all relays being unreachable may affect connections; new device onboarding, key refreshing, new policy propagation, and revocation cannot be completed through normal processes. Coordination Server Down
This also explains an easily overlooked phenomenon: when the control plane is interrupted, old business continuing to run is an availability advantage, but when administrators want to tighten access immediately, old policies still being executed becomes a change propagation problem. Failure handling must observe both connectivity and the freshness of policies.
When the Control Plane Disconnects, Which Operation Fails First?
Maintaining valid cache and direct connection, only disconnecting the coordination service, the blue business path still exists; but control refresh is already unavailable. Continue to remove the direct connection to observe if the relay can still carry traffic; only when valid state or all paths are lost does it touch the data plane premise here.
Preparing the visual
When the Control Plane Disconnects, Which Operation Fails First?
Data packets use the state already on the local machine, not asking the control plane for every packet. Old communications continuing does not mean new registration, revocation propagation, or key refresh can also be completed.
{"id":"tailscale-control-data-failure","title":"When the Control Plane Disconnects, Which Operation Fails First?","summary":"Data packets use the state already on the local machine, not asking the control plane for every packet. Old communications continuing does not mean new registration, revocation propagation, or key refresh can also be completed.","height":1000,"html":"<h2 data-i18n=\"heading\"></h2><p class=\"intro\" data-i18n=\"intro\"></p><label class=\"check\"><input type=\"checkbox\" id=\"control\" checked><span data-i18n=\"control\"></span></label><label class=\"check\"><input type=\"checkbox\" id=\"direct\" checked><span data-i18n=\"direct\"></span></label><label class=\"check\"><input type=\"checkbox\" id=\"relay\" checked><span data-i18n=\"relay\"></span></label><label class=\"check\"><input type=\"checkbox\" id=\"cache\" checked><span data-i18n=\"cache\"></span></label><svg id=\"paths\" class=\"diagram\" viewBox=\"0 0 360 180\" role=\"img\" data-i18n-label=\"heading\"></svg><div class=\"metrics\"><div><span data-i18n=\"data\"></span><strong id=\"data\"></strong></div><div><span data-i18n=\"refresh\"></span><strong id=\"refresh\"></strong></div></div><details class=\"scope\"><summary data-i18n=\"scopeLabel\"></summary><p data-i18n=\"scope\"></p></details>","css":".intro{margin:8px 0 18px;color:var(--muted);font-size:14px}.caption,.hint{font-size:12px;color:var(--muted);margin-top:12px}.control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 12px;align-items:center;margin:14px 0;font-size:13px}.control label{font-size:13px}.control output{color:var(--accent);min-width:5em;text-align:right;font-variant-numeric:tabular-nums}.control input{grid-column:1/-1;width:100%;margin:0}.presets{display:flex;gap:4px;align-items:stretch}.presets button{flex:1 1 0;min-width:0;overflow-wrap:anywhere;font-size:13px}.actions{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}.actions button{flex:1;min-width:0;font-size:13px;min-height:42px}.copy{display:grid;font-size:14px;margin:16px 0}.copy>*{grid-area:1/1;margin:0}.reserve{visibility:hidden}.scope{margin-top:14px;color:var(--muted);font-size:12px}.scope summary{padding:8px 0;cursor:pointer}.scope p{margin-top:10px}.two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.card{border:1px solid var(--rule);border-radius:9px;padding:14px;min-width:0}.card header{font-size:14px;font-weight:600;margin-bottom:10px}.card button{font-size:12px;width:100%;min-width:0}.card small{display:block;font-size:12px;color:var(--muted)}.card code{font-size:12px;overflow-wrap:anywhere}.metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.metrics>div{border-left:2px solid var(--accent);padding-left:10px;min-width:0}.metrics span{display:block;min-height:3.2em;color:var(--muted);font-size:12px}.metrics strong{font-size:23px;display:block;font-weight:500;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.formula{border-top:1px solid var(--rule);padding-top:12px;margin-top:14px;font-size:13px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.value{font:500 20px var(--viz-font-ui)}.legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12px;color:var(--muted);margin:12px 0}.legend span:before{content:'';display:inline-block;width:8px;height:8px;border-radius:2px;background:var(--accent);margin-right:6px}.legend .second:before{background:var(--second)}.check{display:flex;align-items:center;gap:8px;font-size:13px;margin:12px 0}.check input{width:16px;height:16px;flex-shrink:0;accent-color:var(--accent)}select,input[type=text],input[type=number]{background:var(--paper);color:var(--ink);font:inherit;font-size:13px;padding:10px;border:1px solid var(--rule);border-radius:7px;max-width:100%;min-width:0}select{width:100%;min-height:42px}.band{height:20px;display:flex;background:var(--surface);border-radius:4px;overflow:hidden}.band i{height:100%;display:block;background:var(--accent);transition:width .25s}.band i.second{background:var(--second)}button:disabled{cursor:default}.status{font-size:13px;min-height:4.8em}.mono{font-family:var(--viz-font-mono);font-variant-numeric:tabular-nums}.muted{color:var(--muted)}\n@media(max-width:480px){.two{gap:8px}.card{padding:12px 9px}.actions button,.presets button{font-size:12px}.metrics strong{font-size:20px}.metrics{gap:8px}}\n@media(prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation:none!important}}\n.track-row{margin:16px 0}.track-row>span{display:block;font-size:12px;color:var(--muted);margin-bottom:7px}.track{display:flex;gap:5px;min-width:0}.cell{flex:1;min-width:0;min-height:48px;border:1px solid var(--rule);border-radius:5px;background:var(--surface);display:flex;align-items:center;justify-content:center;text-align:center;padding:5px 3px;font-size:12px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.cell.on{background:var(--accent-soft);border-color:var(--accent)}.cell.gold{background:var(--second-soft);border-color:var(--second)}.cell.empty{border-style:dashed;color:var(--muted)}.cell.error{border-color:var(--second);text-decoration:line-through}.choices{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:14px 0}.choices button{min-width:0;padding:10px 4px;font-size:12px;overflow-wrap:anywhere}.choices button[aria-current=true]{border-color:var(--accent);background:var(--accent-soft)}.relation{display:grid;grid-template-columns:minmax(0,1fr) 28px minmax(0,1fr);align-items:center;gap:6px;margin:12px 0}.relation .cell{min-height:72px}.relation>i{text-align:center;font-style:normal;color:var(--accent)}.readout{font-size:13px;white-space:pre-line;min-height:6.4em;overflow-wrap:anywhere}.plot{position:relative;border-left:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:8px 0;margin:18px 0}.plot-row{height:28px;position:relative;margin:4px 0;background:var(--surface)}.plot-row i{position:absolute;inset-block:5px;background:var(--accent);min-width:2px;transition:width .2s,left .2s}.plot-row b{position:relative;padding:4px 6px;font:11px/28px var(--viz-font-ui);background:var(--paper);border-radius:3px}.axis{display:flex;justify-content:space-between;font-size:11px;color:var(--muted)}\n\n/* Action labels must remain readable across locales and narrow embeds. */\n.actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\n.actions button{overflow-wrap:anywhere;white-space:normal;min-height:58px;padding:8px}\nbutton{overflow-wrap:anywhere}\n@media(min-width:640px){.actions{grid-template-columns:repeat(3,minmax(0,1fr))}}\n\n.metrics span{overflow-wrap:anywhere}\n.panel{border:1px solid var(--rule);border-radius:9px;padding:12px;margin:14px 0;min-width:0}.panel h3{font-size:13px;margin:0 0 10px;color:var(--muted)}.source{font:13px/1.8 var(--viz-font-mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:12px 0}.source mark{background:var(--accent-soft);color:var(--ink);border-bottom:2px solid var(--accent)}.source .fault{background:var(--second-soft);border-color:var(--second)}.diagram{display:block;width:100%;height:auto;max-height:320px;margin:14px 0;overflow:visible}.diagram text{fill:var(--ink);font:12px var(--viz-font-ui)}.diagram .edge{stroke:var(--muted);stroke-width:1.5;fill:none}.diagram .edge.on{stroke:var(--accent);stroke-width:3}.diagram .node{fill:var(--surface);stroke:var(--rule);stroke-width:1.5}.diagram .node.on{fill:var(--accent-soft);stroke:var(--accent)}.diagram .node.gold{fill:var(--second-soft);stroke:var(--second)}.log{font:12px/1.8 var(--viz-font-mono);white-space:pre-line;overflow-wrap:anywhere;min-height:7.2em}.table{display:grid;gap:5px;margin:14px 0}.table .tr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.table .tr>*{padding:8px 5px;background:var(--surface);border-radius:4px;min-width:0;overflow-wrap:anywhere;font-size:12px}.table .tr .on{background:var(--accent-soft)}.table .tr .gold{background:var(--second-soft)}.choices button{min-height:44px}.metrics strong{min-height:1.6em}.code-line{display:block}.code-line.on{background:var(--accent-soft);border-left:2px solid var(--accent);padding-left:6px}.status-badge{font-size:12px;color:var(--accent)}.tile-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.tile-grid .cell{min-height:40px}.actions button{min-height:48px}.form-field{display:grid;gap:8px;margin:14px 0;font-size:13px}.form-field input{width:100%;font-family:var(--viz-font-ui)}.metrics.three{grid-template-columns:repeat(3,minmax(0,1fr))}.formula{min-height:3.2em}.presets{flex-wrap:wrap}.presets button{flex-basis:25%;min-height:44px}\n\n.budget{display:flex;height:28px;margin:16px 0;background:var(--surface);border-radius:5px;overflow:hidden}.budget i{display:block;background:var(--accent);transition:width .2s}.budget i.gold{background:var(--second)}.intervals{margin:16px 0}.interval{position:relative;height:36px;background:var(--surface);margin:6px 0;border-radius:4px;overflow:hidden}.interval i{position:absolute;height:100%;background:var(--accent-soft);border-left:2px solid var(--accent)}.interval i.gold{background:var(--second-soft);border-color:var(--second)}.interval span{position:relative;z-index:1;font:12px/36px var(--viz-font-ui);padding-left:7px}.table .tr>*{min-height:4.8em}.formula{white-space:pre-line;min-height:7.2em}.actions:has(>button:only-child){grid-template-columns:1fr}.metrics strong{min-height:3.2em}.rangegrid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:3px;margin:14px 0}.rangegrid .cell{min-height:30px;padding:3px 1px;font-size:10px}.message{min-height:7.2em;white-space:pre-line;font:13px/1.8 var(--viz-font-ui);overflow-wrap:anywhere}\n/* Allow CJK hanging punctuation without overflowing a metric's border box. */\n.metrics>div{padding-right:4px}.metrics span{line-break:anywhere}\n\n.metrics strong{font-size:17px}","js":"const $=s=>document.querySelector(s);const set=(id,v)=>$('#'+id).textContent=v;const t=k=>viz.t(k);function cells(id,values){$('#'+id).replaceChildren(...values.map(v=>{const e=document.createElement('div');e.className='cell '+(v.cls||'');e.textContent=v.text;e.title=v.title||v.text;return e;}));}function pressed(mode){document.querySelectorAll('[data-mode]').forEach(e=>e.setAttribute('aria-pressed',String(e.dataset.mode===mode)));}const esc=s=>String(s).replace(/[&<>\"']/g,c=>({'&':'&','<':'<','>':'>','\"':'"',\"'\":'''}[c]));const fmt=s=>'{'+[...s].sort().join(', ')+'}';function graph(id,nodes,edges){const el=$('#'+id);el.setAttribute('viewBox','0 0 360 200');el.innerHTML='<defs><marker id=\"arrow-'+id+'\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--muted)\"/></marker></defs>'+edges.map(e=>{const a=nodes[e[0]],b=nodes[e[1]],dx=b.x-a.x,dy=b.y-a.y,d=Math.hypot(dx,dy)||1;if(edges.some(r=>r[0]===e[1]&&r[1]===e[0])){const nx=-dy/d,ny=dx/d;return '<path class=\"edge '+(e[2]?'on':'')+'\" d=\"M '+(a.x+dx/d*22+nx*12)+' '+(a.y+dy/d*22+ny*12)+' Q '+((a.x+b.x)/2+nx*38)+' '+((a.y+b.y)/2+ny*38)+' '+(b.x-dx/d*25+nx*12)+' '+(b.y-dy/d*25+ny*12)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}return '<line class=\"edge '+(e[2]?'on':'')+'\" x1=\"'+(a.x+dx/d*25)+'\" y1=\"'+(a.y+dy/d*25)+'\" x2=\"'+(b.x-dx/d*28)+'\" y2=\"'+(b.y-dy/d*28)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}).join('')+nodes.map(n=>'<g><circle class=\"node '+(n.cls||'')+'\" cx=\"'+n.x+'\" cy=\"'+n.y+'\" r=\"25\"/><text x=\"'+n.x+'\" y=\"'+(n.y+4)+'\" text-anchor=\"middle\">'+esc(n.name)+'</text>'+(n.sub?'<text x=\"'+n.x+'\" y=\"'+(n.y+43)+'\" text-anchor=\"middle\">'+esc(n.sub)+'</text>':'')+'</g>').join('');}function table(id,rows){$('#'+id).classList.add('table');$('#'+id).replaceChildren(...rows.map(r=>{const row=document.createElement('div');row.className='tr';r.forEach(x=>{const c=document.createElement('div');if(typeof x==='object'){c.textContent=x.text;c.className=x.cls||'';}else c.textContent=x;row.append(c)});return row;}));}function band(id,parts,total){$('#'+id).replaceChildren(...parts.map((p,i)=>{const e=document.createElement('i');e.style.width=(100*p.value/total)+'%';e.className=i%2?'gold':'on';e.title=p.name+': '+p.value;return e}));}function intervals(id,items,total){$('#'+id).replaceChildren(...items.map(p=>{const row=document.createElement('div');row.className='interval';const bar=document.createElement('i');bar.style.left=(100*p.start/total)+'%';bar.style.width=(100*(p.end-p.start)/total)+'%';bar.className=p.cls||'';const label=document.createElement('span');label.textContent=p.label;row.append(bar,label);return row;}));}function draw(){const c=$('#control').checked,d=$('#direct').checked,r=$('#relay').checked,v=$('#cache').checked,path=!v?'BLOCKED':d?'DIRECT':r?'RELAY':'NO PATH';graph('paths',[{name:'A',x:45,y:45},{name:'B',x:315,y:45},{name:'R',x:180,y:135}],[[0,1,v&&d],[0,2,v&&!d&&r],[2,1,v&&!d&&r]]);set('data',path);set('refresh',c?'AVAILABLE':'UNAVAILABLE');$('#data').dataset.path=path;}document.querySelectorAll('input').forEach(e=>e.onchange=draw);draw();","audio":false,"strings":{"cache":"Existing Identity and Policy Cache Still Valid","control":"Coordination Service Available","data":"Existing Business Transmission","direct":"Direct Path Available","heading":"When the Control Plane Disconnects, Which Operation Fails First?","intro":"Sever the coordination service, direct connection, relay, and valid cache respectively, and observe existing data paths and configuration refresh.","refresh":"Normal Control Plane Refresh","relay":"Relay Path Available","reset":"Reset","scope":"Two authorized and established nodes, with valid state represented by a switch. Relay represents available DERP/Peer Relay, not simulating probing timing, specific product fallback, or expiration policies.","scopeLabel":"Model Scope and Conventions"}}
Locate Based on Evidence, Not Just Seeing "relay" and Changing Configuration
The following commands are for manual diagnostics; ping and netcheck will initiate network probes.
The direct, relay, and peer-relay descriptions in status describe the currently observed paths, which can change over time. The default tailscale ping is used for Tailscale layer discovery/connectivity checks, and is not the same test as ordinary ICMP or accessing business TCP ports; one success does not prove HTTPS certificate validity or API authorization correctness. Ping Types
To troubleshoot a failed access, you can sequentially record: the address resolved by name, client routing and node status, actual transmission path, target port reachability, and TLS/application errors. If only large responses fail, continue to check MTU and packet loss; if relay works but direct does not, observe UDP reachability and NAT conditions; if an HTTP 403 is received, return to application authentication and authorization evidence, rather than repeatedly adjusting penetration ports.