Port Forwarding

Private services. On your own machine.

A forward borrows a port on your computer and pipes it, over the SSH connection you already have, to something running on the server. No port is opened, no firewall rule changes, and nothing is exposed to the internet.

How It Works

How it works

Step 01 - You

Pick.

Connect a server and a Port Forwarding tab appears in the sidebar. Click Forward and choose by outcome, not by flag: reach something on the server, share something on your machine, or route your browser through the box. Each one shows you where the traffic actually goes.

Step 02 - You

Point.

Name it, then fill in two ports: the one to open on your machine, and the one to reach on the other side. Click a service chip and the standard port fills itself in. The exact ssh command CtrlOps will run updates as you type, so a swapped pair is visible before you commit to it.

Step 03 - CtrlOps

Prove.

Test connection opens the tunnel and checks the far side answers, then tells you which side is wrong when it does not. Save it and it is a named row you start with one click, today and every morning after. Stop it and the access is gone, with nothing left to clean up.

The five ways to reach it

Four of these leave something behind.

Reaching a private service is easy. Reaching it without quietly adding to the list of things somebody has to clean up later is the part that goes wrong.

Ways to reach a private service on a Linux server, compared by effort, exposure and what each one leaves behind
How you do itWhat it costs youWho else can reach itWhat it leaves behind
Open the port to the internetA firewall rule, and a security groupEveryone can reach it, not just youAn open port, until somebody remembers to close it
Allowlist your home IPThe same rule, edited every time your IP movesStill exposed to anyone sharing that addressA stale rule for an IP you gave up months ago
Stand up a VPNA server, a client on every laptop, and accountsAccess to a whole network, for one dashboardInfrastructure you now maintain and pay for
Run ssh -L by handRecall the flag, the order, and both portsLow, but the command lives in your shell historyA terminal window you cannot close
A saved forward in CtrlOpsFill two fields once, then click StartThe port is on your machine, bound to loopbackNothing. It closes when you disconnect

The fourth row is not wrong, and plenty of good engineers live there. It is just the one where the tunnel is folklore: a command in somebody history, a terminal nobody can close, and no way to tell at a glance what is currently open.

Go on, drive it

This is the Port Forwarding tab. Nothing here is a video.

A working replica of the panel, with the same guards the real one has, including the one that tells you your own laptop is the thing holding the port.

Interactive SSH port forwarding demo
ctrlops - port forwarding · ubuntu@203.0.113.170 active
Database0/1 active
Payments database
6543 to 127.0.0.1:5432
Your browser
Start a forward, then open it here.
Why this beats opening a port

Access that expires on its own.

The reason to reach for a forward is not that it is quicker. It is that it is the smallest thing you can grant, and the only one on the list that cleans up after itself.

Scope

One port, not a network

A forward carries exactly the port you named. Not the subnet, not the other services on the box, not anything you did not ask for. Compare that with a VPN credential, which is access to everything the network can see, handed out because somebody needed one dashboard.

Identity

Bound to one person key

The tunnel rides your SSH connection, so it inherits your identity and your authorisation. There is no second credential to create, share, rotate or leak, and revoking somebody SSH key revokes their forwards along with everything else in the same motion.

Lifetime

It ends by itself

Close the forward, or just disconnect, and the access is gone. Nothing stays listening, no rule is left in a firewall for somebody to find in six months, and there is no cleanup step that gets skipped. The access existed only while somebody was actually using it.

None of this is a CtrlOps invention. It is how SSH forwarding has always worked, and it is why the answer to "can you give me access to the database" was always a tunnel rather than a password. CtrlOps makes it a thing you keep instead of a thing you retype.

When it earns its place

The moments this actually saves you.

Not a feature list. The times something you need is running on a server and is deliberately unreachable from where you are sitting.

The production database is not reachable from my laptop.

Open production Postgres in your own SQL client, as if it ran locally

It is bound to the server loopback, which is exactly right and exactly why you cannot reach it. A local forward opens that port on your machine instead, so TablePlus, DBeaver or pgAdmin connect to 127.0.0.1 and never learn that SSH was involved.

  • Chips prefill the MySQL and Postgres ports
  • Your own client, not a web console
  • The server keeps listening on loopback

Just deploy it somewhere so I can show you.

Share the app running on your laptop with the server network

A remote forward runs the tunnel the other way, so a teammate on that network opens a port and reaches the branch you have not pushed yet. It is also how a webhook from a provider that cannot see your laptop arrives on it anyway.

  • No deploy, no public URL
  • Receive a webhook locally
  • Binds to the server loopback by default

That command is in three people shell histories and one stale wiki page.

Every tunnel you use, named and grouped in one list

