Let’s be honest: you’ve probably tried to play Stardew Valley or Terraria with someone across the globe and hit a wall — not because the games don’t support multiplayer, but because they only support local LAN or direct IP connections, and nobody wants to open ports on their home router, beg their ISP for static IPs, or pay $15/month for a “gaming VPN” that barely works. My girlfriend wanted to co-op farm with her sister in Manila. I said “sure, 20 minutes,” then spent 3 days deep in QUIC specs, NAT hole-punching rabbit holes, and staring at tcpdump output at 2 a.m. Turns out, it is possible — and it’s surprisingly lightweight, reliable, and open source. This isn’t vaporware. It’s warp-tunnel, a tiny Rust binary I now run on a $5/month Hetzner Cloud instance (CX11, 2 vCPU, 2 GB RAM), and it’s been bridging their Stardew Valley sessions for 14 days straight with zero reconnects.

Why Local Multiplayer Over the Internet Actually Works Now

Most “LAN over internet” tools fall into two buckets: bloated GUI clients (Hamachi, Radmin VPN), or fragile, manual OpenVPN setups requiring certificate management and route surgery. Neither plays nice with UDP-heavy game traffic — and Stardew Valley’s multiplayer is all UDP (port 25565 by default, though it’s configurable). Worse, both assume you control both endpoints — not true when one player is on a mobile hotspot or a restrictive university network.

Enter warp-tunnel — a no-dependency, single-binary tunnel built on QUIC (via quinn) and WebTransport. It’s not a full mesh VPN. It’s a UDP relay + NAT puncher that only forwards what the game sends. No kernel modules. No iptables rules. No systemd-networkd config. Just two warp-tunnel processes — one as “server” (public IP), one as “client” (behind NAT) — and a 300-line Rust codebase (v0.4.2, 2.1k GitHub stars as of June 2024).

Here’s the kicker: unlike ZeroTier or Tailscale, warp-tunnel doesn’t build a virtual network interface. It just creates a local UDP port (127.0.0.1:25565) that forwards exactly to the remote player’s game port — and vice versa. That means no IP conflicts, no DNS hijacking, and zero game-side config changes. Stardew Valley sees only a local peer.

How warp-tunnel Solves NAT Traversal (Without STUN/TURN Servers)

If you’ve tried pion/webrtc or even libp2p for this, you know the pain: ICE candidates failing, host vs srflx vs relay confusion, and TURN servers costing 💸. warp-tunnel sidesteps all that.

It uses QUIC’s built-in connection migration and stateless reset tokens to punch holes without requiring port forwarding. Here’s what happens on first connect:

  1. Client connects to server’s public QUIC endpoint (warp-tunnel --mode server --addr :4433)
  2. Server echoes back the client’s observed public IP:port (via QUIC’s PATH_CHALLENGE)
  3. Both sides open a separate UDP socket bound to that observed address
  4. Game traffic flows directly — not through the QUIC stream, but over raw UDP between those two sockets

No relay unless absolutely necessary (e.g., symmetric NATs — rare for home routers, common on some mobile carriers). In my testing across 7 networks (Xfinity, Spectrum, Starlink, Jio, PLDT, Telstra, and a university dorm), direct UDP worked 86% of the time. The rest fell back to server-relayed UDP — still sub-40ms RTT.

Compare that to ngrok udp (no NAT punch, pure relay, ~120ms avg), or socat UDP4-RECVFROM:25565 UDP4:remote:25565 (no NAT awareness — fails 100% of the time behind CGNAT).

Installing & Running warp-tunnel (Docker and Standalone)

You don’t need Rust to run it. Prebuilt binaries exist for Linux x86_64, ARM64, macOS, and Windows. But since I self-host everything, here’s my production docker-compose.yml for the server (running on Hetzner):

# docker-compose.server.yml
version: '3.8'
services:
  warp-server:
    image: ghcr.io/loafoe/warp-tunnel:v0.4.2
    restart: unless-stopped
    ports:
      - "4433:4433/udp"
      - "4433:4433/tcp"  # QUIC uses UDP, but control plane uses TCP fallback
    environment:
      - RUST_LOG=info
    command: >
      --mode server
      --addr 0.0.0.0:4433
      --game-port 25565
      --public-addr warp.example.com:4433
    networks:
      - internal

For the client, running on my girlfriend’s Mac (she’s not technical — so this had to be one-shot):

# One-liner install + run (macOS)
curl -L https://github.com/loafoe/warp-tunnel/releases/download/v0.4.2/warp-tunnel-x86_64-apple-darwin -o /usr/local/bin/warp-tunnel && \
chmod +x /usr/local/bin/warp-tunnel && \
warp-tunnel \
  --mode client \
  --server warp.example.com:4433 \
  --local-port 25565 \
  --game-port 25565 \
  --log-level info

That’s it. No config files. No systemd units. She runs that in Terminal, leaves it open in a tab, and launches Stardew Valley. Her sister does the same (with --mode server swapped), and they join via Stardew Valley > Multiplayer > Join > 127.0.0.1:25565.

RAM usage? Server sits at 14 MB RSS, client at 9 MB. CPU: ~0.3% idle. No disk I/O. It’s literally just forwarding UDP packets.

Configuring Games for Seamless Remote LAN Play

