Skip to main content

[DEPRECATED - Use Go version] WireGuard mesh VPN

Project description

wire

⚠️ DEPRECATED: This Python package is no longer maintained. Please use the Go version instead:

# macOS
brew install meshpop/tap/wire

# Linux
curl -sSL https://github.com/meshpop/wire/releases/latest/download/wire-linux-amd64 -o /usr/local/bin/wire && chmod +x /usr/local/bin/wire

GitHub: https://github.com/meshpop/wire

PyPI Python License: MIT

Self-hosted WireGuard mesh VPN. Like Tailscale, but you own everything.

pip install meshpop-wire

Pure Python. No external services. No accounts. No cloud dependency.


Why wire?

Manual WireGuard Tailscale / ZeroTier wire
Add new node Edit every peer config One command One command
Coordination You manage Their cloud (required) Your own server
Works if vendor down Yes
Self-hosted Manual config ✗ Enterprise only ✓ Always
IP assignment Manual Auto Auto — deterministic
AI management ✓ via MCP

How it works

wire has three components:

Component Role Where
wire-server Peer registry + STUN One always-on server
wire VPN daemon + CLI Every node
wire-mcp MCP server for AI Machines with Claude
        ┌─────────────────────────────────┐
        │  Coordination Server            │
        │  HTTP :8787 — peer registry     │
        │  UDP  :8788 — STUN              │
        │  Does NOT carry VPN traffic     │
        └──────────┬──────────┬───────────┘
                   │          │
           ┌───────▼──┐   ┌──▼───────┐
           │  Node A  │◄──►│  Node B  │
           │ 10.99.x.x│   │10.99.y.y │
           └──────────┘   └──────────┘
               direct P2P WireGuard tunnel

Deterministic IPs — each node's VPN IP is derived from its hardware identity (SHA-256 of hostname + MAC address). Same machine always gets the same IP. No DHCP, no conflicts.

Auto peer sync — the daemon polls the coordination server every 30 seconds. New nodes are discovered by the whole fleet automatically.

NAT traversal — built-in STUN server lets nodes behind home routers find each other without port forwarding.


Quick Start

Step 1 — Start the coordination server (once)

pip install meshpop-wire
wire-server

As a systemd service:

[Unit]
Description=wire coordination server
After=network.target

[Service]
ExecStart=wire-server
Restart=always

[Install]
WantedBy=multi-user.target
systemctl enable --now wire-server

Step 2 — Join each node

# First time — saves config to /etc/wire/config.json
sudo wire up --server http://YOUR_COORD_SERVER:8787 --name myserver

# After first run:
sudo wire up

Done. Every existing node discovers the new node within 30 seconds.


CLI Reference

wire up [--server URL] [--name NAME]   # Join the mesh
wire down                               # Leave the mesh
wire status                             # View all nodes
wire peers                              # List registered nodes
wire ping web1                          # Ping by name or VPN IP
wire diagnose                           # Full diagnostic check
wire install                            # Check WireGuard installation

Example wire status output:

  4 online / 1 offline / 5 total

  ● web1      10.99.23.187   203.0.113.10    5s ago
  ● web2      10.99.45.22    198.51.100.20   12s ago  (this node)
  ● db1       10.99.87.3     192.0.2.30       8s ago
  ○ backup1   10.99.100.1    198.51.100.30   14m ago  OFFLINE

WireGuard Installation

# Debian / Ubuntu
apt install wireguard wireguard-tools

# RHEL / Fedora
dnf install wireguard-tools

# Alpine
apk add wireguard-tools

# macOS
brew install wireguard-tools wireguard-go

Run wire install to check your platform.


AI Management via MCP

{
  "mcpServers": {
    "wire": { "command": "wire-mcp" }
  }
}

"Which nodes are currently offline?" "Ping all nodes and tell me which have high latency" "Why can't web1 reach db1?"

MCP Tools

Tool Description
wire_status Full mesh view — all nodes, VPN IPs, last seen
wire_up / wire_down Bring VPN up or down
wire_peers List registered peers
wire_ping Ping a peer by name or IP
wire_diagnose Full diagnostic check
wire_watchdog Check handshake ages, stale connections

Configuration

Written automatically by wire up:

{
  "server_url":  "http://COORD_SERVER:8787",
  "node_name":   "web1",
  "vpn_ip":      "10.99.x.x",
  "listen_port": 51820
}
Context Path
Root / system /etc/wire/config.json
User ~/.wire/config.json

Server environment variables

Variable Default Description
WIRE_PORT 8787 HTTP port (UDP STUN = port + 1)
WIRE_VPN_SUBNET 10.99 VPN IP prefix
WIRE_STATE_FILE /etc/wire/state.json Peer state file

MeshPOP Stack

wire is the network layer of the MeshPOP stack:

mpop     Fleet orchestration — monitor, manage, automate
vssh     Authenticated transport — remote exec, file transfer
wire     Encrypted mesh VPN — connects all nodes  ← this

Each layer is independently installable and usable.


License

MIT — MeshPOP

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

meshpop_wire-3.0.0.tar.gz (28.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

meshpop_wire-3.0.0-py3-none-any.whl (30.9 kB view details)

Uploaded Python 3

File details

Details for the file meshpop_wire-3.0.0.tar.gz.

File metadata

  • Download URL: meshpop_wire-3.0.0.tar.gz
  • Upload date:
  • Size: 28.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for meshpop_wire-3.0.0.tar.gz
Algorithm Hash digest
SHA256 1b3f68aa5cc4425bc569cec7d05e077a5dd90505f3fcba7af326fe20193dae00
MD5 dd4647ebc2b79ea30b3b5ba23df6104a
BLAKE2b-256 323cf60ed1b5320da7865ad60948576606a3ec88e8df276b40feae096ff7a653

See more details on using hashes here.

File details

Details for the file meshpop_wire-3.0.0-py3-none-any.whl.

File metadata

  • Download URL: meshpop_wire-3.0.0-py3-none-any.whl
  • Upload date:
  • Size: 30.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for meshpop_wire-3.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fcbbf17f1989731cb1bd72652dd06043a4f9662192eb94ff38bfb757cf7575ee
MD5 474e50affb5bb4e96d6babd09575a270
BLAKE2b-256 85460fae82e2bdb710436916ee29fd8c560b12dc2497218d082b3972c52d815f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page