Mainsail web interface on a laptop and a phone — controlling a 3D printer from the browser
Mainsail: full printer control from the browser — on desktop and mobile

Remote access to a 3D printer means watching the webcam, checking temperatures, and controlling prints through Fluidd, Mainsail, or OctoPrint from anywhere with an internet connection. This guide covers the approaches that actually work when your ISP hides you behind CGNAT: from the free peer-to-peer ZeroTier network to a fully private tunnel on a cheap VPS with HTTPS and a password.

It's written for Klipper machines — DIY builds on a Raspberry Pi as well as factory printers like QIDI or rooted Creality K-series — and for OctoPrint too. The scheme is always the same: the web interface runs on the printer's host computer, and our job is to reach it from outside safely.

Why Direct Access Fails: CGNAT and Shared IPs

Most home ISPs put you behind CGNAT: due to the IPv4 shortage, dozens of subscribers share one public address. Incoming connections never reach your router, so classic port forwarding simply can't work. A dedicated static IP is sold separately — in Russia it's roughly 150–250 ₽ a month depending on the ISP — but it doesn't solve the real problem: exposing the printer's web interface without protection is a terrible idea, and we'll show why below.

Tailscale, the usual answer in English-language guides, is no longer an option for Russian users: since September 2023 its package repository returns HTTP 451 "Unavailable For Legal Reasons" to Russian addresses, and since October 2, 2024 the login itself is blocked: issue #13648 — "control plane is no longer accessible from within Russia" — is still open.

Terminal: installing Tailscale from a Russian IP fails with HTTP error 451
Trying to install Tailscale from a Russian address: the script fails with error 451 (screenshot from the 3DToday guide)

That leaves three working paths: a hosted service (Obico, OctoEverywhere, the Russian EZH-Print), a peer-to-peer network between your own devices (ZeroTier), or a tunnel to your own server (frp or SSH on a rented VPS). Let's go through all three — with prices and honest trade-offs.

Comparing the Options: Price, Effort, Features

MethodPrice per monthEffortWhat you get
frp tunnel on your VPS299–429 ₽ (VPS rental)MediumFull Fluidd/Mainsail/OctoPrint UI with webcam, HTTPS and a password, your own URL
SSH tunnel (autossh)299–429 ₽ (same VPS)MediumSame UI through one port, nothing to install on the VPS
ZeroTier0 ₽ (up to 10 devices)LowAccess via internal IPs from your own devices, no public URL
Obico Cloud (Free)0 ₽; AI Premium $6.99 — Russian cards not acceptedLowTunnel to the UI (300 MB/mo cap), 10 AI hours/mo, mobile app, 1 printer
Obico self-hosted0 ₽ + a server with 4 GB RAMHighAll of the above with no caps: tunnel, AI failure detection, app
OctoEverywhere0 ₽ up to 3 printers; Supporter $4.99 — Russian cards not acceptedLowTunnel, Gadget AI monitoring, apps, webcam streaming
EZH-PrintBeta: free for 60 days, pricing TBALowWeb access to Klipper/Moonraker, Telegram and VK notifications
frp tunnel on your VPS
Price per month: 299–429 ₽ (VPS rental) · Effort: Medium · What you get: Full Fluidd/Mainsail/OctoPrint UI with webcam, HTTPS and a password, your own URL
SSH tunnel (autossh)
Price per month: 299–429 ₽ (same VPS) · Effort: Medium · What you get: Same UI through one port, nothing to install on the VPS
ZeroTier
Price per month: 0 ₽ (up to 10 devices) · Effort: Low · What you get: Access via internal IPs from your own devices, no public URL
Obico Cloud (Free)
Price per month: 0 ₽; AI Premium $6.99 — Russian cards not accepted · Effort: Low · What you get: Tunnel to the UI (300 MB/mo cap), 10 AI hours/mo, mobile app, 1 printer
Obico self-hosted
Price per month: 0 ₽ + a server with 4 GB RAM · Effort: High · What you get: All of the above with no caps: tunnel, AI failure detection, app
OctoEverywhere
Price per month: 0 ₽ up to 3 printers; Supporter $4.99 — Russian cards not accepted · Effort: Low · What you get: Tunnel, Gadget AI monitoring, apps, webcam streaming
EZH-Print
Price per month: Beta: free for 60 days, pricing TBA · Effort: Low · What you get: Web access to Klipper/Moonraker, Telegram and VK notifications

