porta-rs 0.1.1

Zero-trust CGNAT bypass via WireGuard tunnel
porta-rs-0.1.1 is not a library.

Porta

Expose your local services to the internet. No public IP needed.

Porta lets you share apps running on your local machine with anyone on the internet - even if you're behind CGNAT, a firewall, or a double NAT.

Your laptop behind CGNAT          Your friend on the internet
       │                                    │
       ▼                                    ▼
  localhost:3000  ──── WireGuard ────  vps.example.com:3000
       │                                    │
   Your app                           Their browser

Who is this for?

You Problem How Porta helps
Home lab enthusiast Want to access your services remotely Expose them through a cheap VPS
Developer Need to demo an app to a client Share localhost instantly
Gamer Want to host a server behind NAT Open ports without port forwarding
Self-hoster IPv4 CGNAT blocks incoming connections Bypass it with a tunnel
Small business No static IP for your office server Use a VPS as a public entry point

Why Porta?

Feature Description
Zero config Interactive wizard sets everything up for you
Secure by default All traffic encrypted via WireGuard
One command porta add-port --remote 80 --local 3000 and you're done
No IP needed Works behind CGNAT, carrier-grade NAT, or firewalls
Any protocol HTTP, HTTPS, SSH, WebSocket, gaming servers, DNS - anything TCP/UDP
Firewall aware Automatically creates UFW rules on the server

Use cases

Share your web app with a client

# Your app runs on localhost:3000
npm run dev

# In another terminal, expose it
sudo porta add-port --remote 8080 --local 3000 --desc "Client demo"

# Send them: http://your-vps-ip:8080

Access your home server remotely

# SSH into your home machine through the tunnel
ssh -p 2222 user@your-vps-ip

# Porta forwards VPS:2222 → home:22
sudo porta add-port --remote 2222 --local 22 --protocol tcp --desc "SSH"

Host a game server behind NAT

# Minecraft on port 25565
sudo porta add-port --remote 25565 --local 25565 --protocol tcp --desc "Minecraft"

Run a DNS server

# Pi-hole or custom DNS
sudo porta add-port --remote 53 --local 53 --protocol udp --desc "DNS"

Quick start

# 1. Install
git clone https://github.com/brzb0/Porta.git && cd Porta
cargo build --release
sudo cp target/release/porta /usr/local/bin/

# 2. Setup server (on your VPS)
sudo porta setup --role server

# 3. Setup client (on your machine)
sudo porta setup --role client

# 4. Add a port
sudo porta add-port --remote 8080 --local 3000 --protocol tcp

# 5. Start
sudo systemctl enable --now porta-server   # on VPS
sudo systemctl enable --now porta-client   # on your machine

How it works

┌─────────────────────────────────────────────────────────────────┐
│                         INTERNET                                 │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  VPS (Public IP)                                                 │
│                                                                  │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐                   │
│  │   UFW    │───▶│   Porta  │───▶│ WireGuard│                   │
│  │ Firewall │    │  Server  │    │  Tunnel  │                   │
│  └──────────┘    └──────────┘    └─────┬────┘                   │
└──────────────────────────────────────────┼──────────────────────┘
                                           │ encrypted
┌──────────────────────────────────────────┼──────────────────────┐
│  Your Machine (CGNAT)                    │                      │
│                                          ▼                      │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐                   │
│  │ Your App │◀───│   Porta  │◀───│ WireGuard│                   │
│  │ localhost│    │  Client  │    │  Tunnel  │                   │
│  └──────────┘    └──────────┘    └──────────┘                   │
└─────────────────────────────────────────────────────────────────┘
  1. Porta Server listens on the VPS's public IP
  2. Porta Client connects through an encrypted WireGuard tunnel
  3. Traffic flows: Internet → VPS → Tunnel → Your machine → Your app

Commands

Command What it does
porta setup Interactive setup wizard
porta add-port Expose a local port to the internet
porta remove-port Stop exposing a port
porta status See what ports are exposed
porta metrics View traffic statistics
porta logs View service logs
porta run Start the service

Full documentation: docs/GUIDE.md


Requirements

  • Linux (Ubuntu 20.04+, Debian 11+, Fedora 36+)
  • Root access (sudo)
  • WireGuard kernel module
  • Two machines: one with public IP (VPS), one behind CGNAT (your machine)

Configuration

File Location Purpose
Server config /etc/porta/server.toml Server settings + allowed clients
Client config ~/.config/porta/client.toml Client settings + port mappings
Server key /etc/porta/server.key WireGuard private key (sensitive)
Client key ~/.config/porta/client.key WireGuard private key (sensitive)

Security

  • WireGuard encryption: All traffic is encrypted end-to-end
  • Zero trust: Commands only flow from client → server, never the reverse
  • HMAC authentication: Client must authenticate to register ports
  • No exposed keys: Private keys are stored separately from config

License

MIT


Warning: Porta is experimental software. Use in production at your own risk. Tested on Ubuntu 24.04.