Skip to content

Commit f2f63f2

Browse files
committed
docs: a why-not-tailscale note in see also
1 parent 265e941 commit f2f63f2

1 file changed

Lines changed: 37 additions & 4 deletions

File tree

README.md

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -265,15 +265,48 @@ something you're working on.
265265
[SSH tunnels](https://www.ssh.com/academy/ssh/tunneling) need inbound access on at
266266
least one side. pai-sho works when neither machine has open inbound ports.
267267

268-
[WireGuard](https://www.wireguard.com/), [Tailscale](https://tailscale.com), and
269-
[NetBird](https://netbird.io/) are mesh VPNs that put every machine on a virtual
270-
network. pai-sho is narrower: you expose specific ports, not the whole machine,
271-
which keeps it easy to reason about exactly what is reachable.
268+
[WireGuard](https://www.wireguard.com/) has no control plane at all. You put
269+
peers in a config file by public key, and a peer entry needs an `Endpoint` with
270+
a routable address, so someone has to solve reachability. If both machines are
271+
behind NAT, you are standing up a bounce host.
272272

273273
[dumbpipe](https://github.com/n0-computer/dumbpipe) is the direct inspiration.
274274
[pigeons](https://pigeons.computer), SSH over iroh from the same team, is where
275275
pai-sho's connection handling comes from.
276276

277+
### Why not Tailscale?
278+
279+
You probably should use [Tailscale](https://tailscale.com). It solves this
280+
problem well, and there is a company behind it. Four things differ, and one is a
281+
point against pai-sho.
282+
283+
**No account.** Both punch through NAT with help from third-party infrastructure:
284+
Tailscale's DERP relays, and n0's relays here. What differs is what that
285+
infrastructure is allowed to do. A Tailscale node registers with
286+
`controlplane.tailscale.com`, which decides membership and hands each node a
287+
filtered list of the peers it may see. Your box phones Tailscale, and Tailscale
288+
introduces the two of you. A pai-sho box dials your laptop by public key, with
289+
discovery as a lookup and the relay as a pipe that cannot read what it carries.
290+
Nothing in that path can add a peer to your set, and there is nothing to sign up
291+
for.
292+
293+
**Specific ports, not a whole machine.** Tailscale gives a peer an IP, and
294+
everything listening on it is reachable unless an ACL says otherwise. Default
295+
allow, then narrow it. pai-sho grants one port at a time to one key, and a peer
296+
with no grants sees nothing. Day to day the two feel much the same, since you
297+
type a name and a port either way.
298+
299+
**Less to install.** Without `--tun`, pai-sho binds loopback addresses. On Linux
300+
that needs no network device and no privilege, because `127.0.0.0/8` already
301+
routes to `lo`. Tailscale needs a tun device, or its userspace mode, which gives
302+
you a proxy rather than real listeners. This one is narrow: `--tun` puts pai-sho
303+
in the same position.
304+
305+
**The ops story is worse.** Tailscale keeps one policy file for the whole
306+
tailnet, so who-can-reach-what is a thing you read in a single place. pai-sho's
307+
answer is "which command did you run on which machine," and there is no central
308+
view of it. A web UI would help. It does not exist.
309+
277310
## More
278311

279312
[docs/scenarios.md](docs/scenarios.md) works two flows end to end: a shared build

0 commit comments

Comments
 (0)