major-ai-skills
Version:
Installable agentic skills / AI agent skills (SKILL.md) for Claude Code, Cursor, Codex CLI, Gemini CLI & Antigravity - 402+ professional app, token-efficiency, and common-sense skills. SEO/GEO ready.
175 lines (136 loc) • 8.54 kB
Markdown
title: "Tailscale Mesh VPN AI Skill Guide (GPT & Codex)"
description: "Comprehensive operational skill specification for OpenAI GPT and Codex to automate, script, troubleshoot, and optimize Tailscale Local API, Tailscale REST API, Headscale self-hosting, and Terraform provisioning."
category: "Zero-Config Mesh VPN & Mesh Networking"
tags: ["tailscale", "tailscale-api", "headscale", "terraform-tailscale", "gpt-codex", "mesh-automation"]
# Tailscale Mesh VPN AI Skill Guide (GPT & Codex)
## Overview & Engine Architecture
Tailscale provides rich programmatic control via the **Tailscale Local Client API (Unix Domain Socket / Windows Named Pipe)** and the **Tailscale SaaS REST API**. GPT/Codex acts as a Principal Network DevOps Engineer and Automation Architect, delivering **Python Local API socket scripts**, **Terraform Tailscale provider automation**, **Headscale self-hosted control-plane management**, and **automated zero-touch container provisioning**.
### Architecture & Local API Socket Stack
```
┌─────────────────────────────────────────────────────────────┐
│ Tailscale Developer Platform │
│ │
│ API Integration Layer │
│ ├── Local Client API (Unix Domain Socket `/var/run/...`) │
│ ├── SaaS REST API (OAuth2 Client Credentials & API Keys) │
│ └── Terraform Provider (`tailscale/tailscale`) │
│ │
│ Node Automation & Coordination │
│ ├── Ephemeral Auth Key Generation & Auto-Tagging │
│ ├── Headscale Open-Source Coordination Engine Support │
│ └── Docker Container VPN Sidecar Pattern (`tailscale/tailscale`)│
└─────────────────────────────────────────────────────────────┘
```
## Operational Capabilities & Agent Directives
1. **Local Socket API Programming**: Author Python scripts communicating with `tailscaled.sock` via Unix domain sockets to query live peers, active IP addresses, and DERP maps without invoking CLI subprocesses.
2. **Terraform Infrastructure as Code (IaC)**: Write declarative Terraform configurations managing Tailscale ACL policies, DNS nameservers, device authorization, and OAuth clients.
3. **Headscale Self-Hosted Deployment**: Deploy and configure open-source `headscale` servers, registering nodes via pre-authenticated namespaces.
4. **Container VPN Sidecar Architecture**: Build Docker Compose setups routing microservice traffic securely through a Tailscale container sidecar using `network_mode: "service:tailscale"`.
## Production Python Automation: Tailscale Local Daemon Socket Client
Run this Python script to query node status, peers, and DERP latency directly through the local `tailscaled` Unix domain socket:
```python
"""
Tailscale Local Socket API Client
Communicates directly with the tailscaled daemon via Unix domain socket.
"""
import sys
import os
import json
import socket
import http.client
class UnixSocketHTTPConnection(http.client.HTTPConnection):
def __init__(self, socket_path):
super().__init__("localhost")
self.socket_path = socket_path
def connect(self):
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.connect(self.socket_path)
def query_tailscale_local_api(socket_path: str = "/var/run/tailscale/tailscaled.sock"):
if not os.path.exists(socket_path):
print(f"Error: Tailscale daemon socket '{socket_path}' not found.")
return
conn = UnixSocketHTTPConnection(socket_path)
# The Local API expects a dummy Host header and an empty path for status
conn.request("GET", "/localapi/v0/status", headers={"Host": "local-tailscaled.sock"})
response = conn.getresponse()
if response.status != 200:
print(f"Error from Local API: {response.status} {response.reason}")
return
status_data = json.loads(response.read().decode("utf-8"))
# Extract Node Information
self_node = status_data.get("Self", {})
node_name = self_node.get("HostName")
tailscale_ips = self_node.get("TailscaleIPs", [])
online = status_data.get("BackendState")
print(f"--- [TAILSCALE NODE STATUS] ---")
print(f"Hostname: {node_name} | State: {online}")
print(f"Tailscale IPs: {', '.join(tailscale_ips)}")
peers = status_data.get("Peer", {})
print(f"\nConnected Mesh Peers ({len(peers)}):")
for peer_key, peer_info in peers.items():
peer_name = peer_info.get("HostName")
peer_ips = peer_info.get("TailscaleIPs", [])
active = peer_info.get("Active", False)
relay = peer_info.get("Relay", "direct")
print(f" • {peer_name:<20} | IP: {peer_ips[0] if peer_ips else '-':<15} | Direct: {not bool(relay)} | Relay: {relay}")
if __name__ == "__main__":
query_tailscale_local_api()
```
## Production Docker Compose: Containerized Tailscale Sidecar Proxy
Save this file as `docker-compose.yml` to securely route a web application through Tailscale:
```yaml
version: "3.8"
services:
# Tailscale Network Sidecar
tailscale:
image: tailscale/tailscale:latest
container_name: tailscale-sidecar
hostname: production-app-node
environment:
- TS_AUTHKEY=tskey-auth-xxxxxx-ephemeral
- TS_STATE_DIR=/var/lib/tailscale
- TS_USERSPACE=false
volumes:
- ./tailscale_state:/var/lib/tailscale
- /dev/net/tun:/dev/net/tun
cap_add:
- NET_ADMIN
- SYS_MODULE
restart: unless-stopped
# Internal Web Application (Shares network stack with Tailscale)
app:
image: node:20-alpine
container_name: internal-app
network_mode: "service:tailscale"
depends_on:
- tailscale
command: ["node", "-e", "require('http').createServer((r,s)=>s.end('Hello from secure Tailscale mesh!')).listen(8080)"]
```
## Technical Troubleshooting Matrix
| Issue & Failure Signature | Root Cause Analysis | Diagnostic & Resolution Pathway |
| :--- | :--- | :--- |
| **`Permission Denied` Connecting to `/var/run/tailscale/tailscaled.sock`** | Current user is not in the `tailscale` group or lacks root permissions to access the daemon socket. | 1. Add user to operator group: `sudo tailscale set --operator-group=$USER`.<br>2. Or execute script as root / `sudo`. |
| **Ephemeral Container Nodes Accumulating in Admin Console** | Docker container restarted with new machine key without deleting old node registration. | 1. Use pre-authenticated ephemeral keys (`tskey-auth-...` with Ephemeral checked).<br>2. Ephemeral nodes automatically deregister immediately when taken offline. |
| **`Error: /dev/net/tun not found` in Docker** | Docker host does not have the TUN kernel module loaded or container lacks `cap_add: [NET_ADMIN]`. | 1. On host, run `sudo modprobe tun`.<br>2. Ensure `volumes: ["/dev/net/tun:/dev/net/tun"]` is mounted. |
| **Headscale Client Fails: `node not registered`** | Client attempted authentication against a non-existent user namespace on Headscale. | 1. On Headscale server: `headscale users create default`.<br>2. Generate auth key: `headscale preauthkeys create -u default --reusable`. |
## Command Line Syntax & Batch Execution
```bash
# Register Node against Self-Hosted Headscale Control Server
sudo tailscale up --login-server https://headscale.mycompany.com --authkey <KEY>
# Set Non-Root Operator Permissions for CLI
sudo tailscale set --operator=$USER
```
### Essential File Locations
- **Daemon Socket**: `/var/run/tailscale/tailscaled.sock`
- **Daemon State**: `/var/lib/tailscale/tailscaled.state`
- **Windows Named Pipe**: `\\.\pipe\ProtectedPrefix\Administrators\Tailscale\tailscaled`
## Agent Operational Directive
> **MANDATORY**: For Docker and ephemeral cloud deployments, always generate pre-authenticated Ephemeral auth keys so offline instances automatically clean up from the Admin Console. Use container sidecar network sharing (`network_mode: "service:tailscale"`).