INFRA.LAB// 8 min read

Zero Trust Home Network with Twingate: No VPN Required

How to implement zero-trust architecture for your homelab using Twingate. Secure remote access without traditional VPN complexity.

July 10, 2026
SecurityTwingateNetworkingZero TrustRemote Access

Zero Trust Home Network with Twingate: No VPN Required

Last updated: July 10, 2026 | Reading time: 8 minutes


Introduction: Why VPNs Are Broken for Homelabs

Traditional VPNs are fundamentally flawed for modern homelab access:

  • All-or-nothing access - Once connected, you're on the entire network
  • Single point of failure - VPN down = no access to anything
  • Complex setup - Port forwarding, dynamic DNS, certificate management
  • Security risks - Exposed VPN ports are constant attack vectors
  • Poor mobile experience - Battery drain, connection drops, manual reconnect

Zero Trust solves all of this. Instead of "trust everyone inside the network," Zero Trust assumes no one is trusted—every access request is verified, every connection is encrypted, and users only see what they're explicitly allowed to access.

This guide shows you how to implement Zero Trust for your homelab using Twingate—no port forwarding, no exposed IPs, no VPN client headaches.


What is Zero Trust?

Zero Trust is a security model built on three principles:

  1. Never trust, always verify - Every access request is authenticated and authorized
  2. Least privilege access - Users only access what they explicitly need
  3. Assume breach - Design as if attackers are already inside the network

For homelabs, this means:

  • No open ports on your router
  • Each service has individual access controls
  • Remote users can't see your entire network
  • Audit logs for every connection

Why Twingate?

I evaluated several Zero Trust solutions:

| Solution | Cost | Complexity | Homelab Fit | |----------|------|------------|-------------| | Twingate | Free tier (5 users) | Low | ⭐⭐⭐⭐⭐ | | Tailscale | Free tier (3 users) | Low | ⭐⭐⭐⭐ | | Cloudflare Zero Trust | Free tier (50 users) | Medium | ⭐⭐⭐⭐ | | Ziti (OpenZiti) | Free (self-hosted) | High | ⭐⭐⭐ | | WireGuard + Auth | Free | High | ⭐⭐ |

Twingate wins for homelabs because:

  • Free for up to 5 users and 10 resources
  • 5-minute setup (literally)
  • No client required for web services (browser-based access)
  • Works behind NAT (no public IP needed)
  • Granular access controls per service
  • Full audit logging

Architecture Overview

Here's how Twingate works in a homelab:

┌─────────────────┐
│   Remote User   │
│   (Laptop/Phone)│
└────────┬────────┘
         │ Encrypted TLS
         ▼
┌─────────────────┐
│  Twingate Cloud │
│  (Control Plane)│
└────────┬────────┘
         │ Secure tunnel
         ▼
┌─────────────────┐
│  Twingate       │
│  Connector      │
│  (Your Homelab) │
└────────┬────────┘
         │ Local network
         ▼
┌─────────────────┐
│  Your Services  │
│  (Proxmox,      │
│   Jellyfin,     │
│   Gitea, etc.)  │
└─────────────────┘

Key points:

  • The Connector runs in your network (Docker, VM, or bare metal)
  • It creates outbound-only connections to Twingate (no inbound ports)
  • Users authenticate with Twingate Cloud
  • Access is granted per-resource, not per-network

Step 1: Create Your Twingate Network

  1. Go to twingate.com
  2. Click Get Started Free
  3. Sign up with email or SSO (Google, Microsoft, Okta)
  4. Create your network name (e.g., "neuralcodelab-homelab")

You'll land in the admin console.


Step 2: Deploy the Connector

The Connector is a lightweight service that routes traffic to your resources.

Option A: Docker (Recommended)

# Create directory
mkdir -p ~/docker/twingate-connector
cd ~/docker/twingate-connector

# Get tokens from Twingate console
# Go to Connectors → Add Connector → Copy tokens

# Create docker-compose.yml
cat > docker-compose.yml << EOF
version: '3'
services:
  twingate-connector:
    image: twingate/connector:latest
    container_name: twingate-connector
    restart: unless-stopped
    environment:
      - TWINGATE_NETWORK=your-network-name
      - TWINGATE_ACCESS_TOKEN=your-access-token
      - TWINGATE_REFRESH_TOKEN=your-refresh-token
    dns:
      - 1.1.1.1
      - 8.8.8.8
EOF

# Start
docker compose up -d

Option B: LXC Container (Proxmox)

# Create Ubuntu 24.04 container
# 1 CPU, 512 MB RAM, 4 GB disk

# Inside container:
docker run -d \
  --name twingate-connector \
  --restart unless-stopped \
  -e TWINGATE_NETWORK=your-network-name \
  -e TWINGATE_ACCESS_TOKEN=your-access-token \
  -e TWINGATE_REFRESH_TOKEN=your-refresh-token \
  --dns 1.1.1.1 \
  --dns 8.8.8.8 \
  twingate/connector:latest

Option C: Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: twingate-connector
spec:
  replicas: 1
  selector:
    matchLabels:
      app: twingate-connector
  template:
    metadata:
      labels:
        app: twingate-connector
    spec:
      containers:
      - name: connector
        image: twingate/connector:latest
        env:
        - name: TWINGATE_NETWORK
          value: "your-network-name"
        - name: TWINGATE_ACCESS_TOKEN
          valueFrom:
            secretKeyRef:
              name: twingate-secrets
              key: access-token
        - name: TWINGATE_REFRESH_TOKEN
          valueFrom:
            secretKeyRef:
              name: twingate-secrets
              key: refresh-token
        dnsPolicy: ClusterFirst
        dnsConfig:
          nameservers:
            - 1.1.1.1
            - 8.8.8.8

