Lesson 5.4 · Choosing
You now have three ways to reach your homelab: hand-rolled WireGuard, Tailscale, and Cloudflare Tunnel (+ Access). The skill that matters most isn’t operating any one of them — it’s choosing the right one for a given need and being able to justify the choice. That’s what senior engineers do all day: not “which tool is best” (a beginner’s question) but “which tool fits this requirement, and what am I trading away.” This short lesson turns your three tools into a decision framework, and teaches you to record decisions the way professionals do — with an ADR.
There is no “best” — only “best for this”
Section titled “There is no “best” — only “best for this””Each tool is excellent at what it’s for and wrong for the others. The decision hinges on two questions: who needs access? and what are you willing to trust?
graph TD
Start{Who needs to reach it?} --> Me{Just me & people<br/>I explicitly invite?}
Me -->|yes| Priv{Want zero third-party<br/>in the data path?}
Priv -->|yes, and I'll self-host| WG[Raw WireGuard<br/>or Headscale]
Priv -->|convenience is fine| TS[Tailscale]
Me -->|no, the public| Pub{Everyone, or only<br/>specific people?}
Pub -->|everyone| CF[Cloudflare Tunnel]
Pub -->|only specific people| CFA[Cloudflare Tunnel + Access<br/>or Tailscale sharing]
Stated as a table — the reasoning you’ll put in your deliverable:
| Need | Best fit | Why |
|---|---|---|
| Reach my server/LAN from anywhere, just me | Tailscale | Zero config, NAT traversal, end-to-end; no ports |
| Same, but no third-party control plane at all | Raw WireGuard or Headscale | Full self-hosting; you accept the manual/ops cost |
| Publish a blog/portfolio to the whole world | Cloudflare Tunnel | Public reach, no open ports, IP hidden, DDoS/WAF |
| A service reachable anywhere but only by named people | CF Tunnel + Access, or Tailscale share | Identity-gated; zero-trust |
| Appear to browse “from home” on café WiFi | Tailscale exit node / WG full-tunnel | Routes all traffic through home |
Most real homelabs use more than one: Tailscale for private admin access to everything, and Cloudflare Tunnel for the one or two things published to the public. That’s not indecision — it’s using each tool for its strength.
The trade-off axes to reason about
Section titled “The trade-off axes to reason about”When you justify a choice, these are the dimensions that actually matter — the vocabulary of the decision:
- Who’s in the data path? WireGuard/Tailscale keep traffic end-to-end between your devices; Cloudflare sees plaintext at its edge (Lesson 5.3). Sensitive data argues for the former.
- Inbound exposure. All three beat port forwarding, but confirm it: the payoff is zero open ports, which you’ll prove by scanning your own IP.
- Self-hosting vs. convenience. Raw WireGuard and Headscale are fully yours but more work; Tailscale and Cloudflare are managed and easier but depend on a third party. This curriculum values understanding both.
- Public vs. private. Is the audience “the world,” “some named people,” or “only me”?
- Operational cost. Who maintains it, what breaks it, what happens when a token leaks (a question you’ll threat-model in Module 9).
Recording the decision: the ADR
Section titled “Recording the decision: the ADR”Here’s a professional habit worth starting now. When you make an architectural choice, you write an Architecture Decision Record (ADR) — a short document capturing what you decided, why, what you considered, and what you’re trading away. ADRs are widely used in industry because six months later nobody remembers why a decision was made, and “we chose X because Y, having rejected Z for reason W” is enormously valuable to future-you and to teammates.
An ADR is short and has a standard shape (Lesson 0.5 writing skills applied):
# ADR-001: Remote access for the homelab
## StatusAccepted — 2026-07-20
## ContextI need to (a) administer my homelab from anywhere, and (b) publish mydocumentation site publicly. My devices sit behind home NAT; openinginbound ports is unacceptable.
## Decision- Tailscale for private admin access to all devices (SSH, dashboards).- Cloudflare Tunnel + Access for the public site and one gated service.- No port forwarding anywhere.
## Alternatives considered- Raw WireGuard: rejected for daily use (manual key mgmt, NAT hassle); kept as the thing I understand underneath Tailscale.- Port forwarding: rejected — inbound exposure to the whole internet.- Headscale: deferred — will revisit to remove the Tailscale dependency.
## Consequences- Cloudflare can see plaintext for the public site (acceptable: nothing secret there).- I depend on two third-party control planes; documented as a risk.- Zero inbound ports — verified by external nmap (see deliverable).Writing this for your homelab is Lab 5 and the module deliverable. It’s also, not coincidentally, exactly the kind of document that makes an interview go well: “walk me through how you’d give secure remote access to internal services” has a crisp, real answer you’ve actually implemented and can point at.
Quick self-check
Section titled “Quick self-check”- Why is “which VPN tool is best?” the wrong question? What’s the right one?
- For each: private admin access / public blog / a service only three named people may reach — which tool, and why?
- Which tools keep traffic end-to-end, and which one sees your plaintext at its edge?
- What is an ADR, and what four things does it capture?
- Why do many real homelabs run more than one of these tools at once?
- Why is this skill especially relevant to the current job market?
Next: The Labs → — where you build all three, break one on purpose, and prove zero open ports.