Reaching the console from elsewhere

The console listens on 127.0.0.1:8092 — this host and nothing else. That is deliberate: an admin interface hung directly on the public internet becomes a door somebody can take their time with.

So opening it from another machine means choosing a route first. Neither route needs port 8092 opened in your firewall.

SSH tunnelReverse proxy
Configuration neededNone at allYes, plus a service restart
Who can reach itYou, and only with SSH accessAnyone who can reach that URL
What you needAn SSH accountA domain, a certificate, Apache or nginx
SuitsOccasional checks, one personSeveral people, day to day, from a phone
Cost of getting it wrongIt does not connectYour admin interface is public

⭐ If you are unsure, take the tunnel. It makes you prove you can get into the host every single time, so getting it wrong means "cannot connect", not "somebody else connected".

1. SSH tunnel: borrow the remote 8092 onto your own machine

This changes nothing on the host. It opens one more channel inside your SSH session: you connect to 127.0.0.1:8092 on your own machine, the traffic travels through SSH and arrives at the host's own 127.0.0.1 — so as far as the console is concerned, this is a local connection.

Linux, macOS, and the ssh that ships with Windows

ssh -L 8092:127.0.0.1:8092 you@your-host

Leave that window open, then in a browser:

http://127.0.0.1:8092

Close the window and the tunnel is gone. That is exactly what makes it safe: nothing was left behind.

If 8092 is already taken on your own machine

Change the left-hand number only. The right-hand side is the port on the host:

ssh -L 18092:127.0.0.1:8092 you@your-host

Then open http://127.0.0.1:18092.

PuTTY

Before connecting, go to Connection → SSH → Tunnels:

Without the Add click nothing is applied. It is the step most people miss.

⚠️ Synology DSM is different. The package writes listen_addr = 0.0.0.0:8092, because Package Center's Open button has to be able to reach it. In other words the console on DSM is already open to your whole local network. What you usually want on DSM is not to open it but to narrow it: choose "This machine only" under Console access on the console's settings page, or run svrguard console-listen lan on the host to allow private networks only (every connection from the internet is refused; the settings page prints the full command for that host). After "This machine only", only a tunnel or a reverse proxy gets in — and the Open button stops working.

Connected, but no login page?

Where the configuration file lives, how to edit it and how to restart afterwards are on the settings page.

2. Reverse proxy: give it a URL

For several people using it day to day, or to read it on a phone, put the console behind your own Apache or nginx and let that handle HTTPS and access control.

On the console side there is one thing to set — and possibly nothing at all:

[web]
listen_addr = 127.0.0.1:8092   ; stay local, so the proxy is the only way in
base_path = /agent             ; only when mounting under a sub-path

On its own subdomain (https://guard.example.com/), leave base_path out. Set it only when sharing a domain with something else, under https://example.com/agent.

⚠️ Restart the service afterwards. The configuration file is read once, at start-up.

Apache

<VirtualHost *:443>
    ServerName guard.example.com
    # certificate directives omitted

    # Worth keeping — see "How the source address is decided" below
    RequestHeader unset X-Forwarded-For

    ProxyPreserveHost On
    ProxyPass        / http://127.0.0.1:8092/
    ProxyPassReverse / http://127.0.0.1:8092/
</VirtualHost>

Under a sub-path (with base_path = /agent in the file):

ProxyPass        /agent http://127.0.0.1:8092/agent
ProxyPassReverse /agent http://127.0.0.1:8092/agent

nginx

server {
    listen 443 ssl;
    server_name guard.example.com;
    # certificate directives omitted

    location / {
        proxy_pass http://127.0.0.1:8092;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        # ⛔ $remote_addr, NOT $proxy_add_x_forwarded_for
        proxy_set_header X-Forwarded-For   $remote_addr;
    }
}

How the source address is decided (and why the proxy belongs on the same host)

The console has to be able to say who signed in, and its sign-in lockout counts per source address: ten failures from one address within fifteen minutes and it locks. So where a request came from cannot be something the caller gets to declare.

It decides in two steps:

⚠️ A proxy on another machine makes everyone look like the proxy. That is not a security problem — the lockout gets stricter, never weaker — but every audit entry will carry the proxy's address, and one person locking themselves out affects everybody. To see real source addresses, keep the proxy on the same host as the console.

One line in each configuration above is worth keeping: it leaves the header clean and makes the result predictable when more than one proxy is involved.

Three more

Checking you did not expose it by accident

On the host:

ss -ltnp | grep 8092

Read the address on the left:

⭐ Reading the configuration file is not enough. The file says what it will listen on next time it starts; ss says what it is listening on now. Edit without restarting and the two disagree.

Host not linked to an account yet?

Hosts with no browser can be paired from the command line. The steps are on the Get Started page.

Pair from the command line →