No description
Find a file
Jonathan Nobels d8c7cafeda
feature/exitnodehealth: warn when selected exit nodes are unavailable (#21017)
updates tailscale/corp#33007

When a selected exit node can't carry internet traffic due to a misconfiguration (wrong ID, node
deleted, routes removed, etc), blackhole default routes are installed and all internet traffic is dropped.
That is the correct behavior -- better to drop than leak to the local network -- but it was entirely silent:
the stable-ID lookup in nodeBackend.updateRouteManagerPrefs misses without a log line, and Status
leaves ExitNodeStatus nil. The user sees a healthy Tailscale with no internet. If an admin fat-fingers the
exit node name in an IT policy, for example, it's easy to break every node with zero feedback.

This adds an exit-node-unavailable health warning covering every way the selection can fail to carry
traffic (short of reachability which is a separate concern), reported via exitnodehealth.ArgExitNodeReason.

The warning names the exit node, caching its display name while it is still a peer so the name survives
its departure, and falls back to the stable ID or IP. When the selection is mandated by the ExitNodeID
or ExitNodeIP policy settings, the message tells the user to contact their network administrator instead
of suggesting they pick another exit node.

To test this, set a forced exit node policy with some random ip or node id. The warning has a 5 second
 threshold. It should clear as soon as you change to a proper exit node.

Signed-off-by: Jonathan Nobels <jonathan@tailscale.com>
2026-10-01 08:57:20 -04:00
.bencher
.github
appc
atomicfile
chirp
client
clientupdate
cmd feature/exitnodehealth: warn when selected exit nodes are unavailable (#21017) 2026-10-01 08:57:20 -04:00
control
derp
disco
docs
doctor
drive
envknob
feature feature/exitnodehealth: warn when selected exit nodes are unavailable (#21017) 2026-10-01 08:57:20 -04:00
fuzz
gokrazy
health
hostinfo
internal
ipn feature/exitnodehealth: warn when selected exit nodes are unavailable (#21017) 2026-10-01 08:57:20 -04:00
jsondb
k8s-operator cmd/k8s-operator,k8s-operator/reconciler/staticendpoints: support static endpoints for Connector resources (#21172) 2026-10-01 12:07:16 +01:00
kube
licenses
log
logpolicy
logtail
metrics
misc
net
omit
packages/deb
paths
portlist
posture
prober
proxymap
release
safesocket
safeweb
scripts
sessionrecording
ssh/tailssh
syncs
tailcfg
tempfork
tka
tool
tsconsensus
tsconst feature/exitnodehealth: warn when selected exit nodes are unavailable (#21017) 2026-10-01 08:57:20 -04:00
tsd
tsnet feature/exitnodehealth: warn when selected exit nodes are unavailable (#21017) 2026-10-01 08:57:20 -04:00
tstest
tstime
tsweb
types
util util/cmpver: don't panic on numbers that overflow a uint64 2026-09-30 21:41:37 -07:00
version
wf
wgengine
wif
words
.gitattributes
.gitignore
.golangci.yml
.policy-tests.yml
.policy.yml
.stignore
ALPINE.txt
api.md
assert_ts_toolchain_match.go
build_dist.sh
build_docker.sh
cache_key_test.go
CODE_OF_CONDUCT.md
CODEOWNERS
Dockerfile
Dockerfile.base
flake.lock
flake.nix
flakehashes.json
go.mod
go.sum
go.toolchain.branch
go.toolchain.next.branch
go.toolchain.next.rev
go.toolchain.rev
go.toolchain.version
gomod_test.go
header.txt
LICENSE
license_test.go
Makefile
PATENTS
pkgdoc_test.go
pull-toolchain.sh
README.md
SECURITY.md
shell.nix
staticcheck.conf
version-embed.go
VERSION.txt
version_tailscale_test.go
version_test.go

Tailscale

https://tailscale.com

Private WireGuard® networks made easy

Overview

This repository contains the majority of Tailscale's open source code. Notably, it includes the tailscaled daemon and the tailscale CLI tool. The tailscaled daemon runs on Linux, Windows, macOS, and to varying degrees on FreeBSD and OpenBSD. The Tailscale iOS and Android apps use this repo's code, but this repo doesn't contain the mobile GUI code.

Other Tailscale repos of note:

For background on which parts of Tailscale are open source and why, see https://tailscale.com/opensource/.

Using

We serve packages for a variety of distros and platforms at https://pkgs.tailscale.com.

Other clients

The macOS, iOS, and Windows clients use the code in this repository but additionally include small GUI wrappers. The GUI wrappers on non-open source platforms are themselves not open source.

Building

We always require the latest Go release, currently Go 1.27. (While we build releases with our Go fork, its use is not required.)

go install tailscale.com/cmd/tailscale{,d}

If you're packaging Tailscale for distribution, use build_dist.sh instead, to burn commit IDs and version info into the binaries:

./build_dist.sh tailscale.com/cmd/tailscale
./build_dist.sh tailscale.com/cmd/tailscaled

If your distro has conventions that preclude the use of build_dist.sh, please do the equivalent of what it does in your distro's way, so that bug reports contain useful version information.

Bugs

Please file any issues about this code or the hosted service on the issue tracker.

Contributing

PRs welcome! But please file bugs. Commit messages should reference bugs.

We require Developer Certificate of Origin Signed-off-by lines in commits.

See commit-messages.md (or skim git log) for our commit message style.

About Us

Tailscale is primarily developed by the people at https://github.com/orgs/tailscale/people. For other contributors, see:

WireGuard is a registered trademark of Jason A. Donenfeld.