Step 3: Add Resources

Resources are the services you want to protect.

Add a Resource

  1. Go to ResourcesAdd Resource
  2. Configure:
    • Name: Proxmox (user-friendly name)
    • Address: 192.168.1.100:8006 (internal IP:port)
    • Visible to: Select which users/groups can access
  3. Click Save

Example Resources for Homelab

| Resource Name | Address | Access | |---------------|---------|--------| | Proxmox | 192.168.1.100:8006 | Admin only | | Gitea | 192.168.1.101:3000 | All users | | Grafana | 192.168.1.102:3000 | All users | | Jellyfin | 192.168.1.103:8096 | Family only | | Nextcloud | 192.168.1.104:443 | All users | | SSH Gateway | 192.168.1.100:22 | Admin only |


Step 4: Add Users

  1. Go to UsersAdd User
  2. Enter email address
  3. Select groups (create groups for access control)
  4. Click Send Invite

Users receive an email with setup instructions.

Recommended Groups

| Group | Access Level | Members | |-------|--------------|---------| | Admins | Full access to all resources | You | | Developers | Dev services (Gitea, CI/CD, etc.) | Your team | | Family | Media services only | Family members | | Guests | Limited, temporary access | Visitors |


Step 5: Install the Client

Desktop Client (Windows/Mac/Linux)

  1. User clicks invite link
  2. Downloads Twingate client
  3. Logs in with email
  4. Can now access resources

Mobile Client (iOS/Android)

Same process—download app, log in, connect.

Browser Access (No Client)

For web services, Twingate offers browser-based access:

  1. Enable Browser Session for the resource
  2. Users click "Access via Browser" in Twingate app
  3. Service opens in isolated browser session
  4. No client installation needed

Security Best Practices

Enable MFA

Force multi-factor authentication:

  1. Go to SettingsSecurity
  2. Enable Require MFA
  3. Choose methods: TOTP (Google Authenticator), SMS, or SSO

Set Resource Access Policies

Don't give everyone access to everything:

  1. Go to Resources → Select resource
  2. Click Access tab
  3. Configure:
    • Required Approvals: Who must approve access
    • Allowed Groups: Which groups can request access
    • Time-limited access: Auto-revoke after X hours

Enable Audit Logging

Twingate logs every connection:

  1. Go to ReportsAudit Logs
  2. Export logs for compliance
  3. Set up alerts for suspicious activity

Use Split Tunnel

By default, only Twingate resources route through the tunnel. Your regular internet traffic goes directly—no speed impact.


Advanced: Self-Hosting the Connector

For full control, run the Connector on your infrastructure.

System Requirements

  • 1 vCPU
  • 512 MB RAM
  • 2 GB disk
  • Outbound internet access (ports 443, 11800-11810)

Docker Compose with Health Checks

version: '3'
services:
  twingate-connector:
    image: twingate/connector:latest
    container_name: twingate-connector
    restart: unless-stopped
    environment:
      - TWINGATE_NETWORK=${TWINGATE_NETWORK}
      - TWINGATE_ACCESS_TOKEN=${TWINGATE_ACCESS_TOKEN}
      - TWINGATE_REFRESH_TOKEN=${TWINGATE_REFRESH_TOKEN}
      - TWINGATE_LOG_LEVEL=3
    dns:
      - 1.1.1.1
      - 8.8.8.8
    healthcheck:
      test: ["CMD", "pgrep", "-f", "twingate"]
      interval: 30s
      timeout: 10s
      retries: 3
    networks:
      - twingate-net

networks:
  twingate-net:
    driver: bridge

Monitoring the Connector

# Check status
docker logs twingate-connector

# View connections
docker exec twingate-connector netstat -tlnp

# Restart if needed
docker restart twingate-connector

Comparison: Twingate vs Traditional VPN

| Feature | Twingate | Traditional VPN | |---------|----------|-----------------| | Setup time | 5 minutes | 1-2 hours | | Port forwarding | Not required | Required | | Public IP exposure | None | VPN port exposed | | Access granularity | Per-resource | All-or-nothing | | Mobile experience | Excellent | Poor | | Audit logging | Built-in | Manual setup | | MFA | Built-in | Additional config | | Cost (5 users) | Free | $50-200/month |


Troubleshooting

Connector Won't Start

Check tokens:

docker logs twingate-connector
# Look for "authentication failed"

Regenerate tokens in Twingate console and restart.

Can't Access Resources

  1. Verify resource address is correct
  2. Check user has access to the resource
  3. Ensure Connector has outbound internet access
  4. Test from inside the network first

Slow Connections

  1. Check Connector CPU/memory usage
  2. Verify internet bandwidth
  3. Try different Twingate PoP (Point of Presence)

Conclusion

Zero Trust with Twingate gives you:

  • ✅ No open ports on your router
  • ✅ Granular access per service
  • ✅ Full audit logging
  • ✅ Works from anywhere (no public IP needed)
  • ✅ Free for homelab use (5 users)

The setup takes 15 minutes end-to-end. There's no reason to keep running a traditional VPN in 2026.

Next steps:

  1. Deploy the Connector
  2. Add your first resource (Proxmox or Gitea)
  3. Invite one test user
  4. Verify access works
  5. Add remaining resources gradually

Questions? Drop them below. Found this helpful? Share it with someone still using OpenVPN.