Saved once, a forward stops being folklore somebody has to remember and becomes a row anybody new can find. Start it, copy its command back out, edit it or delete it from the row, and read at a glance which of them are running.

  • Grouped, searchable, counted per group
  • Start, copy, edit or delete from the row
  • Or paste an ssh command in to create one
What this is, and is not

A tunnel you keep, not a network you join.

This is the honest version of the boundary. Port Forwarding is where you reach one thing, deliberately, for as long as you need it. It is not a replacement for a VPN, it is not always-on, and it never claims to be either.

What it does

  • Opens a port on your machine that reaches a service behind the server firewall.
  • Publishes something running on your machine to the server network.
  • Runs a SOCKS5 proxy so your browser behaves as if it were on the server.
  • Saves each tunnel with a name and a group, and starts or stops it in one click.
  • Tests a forward before you save it, and says which side failed when it does.
  • Imports a raw ssh -L, -R or -D command you already have.

What it does not

  • It does not reconnect itselfA forward lives on the SSH connection underneath it. If that connection drops, because the network changed or the server went away, the tunnel goes with it and nothing retries. You reconnect and click Start. If you need a tunnel that survives on its own, that is what autossh and a systemd unit are for.
  • It is not a VPNOne port, for one person, for as long as the tunnel is up. There is no network-wide routing, no split tunnelling, and nothing a whole team shares. When a team genuinely needs broad access to a whole private network, use Tailscale, WireGuard, or your cloud provider VPN.
  • It does not give you a public URLA remote forward reaches the server own network, not the internet. Nobody outside gets a link. If what you want is a shareable https address pointing at your laptop, that is ngrok or Cloudflare Tunnel, and it is a different trade with a different threat model.
  • It does not start the serviceA forward carries traffic to something. If nothing is listening on the far side, the tunnel is fine and the far side is not. Check the process is actually running from the PM2 tab or the AI Terminal before you blame the forward.

It runs over the SSH connection you already have, so nothing is installed on the server and nothing is opened on it. A remote forward binds to the server own loopback, and widening that needs GatewayPorts in sshd_config, which is a deliberate server-side decision. See how CtrlOps handles SSH, or the Port Forwarding documentation for every control in detail.

FAQ

Questions people ask before opening a tunnel.

Connect to the server in CtrlOps, open the Port Forwarding tab, and click Forward. Choose Reach something (Local), then set Listen on to a free port on your machine and Remote host to the address and port the database listens on. Click Test connection, save the forward, and start it. Your SQL client then connects to localhost on the port you chose, and the traffic travels inside the SSH connection.
No, and that is the point of it. A forward travels inside the SSH connection you already have, so the database or dashboard keeps listening only on the server own loopback address. There is no new firewall rule, no public port, and nothing for a scanner on the internet to find.
Local brings something on the server to your machine, so you reach a service behind the server firewall as if it ran locally. Remote does the opposite and publishes something running on your machine to the server network, with no deploy and no public URL. Dynamic starts a SOCKS5 proxy, so your whole browser behaves as if it were sitting on the server. CtrlOps labels the three Reach something, Share something, and Browse through, so you pick by outcome rather than by flag.
Yes, that is the usual reason to create one. Once the forward is running, tools like TablePlus, DBeaver, pgAdmin, or MySQL Workbench connect to 127.0.0.1 on the port you chose, exactly as if the database were installed on your machine. The client does not need to know anything about SSH, because CtrlOps is holding the tunnel open.
Yes. Click Import in the Port Forwarding toolbar and paste the command. CtrlOps parses the flag, the ports, the remote host, and the destination, and turns it into a saved forward you can name, group, and start from the list. A tunnel that lived in three people shell histories becomes one row anybody can find.
For reaching a specific service, yes, and it is a smaller thing to grant. A forward gives you the one port you actually need, over a connection you already trust, with no client to install and no network-wide access handed out. A VPN is still the right tool when a whole team needs broad access to a whole network rather than one person needing one service.
The tunnel closes with the connection. A forward is a channel inside your SSH session, not a change to the server, so nothing is left listening and nothing has to be cleaned up. Nothing reconnects it for you either: if the SSH connection drops, the forward drops with it and you start it again. Your saved forwards stay in the list.
No. The forwarded port opens on your own machine, bound to 127.0.0.1 by default, so only your computer can reach it. The server publishes nothing new. A remote forward binds to the server own loopback for the same reason, and widening that needs GatewayPorts in the server sshd configuration, which is a deliberate server-side decision rather than something CtrlOps turns on for you.
Stop retyping that command

Your private services, one click away.

Save every tunnel you use as a named forward, test it before you trust it, and start it without opening a terminal. Free for a month, no credit card.

Windows

✓ Start instantly·✓ No credit card·✓ No sneaky autorenewals