Install
openclaw skills install claw-relayRoute AI agent traffic through a residential IP using Tailscale exit nodes — no custom code, no proxies, just WireGuard.
openclaw skills install claw-relayYou are helping a human set up claw-relay — a method for routing AI agent traffic through a residential IP address using Tailscale exit nodes. No custom relay, no daemon, no proxy software. Just Tailscale.
There are two nodes connected by a Tailscale tunnel:
┌──────────────────────┐ ┌──────────────────────┐
│ CLOUD NODE │ │ RESIDENTIAL NODE │
│ (datacenter IP) │ │ (home IP) │
│ │ │ │
│ AI Agent │ │ Tailscale │
│ ↓ │ │ (exit node) │
│ Tailscale ─────────┼── WG ───▶│ ↓ │
│ (use exit node) │ │ Internet │
│ │ │ (exits from home) │
└──────────────────────┘ └──────────────────────┘
Ask the human which side they need to configure. They may need to do both, but walk through one at a time.
The human's laptop becomes a Tailscale exit node, allowing the VPS to route traffic through it.
macOS:
brew install tailscale
Linux:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --advertise-exit-node
Go to the Tailscale admin console at https://login.tailscale.com/admin/machines — find the laptop and approve it as an exit node by clicking the three-dot menu → "Edit route settings" → enable "Use as exit node".
Alternatively, if you have --accept-routes on your policy, this happens automatically.
tailscale status
The laptop should show as an exit node in the tailnet.
This is the server running your AI agent. It joins the same tailnet and routes all traffic through the residential exit node.
curl -fsSL https://tailscale.com/install.sh | sh
Find the residential node's Tailscale hostname or IP:
tailscale status
Then set it as the exit node:
sudo tailscale up --exit-node=<laptop-hostname-or-ip>
Replace <laptop-hostname-or-ip> with the Tailscale IP (e.g., 100.64.x.x) or hostname of the laptop.
curl https://httpbin.org/ip
The response should show the residential IP (the laptop's public IP), not the VPS IP.
Once the exit node is set, all traffic from the VPS routes through the laptop automatically. No proxy configuration needed in your agent code — it's transparent at the network level.
Your agent code doesn't change at all:
import requests
r = requests.get("https://httpbin.org/ip")
print(r.json()) # Shows the residential IP
const res = await fetch("https://httpbin.org/ip");
console.log(await res.json()); // Shows the residential IP
curl https://httpbin.org/ip # Shows the residential IP
If you want only specific processes to use the exit node instead of all VPS traffic, you can use Tailscale's --exit-node with app-specific routing or configure HTTPS_PROXY with a local proxy that routes through Tailscale.
For production setups, use Tailscale ACLs to control which machines can use which exit nodes:
{
"tagOwners": {
"tag:agent": ["autogroup:admin"],
"tag:exitnode": ["autogroup:admin"]
},
"acls": [
{
"action": "accept",
"src": ["tag:agent"],
"dst": ["tag:exitnode:*"]
}
]
}
Tag your VPS as tag:agent and your laptop as tag:exitnode to restrict access.
If you want zero dependency on Tailscale's coordination server, use Headscale — an open-source, self-hosted implementation of the Tailscale control server.
This gives you a fully self-hosted solution with no third-party dependencies.
tailscale status to verify the exit node is connected, then sudo tailscale up --exit-node=<laptop> again