# Hybrid Networking — SNS Digital **Entity:** SNS Digital · **Status:** Partially built (WireGuard/Tailscale active) ## What it is The overlay network that connects on-prem Proxmox VMs to cloud providers securely. Makes location transparent — a VM on Proxmox and a VPS on Linode appear on the same private network. ## Stack | Component | Software | FOSS | Role | |-----------|----------|------|------| | Mesh VPN | Tailscale | Partial (client FOSS, control plane proprietary) | Zero-config mesh for management access | | Site-to-site | WireGuard | Yes | Persistent tunnels between sites (Proxmox ↔ Linode) | | DNS | AdGuard Home (on-prem) + split horizon | Yes | Internal names resolve to private IPs | | Bastion | Linode Nanode | N/A | Public SSH/WireGuard endpoint, ProxyJump target | ## Current Topology ``` ┌──────────────┐ WireGuard ┌──────────────────┐ │ Proxmox │◄──────────────────────────►│ Linode Bastion │ │ 192.168.122.x│ (always-on) │ 172.238.163.85 │ └──────┬───────┘ └────────┬─────────┘ │ │ │ Tailscale mesh (management) │ Public IP │ │ ┌──────┴───────┐ ┌────────┴─────────┐ │ Workstation │ │ Internet/SSH │ │ (Sam's PC) │ │ clients │ └──────────────┘ └──────────────────┘ Racknerd boxes: WireGuard peer to Linode (hub-and-spoke) AWS VPC: future — VPN Gateway or WireGuard on EC2 when needed ``` ## Design Decisions 1. **WireGuard for infrastructure, Tailscale for people.** WireGuard tunnels are persistent, config-file driven, Ansible-managed. Tailscale is for ad-hoc management access from laptops/phones. 2. **Linode is the hub.** All WireGuard peers connect to Linode. On-prem and Racknerd boxes don't need public IPs — they reach each other through the hub. 3. **No split tunneling for services.** Only management traffic goes over the mesh. Service traffic (web, API) goes through the public reverse proxy path. 4. **ProxyJump, not port forwarding.** SSH to internal VMs uses `ProxyJump linode` (already in your SSH config). No ports exposed on the bastion beyond SSH + WireGuard. ## Build Steps (WireGuard hub-and-spoke) 1. **Linode (hub):** ```ini # /etc/wireguard/wg0.conf [Interface] Address = 10.10.0.1/24 ListenPort = 51820 PrivateKey = [Peer] # Proxmox PublicKey = AllowedIPs = 10.10.0.2/32, 192.168.122.0/24 [Peer] # Racknerd1 PublicKey = AllowedIPs = 10.10.0.3/32 ``` 2. **Proxmox (spoke):** ```ini [Interface] Address = 10.10.0.2/24 PrivateKey = [Peer] # Linode hub PublicKey = Endpoint = 172.238.163.85:51820 AllowedIPs = 10.10.0.0/24 PersistentKeepalive = 25 ``` 3. **Enable IP forwarding** on Linode: `net.ipv4.ip_forward = 1` 4. **Firewall:** UFW on Linode allows UDP 51820 inbound. Forward rules for inter-spoke. 5. **DNS:** AdGuard on-prem resolves `*.wg.internal` to 10.10.0.x addresses. ## Security Posture - **WireGuard:** Authenticated encryption (ChaCha20 + Poly1305). No pre-shared keys needed for this threat model, but can add for post-quantum hedge. - **Bastion exposure:** Only SSH (22/tcp) + WireGuard (51820/udp) on public IP. Everything else is default-deny. - **Key rotation:** WireGuard keys rotated annually (low urgency — Noise protocol provides forward secrecy per session). - **No cloud provider VPN dependencies.** Pure WireGuard means portable across providers. ## Upgrade Path - **Headscale:** Self-hosted Tailscale control plane if the proprietary coordination server becomes a concern. - **AWS Site-to-Site VPN:** When a client VPC needs persistent connectivity and WireGuard-on-EC2 isn't enterprise-palatable. - **Multi-hub:** Add a second WireGuard hub (Racknerd or second Linode) for redundancy if the single Linode becomes a SPOF.