A member can offer itself as an exit node per network (off by default); it is announced over the control channel (ctrl/4) once its iptables masquerade and forward rules are in place, with a warning when kernel forwarding is off. A device picks one member as its exit node via policy routing, with the agent's own uid exempt from the tunnel; if the exit node disappears the rules stay and traffic is dropped, loudly reported. CLI: `network exit-node`, `exit-node`; tray: tile checkbox, warnings and a per-device icon with confirmation. Linux only. Co-Authored-By: Claude <noreply@anthropic.com>
3.2 KiB
Exit nodes
A member can offer itself as an exit node in a network. Other members can then send all their internet traffic through it, the way a commercial VPN or Tailscale's exit nodes work. Linux only for now.
Using it
The offering side, per network, off by default:
tsunagi network exit-node <network> on # or off
Rules are installed even when the kernel does not forward yet, and status
says so. Turning forwarding on is left to you, on purpose:
sudo sysctl -w net.ipv4.ip_forward=1
The using side:
tsunagi exit-node # who offers one
tsunagi exit-node <name|id> # send everything through it
tsunagi exit-node off
The tray does the same: a checkbox on the network tile to offer, and an icon on each device in the devices window that offers one, with a confirmation.
One device has one default route, so it uses one exit node at a time; choosing another replaces the first. Offering is per network, so a device can be an exit node in one network and not in another.
How it works
- An offering agent says so in its control-plane
Announce(exit_node), and only once its rules are in place. Members see which peers offer one. - Server:
iptablesmasquerades the overlay range of that network out of any other interface and allows forwarding for it. Rules carry the tagtsunagi-exit:<interface>:<range>and are removed when the offer ends, the network stops, and when the agent exits. Only networks that offer have rules, so the others' traffic is not forwarded. - Client: policy routing, with no change to the main table. Table
28787holdsdefault dev <interface>, and three rules sit after Tailscale's:5280 uidrange <agent uid> lookup main(the agent's own connections never go through the tunnel, which would be a loop),5290 lookup main suppress_prefixlength 0(LAN and other specific routes keep working) and5300 lookup 28787. - Packets for addresses outside every overlay range are sent to the exit node by the router; the exit node's replies are accepted from any source. A member that is not your exit node cannot do that.
What it does not do
- The agent must run as a system service (its own user). The uid exemption would otherwise cover everything you run. A per-user agent refuses to use an exit node and says why.
- If the exit node disappears the rules stay and traffic is dropped until
it returns or you run
tsunagi exit-node off. This is deliberate: falling back to the direct path would leak traffic nobody agreed to send in the clear. The agent logs it once,statusand the tray say so loudly. - IPv6 and DNS are untouched. IPv6 traffic still leaves the ordinary way.
- Kernel forwarding is only read, never changed.
Trust
Anyone who knows the network's secret can pick your exit node if you offer one, and you carry what they send: it leaves from your address and is yours to answer for. The exit node sees every destination and, for plain traffic, its contents. Choosing an exit node means trusting its owner completely. Offer one only in networks whose members you trust, and only from a machine you are willing to have that traffic come from.