Wazuh Autopilot uses Tailscale as the foundation for secure production deployments. This document explains why and how to set it up.
- Zero Trust Networking - Every connection is authenticated and encrypted
- No Public Exposure - MCP server doesn't need public internet access
- Identity-Based Access - Connections are tied to machine identities
- Audit Trail - All connections are logged
- ACL Control - Fine-grained access control policies
- Simple DNS - Access MCP via
mcp.your-tailnet.ts.net - No Firewall Rules - Works through NAT and firewalls
- Automatic Key Rotation - No manual certificate management
- MagicDNS - Automatic DNS for all devices
AUTOPILOT_MODE=bootstrap- Tailscale not required
- MCP can be accessed via LAN or public URL
- Not recommended for production
- Doctor shows:
⚠️ READY (Bootstrap only)
AUTOPILOT_MODE=production
AUTOPILOT_REQUIRE_TAILSCALE=true- Tailscale required on Autopilot host
- MCP URL must be a Tailnet address
- Full security posture
- Doctor shows:
✅ READY (Production)
# The installer does this automatically, or manually:
curl -fsSL https://tailscale.com/install.sh | sh
# Authenticate with your Tailnet
sudo tailscale upFollow the authentication link to connect to your Tailnet.
On the machine running your Wazuh MCP Server:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale upAfter both machines join the Tailnet:
# On MCP host - get the Tailnet hostname
tailscale status
# Example output:
# 100.64.0.1 mcp-server youruser@ linux -Your MCP Tailnet URL will be something like:
https://mcp-server.your-tailnet.ts.net:3000- or
https://100.64.0.1:3000
Update /etc/wazuh-autopilot/.env:
AUTOPILOT_MODE=production
AUTOPILOT_REQUIRE_TAILSCALE=true
MCP_URL=https://mcp-server.your-tailnet.ts.net:3000If you were running in bootstrap mode:
-
Update
/etc/wazuh-autopilot/.env:AUTOPILOT_MODE=production AUTOPILOT_REQUIRE_TAILSCALE=true MCP_URL=https://mcp-server.your-tailnet.ts.net:3000
-
Restart the service:
sudo systemctl restart wazuh-autopilot
-
Verify with doctor:
./install/doctor.sh
For additional security, configure Tailscale ACLs to restrict access:
{
"acls": [
{
"action": "accept",
"src": ["tag:autopilot"],
"dst": ["tag:mcp:3000"]
}
],
"tagOwners": {
"tag:autopilot": ["autogroup:admin"],
"tag:mcp": ["autogroup:admin"]
}
}Tag your machines:
# On Autopilot host
sudo tailscale up --advertise-tags=tag:autopilot
# On MCP host
sudo tailscale up --advertise-tags=tag:mcptailscale statusShould show both machines online.
# From Autopilot host
curl https://mcp-server.your-tailnet.ts.net:3000/health./install/doctor.shLook for:
✓ Tailscale running✓ URL is a Tailnet URL✓ MCP health check passed
sudo tailscale upUpdate MCP_URL in /etc/wazuh-autopilot/.env to use the Tailnet address.
-
Verify MCP host is on the same Tailnet:
tailscale status
-
Check MCP is listening:
# On MCP host ss -tlnp | grep 3000
-
Check Tailscale ACLs allow the connection
You're trying to use production mode with a non-Tailnet URL. Either:
- Change
AUTOPILOT_MODE=bootstrapfor testing - Or update
MCP_URLto a Tailnet address
For dev/staging/prod environments, use:
- Different Tailnets, or
- Tailscale ACLs to segment access
Tailscale supports:
- Multiple relay servers (DERP)
- Subnet routing for HA setups
- Exit nodes for centralized egress
Tailscale provides:
- SOC 2 Type II certified
- Audit logs for all connections
- Admin console for visibility
If you cannot use Tailscale:
- VPN - Configure MCP behind your corporate VPN
- mTLS - Set up mutual TLS between Autopilot and MCP
- SSH Tunnel - Forward MCP port over SSH
These alternatives require manual configuration and are not officially supported.