Our pick if you want control and predictability is the frp tunnel on your own VPS: no service-imposed traffic caps, the webcam just works, the URL is yours, and the only bill is the server itself. The step-by-step setup is below. If you'd rather skip the terminal entirely, start with ZeroTier or Obico Free.

What You'll Need

  • A Klipper printer with Mainsail or Fluidd (or OctoPrint) and SSH access to its host — a Raspberry Pi, Orange Pi, or the built-in board
  • A VPS with a public IP — the cheapest 1 GB RAM plan is enough, frp is extremely light
  • A domain or subdomain for HTTPS — optional, but it gets you a proper certificate and a browser password prompt
  • Half an hour to an hour and basic terminal skills
  • For the ZeroTier route — just an account at zerotier.com and the phone app
  • For self-hosted Obico — a server with 4 GB RAM (covered in a companion article, linked below)

We use AdminVPS — data centers in Russia, payable with Russian cards. The sweet spot for this guide is the Promo plan: 429 ₽/mo for 1 core at 3.6 GHz, 2 GB RAM, and 30 GB NVMe with free weekly backups. With promo code ph-60 the first month comes to about 172 ₽ (60% off, monthly billing, one-time use; the code doesn't apply to Lite plans). A bare frp tunnel would run fine on Lite at 299 ₽, but Promo's 2 GB RAM leaves headroom for the future; the self-hosted Obico server from the companion article will need Micro with 4 GB RAM (799 ₽).

Printer Hub partner

Your printer, in reach from anywhere

Remote access to Klipper and OctoPrint, AI print monitoring and your own model library — on a VPS from 172 ₽ for the first month.

  • NVMe drives
  • Anti-DDoS
  • 24/7 support
  • 🇷🇺 🇩🇪 🇳🇱 7 locations
Choose a VPS from 172 ₽

First month with the promo code, then from 429 ₽/mo — Promo plan: 2 GB RAM, 30 GB NVMe, backups included.

Buying via this link supports Printer Hub 🤝

The frp Tunnel: Your Server, Your Rules

frp (fast reverse proxy) is an open-source project with 108k GitHub stars; the current release v0.70.1 shipped in July 2026. The idea is simple: the frpc client on the printer's host opens an outbound connection to the frps server on your VPS and keeps it alive. Incoming requests hit the VPS and ride down that tunnel — so CGNAT at home doesn't matter at all. The frpc↔frps channel is encrypted: TLS has been on by default since v0.50.0.

Official frp architecture diagram: the frpc client behind NAT connects to the frps server on your own server
Diagram from the frp docs: frpc behind NAT keeps an outbound tunnel to frps on a server with a public address

Step 1. Install frps on the VPS

bash
wget https://github.com/fatedier/frp/releases/download/v0.70.1/frp_0.70.1_linux_amd64.tar.gz
tar -xzf frp_0.70.1_linux_amd64.tar.gz
sudo cp frp_0.70.1_linux_amd64/frps /usr/local/bin/
sudo mkdir -p /etc/frp
toml
# /etc/frp/frps.toml
bindPort = 7000
auth.token = "paste_a_long_random_token"

# tunnel ports listen on localhost only —
# Caddy will expose them with HTTPS and a password (step 3)
proxyBindAddr = "127.0.0.1"

# clients may only claim this port
allowPorts = [
  { single = 8080 }
]

Generate the token with openssl rand -hex 32 and keep it identical on both ends. Without a token, any stranger's frpc client that finds your port 7000 with a scanner can register its own tunnels on your server. proxyBindAddr = "127.0.0.1" hides port 8080 from the internet: until step 3 the printer UI is only reachable from the VPS itself — exactly what we want.

ini
# /etc/systemd/system/frps.service — the official template from the frp docs
[Unit]
Description=frp server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure

[Install]
WantedBy=multi-user.target

# then: sudo systemctl enable --now frps

Step 2. Install frpc on the Printer Host

bash
# arm64 for Raspberry Pi 3/4/5 on a 64-bit OS;
# grab linux_arm for 32-bit Raspberry Pi OS
wget https://github.com/fatedier/frp/releases/download/v0.70.1/frp_0.70.1_linux_arm64.tar.gz
tar -xzf frp_0.70.1_linux_arm64.tar.gz
sudo cp frp_0.70.1_linux_arm64/frpc /usr/local/bin/
sudo mkdir -p /etc/frp
toml
# /etc/frp/frpc.toml
serverAddr = "your_VPS_IP"
serverPort = 7000
auth.token = "same_token_as_on_the_server"

[[proxies]]
name = "printer-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8080

localPort = 80 is where the host's nginx serves Fluidd or Mainsail (the default on MainsailOS and FluiddPi). If your UI lives on another port, adjust it. To verify: run systemctl status frpc on the printer, then on the VPS run curl -I http://127.0.0.1:8080 — you should get back the HTTP headers with a 200 status.

ini
# /etc/systemd/system/frpc.service — on the printer host
[Unit]
Description=frp client
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

# then: sudo systemctl enable --now frpc

Step 3. HTTPS and a Password: Caddy on Top

The interface goes public only behind a reverse proxy with a password and encryption. We'll use Caddy: it issues and renews Let's Encrypt certificates by itself, no certbot involved. Beforehand, point an A record (say, printer.example.com) at your VPS IP and open ports 80, 443, and 7000 in the firewall.

bash
# add the official Caddy repository (the package isn't in the stock repos)
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy

# hash the password for basic_auth (bcrypt):
caddy hash-password
# type the password — you'll get a string like $2a$14$...
text
# /etc/caddy/Caddyfile
printer.example.com {
    basic_auth {
        printeruser $2a$14$paste_the_hash_from_caddy_hash-password
    }
    reverse_proxy 127.0.0.1:8080
}

# then: sudo systemctl reload caddy

Note the directive is spelled basic_auth since Caddy 2.8 — older tutorials show the legacy basicauth. The browser asks for the login once and remembers it; Mobileraker takes the same credentials in its connection settings.

Fluidd interface on a phone and a desktop: webcam, temperatures, and print control
Fluidd through the tunnel behaves just like at home: webcam, temperatures, console — all there

SSH Tunnel: Minimal Installation

If you'd rather not install frp, a reverse SSH tunnel does the same job with one command — and there's nothing to install on the VPS at all. From the printer host, forward its port 80 to port 8080 on the server:

bash
ssh -N -R 8080:localhost:80 user@your_VPS_IP

By default sshd binds the forwarded port to the server's 127.0.0.1 only (the GatewayPorts no setting) — which is perfect for our Caddy setup: the port stays hidden from the outside while Caddy from step 3 proxies to it with a password. To survive connection drops, install autossh and wrap it in a service:

ini
# /etc/systemd/system/printer-tunnel.service — on the printer host
[Unit]
Description=Reverse SSH tunnel to VPS
After=network-online.target
Wants=network-online.target

[Service]
User=pi
Environment=AUTOSSH_GATETIME=0
ExecStart=/usr/bin/autossh -M 0 -N \
  -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" \
  -o "ExitOnForwardFailure yes" \
  -R 8080:localhost:80 user@your_VPS_IP
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

When to pick SSH over frp: a single tunnel and minimal setup. frp wins once you need several services — the web UI, a separate camera stream, the Moonraker API — each is just another [[proxies]] section in frpc.toml instead of another systemd service.

ZeroTier: a Peer-to-Peer Network of Your Own Devices

ZeroTier joins your devices — the printer host, your phone, your laptop — into one virtual network, as if they were in the same room: each gets an internal IP where Mainsail opens as usual. The free plan covers 10 devices and 1 network (it used to be 25 devices — the cap was cut). A detailed Russian walkthrough with an Elegoo Neptune 3 Pro behind CGNAT is on 3DToday — 16.6k views since February 2024.

The Members list in the ZeroTier panel: authorization and assigned IP addresses
The my.zerotier.com panel: an Orange Pi running Klipper is authorized and got its internal address (screenshot from the 3DToday guide)

Caveats: network management lives in the zerotier.com cloud, while traffic between devices flows directly (P2P). When a direct connection can't punch through NAT, ZeroTier falls back to its relay servers — and those are exactly what Russian users have been complaining about since late 2025; on some mobile carriers (Megafon, Yota) the service is flaky. Bottom line: a great free option for personal use, but there's no public URL and stability depends on your carrier.

Obico: Monitoring with AI Failure Detection

Obico is a tunnel to your Mainsail/Fluidd/OctoPrint plus a mobile app and a neural network that catches spaghetti and pauses the print on its own. The free cloud plan: 1 printer, 10 AI hours, and 300 MB of tunnel traffic per month — enough to peek from work, not enough to keep the webcam open all day. AI Premium ($6.99/mo billed yearly) can't be paid with a Russian card — billing runs on Stripe. The self-hosted edition, however, is completely free with no caps — you can run it on the same VPS (4 GB RAM required, no GPU needed): the full walkthrough is in "Your Own 3D Printing Server: Obico and Manyfold on a VPS".

The Obico app: watching a print and AI monitoring from a phone
Obico: webcam, an AI failure-risk gauge, and pause-on-failure — right from your phone

Similar services: OctoEverywhere — free for up to 3 printers with unlimited remote access and Gadget AI monitoring, paid Supporter from $4.99/mo (also Stripe, so Russian cards won't work); it supports OctoPrint, Klipper, Mainsail, Fluidd, and even Elegoo OS. And the Russian EZH-Print — web access to Klipper/Moonraker printers with Telegram and VK notifications: currently a free 60-day beta with post-beta pricing not yet announced; the first review on 3DToday is cautiously positive.

Security: Why You Can't Just Open a Port

Back in 2018, SANS ISC researchers found 3,759 OctoPrint instances on Shodan sitting on the open internet with no password at all. The OctoPrint developers say it outright: putting OctoPrint onto the public internet is a terrible idea, and the Mainsail docs ask you not to open Mainsail/Moonraker ports to the world. The reason is blunt: an exposed Moonraker means arbitrary G-code (including heating the hotend and bed to their limits), swapped print files, edits to printer.cfg temperature limits, host shutdown, and a live view of your webcam.

Know your defaults, too: on stock MainsailOS, Moonraker listens on all interfaces (0.0.0.0:7125) and trusts every private subnet — any guest on your Wi-Fi gets the full API with no password. So the password on the tunnel (basic_auth from step 3) is mandatory, and it's worth enabling authorization in moonraker.conf:

ini
# moonraker.conf fragment
[authorization]
force_logins: True
trusted_clients:
    192.168.1.0/24
cors_domains:
    http://*.local
    http://*.lan

Tips and Common Mistakes

  • Make the frp token long: openssl rand -hex 32 — and never leave auth.token empty
  • Open only 80, 443, and 7000 in the VPS firewall — port 8080 stays internal, Caddy serves it
  • Create the domain's A record before starting Caddy — Let's Encrypt won't issue a certificate without it
  • localPort in frpc.toml must match the web UI port on the host: it's 80 on MainsailOS and FluiddPi
  • When something breaks, read the logs: journalctl -u frpc -f on the printer and journalctl -u frps -f on the VPS
  • frp channel encryption is on by default (since v0.50.0) — nothing extra to configure

Control from Your Phone

For Klipper there's Mobileraker — an actively maintained iOS/Android app (latest release May 2026): temperatures, axes, macros, webcam, emergency stop. On your home network it talks to Moonraker directly; from outside, point it at your tunnel: enter the https address from step 3 plus the basic_auth login in its connection settings. Push notifications are handled by the Mobileraker Companion component. Obico and OctoEverywhere ship their own apps, and OctoApp covers OctoPrint.

Mobileraker: a Klipper printer dashboard on a smartphone — temperatures and webcam
Mobileraker: the printer dashboard — temperatures, webcam, and axis control from a phone
Printer Hub partner

Your printer, in reach from anywhere

Remote access to Klipper and OctoPrint, AI print monitoring and your own model library — on a VPS from 172 ₽ for the first month.

  • NVMe drives
  • Anti-DDoS
  • 24/7 support
  • 🇷🇺 🇩🇪 🇳🇱 7 locations
Choose a VPS from 172 ₽

First month with the promo code, then from 429 ₽/mo — Promo plan: 2 GB RAM, 30 GB NVMe, backups included.

Buying via this link supports Printer Hub 🤝

FAQ

Sources