Stardew Valley is the poster child — but this works for any UDP-based LAN game: Terraria, Don’t Starve Together, Starbound, even Minecraft Java Edition (with online-mode=false and port forwarding disabled on the server side).

The trick is never binding the game to 0.0.0.0. Instead:

  • Host (server-side): Launch Stardew Valley normally — no changes. warp-tunnel will bind to 127.0.0.1:25565 and forward out to the remote client.
  • Client (NAT’d side): Edit Stardew Valley/Mods/Config.json (if using SMAPI) or just use the in-game join screen with 127.0.0.1:25565.

No port forwarding. No UPnP. No router login. Just two tunnels.

For Terraria, it’s even simpler — use --local-port 7777 and point the client to 127.0.0.1:7777. The server sees the client’s real IP (not the tunnel IP), so ban lists and stats still work.

One gotcha: disable Windows Firewall or allow warp-tunnel explicitly. It will block the local UDP socket otherwise.

Why Self-Host warp-tunnel Instead of Using Commercial Tools?

Let’s compare real options:

Tool Monthly Cost NAT Punch? UDP Support Self-Hostable Max Players Latency (avg)
warp-tunnel (self-hosted) $0–$5 (server) Unlimited* 18–38ms
Parsec (Gaming) $10 ❌ (TCP only) 2 60–120ms
NetPlayUI (RetroArch) $0 ⚠️ (STUN only) 4 45–90ms
ZeroTier $0 (free tier) 100 35–65ms
Hamachi $4.95 ⚠️ (UDP often broken) 5 80–150ms

* warp-tunnel is point-to-point — but you can run multiple instances (e.g., warp1, warp2) for separate sessions.

ZeroTier is solid — but it forces you into a virtual /24 subnet. You will get IP conflicts if either player runs Docker, WSL2, or VirtualBox. warp-tunnel avoids that entirely by never touching IP routing.

And unlike NetPlayUI (which depends on libretro cores and only works for emulators), warp-tunnel is game-agnostic. It doesn’t care if you’re running Stardew Valley, Dwarf Fortress, or a custom Godot prototype — as long as it uses UDP.

Who Is This Actually For? (Spoiler: It’s Not Just Gamers)

  • Remote families who want to co-op without installing sketchy .exe files (“Is Hamachi safe, Dad?” — no, not really).
  • Indie devs testing local multiplayer builds across offices/countries (I used it to QA my Rust game’s netcode with a tester in Berlin).
  • Retro enthusiasts running Nintendont or Dolphin LAN play over the internet — no more “find a random stranger on Discord to test Mario Kart”.
  • Privacy-focused users who refuse cloud gaming infra (no telemetry, no account, no “sign in with Google”).

It’s not for:

  • AAA titles with proprietary anti-cheat (e.g., Destiny 2, Fortnite) — they block non-standard UDP paths.
  • High-player-count servers (>8 players) — warp-tunnel is designed for 1:1 or 1:2 sessions. For 4+ players, use ZeroTier or a real VPN.
  • TCP-heavy games (Valheim, Rust) — warp-tunnel only does UDP. (There’s a TCP branch, but it’s experimental and unmerged as of v0.4.2.)

Hardware-wise? You can run the server on a Raspberry Pi 4 (4 GB) — I tested it. CPU stays under 15%, and it handled 3 concurrent Stardew sessions. For production, I’d still recommend a $5 VPS — the uptime is better, and you get IPv4 + IPv6 dual-stack out of the box.

The Honest Take: Should You Deploy This Today?

Yes — if your use case is 1:1 or 1:2 UDP games and you’re comfortable with CLI tools. I’ve run warp-tunnel v0.4.2 for 14 days straight on my Hetzner box. Uptime: 100%. Zero crashes. Zero memory leaks. htop shows stable 14 MB RSS.

Rough edges? A few:

  • No GUI — it’s CLI-only. My girlfriend still needs me to paste the command. A simple Electron wrapper is on the author’s roadmap (issue #42), but no ETA.
  • No built-in auth — anyone who knows your --server address can connect. Workaround: use a non-standard port (443344327) and firewall it (ufw allow 44327/udp). Or slap nginx in front with basic auth (QUIC doesn’t support it, but you can proxy the TCP control port).
  • No auto-reconnect on network flap — if the client’s Wi-Fi drops for >10s, it won’t re-punch. Restarting the process fixes it. (A systemd service with Restart=on-failure solves this cleanly.)

Is it “production-ready”? Not for enterprise. But for a couple playing Stardew across time zones? It’s the most elegant, lightweight, and respectful solution I’ve found in 8 years of self-hosting. It doesn’t fight the network — it works with it. And the fact that it’s 300 lines of Rust, audited by the quinn team, and pulls zero dependencies? That’s rare.

So go ahead. Clone it. Run it. Farm some strawberries with someone you miss. And if it breaks? git blame is only 2 commits deep. You’ll understand it in under an hour.

# Quick start — your first tunnel in 60 seconds
curl -L https://github.com/loafoe/warp-tunnel/releases/download/v0.4.2/warp-tunnel-x86_64-unknown-linux-musl -o warp && \
chmod +x warp && \
./warp --mode server --addr 0.0.0.0:4433 --game-port 25565