Part 2 - Running a Private Monero Remote Node over Tor (with Client Authorization)
Introduction
Many Monero users either connect their wallets to public remote nodes or run a full node on every machine they own. Both approaches are unnecessary and come with real privacy and operational downsides.
Public nodes can:
- log metadata
- selectively censor requests
- correlate wallet activity
Running multiple full nodes:
- wastes disk space
- increases maintenance
- encourages poor security shortcuts
This post shows how to run one authoritative Monero node on a workstation and access it securely from a laptop over Tor, without exposing RPC to the LAN or clearnet, and without trusting third parties.
Access to the node is cryptographically restricted using Tor v3 client authorization.
Prerequisite:
This post assumes you already have a working Tor client as described in
“A Secure Tor Client Setup on Artix Linux (runit)”.
If not, read that first.
Threat Model and Scope
This setup is designed to protect against:
- Public RPC exposure
- ISP or network-level observation
- Malicious or logging public nodes
- Accidental LAN access
- Unauthorized clients connecting to your node
This setup does not protect against:
- A compromised workstation or laptop
- Malware stealing wallet keys
- Physical access attacks
- Poor wallet operational hygiene
The goal is private, authenticated access to your own Monero node — not absolute anonymity.
Architecture Overview
Workstation (Node Host)
- Runs
monerod - Stores the full blockchain
- RPC bound to
127.0.0.1only - Exposes RPC via a Tor v3 hidden service
- Enforces client authorization at the Tor layer
Laptop (Wallet Client)
- Runs Monero GUI (primary) or CLI (optional)
- Stores no blockchain
- Connects to the node over Tor SOCKS
- Authenticates using Tor client authorization
Laptop (wallet)
|
| Tor SOCKS + client auth
v
Tor Network
|
v
Workstation (monerod)
RPC: 127.0.0.1:18081
Workstation: Monero Node Setup
Install Monero:
sudo pacman -S moneroCreate a dedicated data directory:
sudo mkdir -p /var/lib/monero
sudo chown monero:monero /var/lib/monero
sudo chmod 700 /var/lib/moneroExample monerod.conf:
data-dir=/var/lib/monero
rpc-bind-ip=127.0.0.1
rpc-bind-port=18081
restricted-rpc=1
confirm-external-bind=1Run monerod as a service (Artix/runit users can adapt
this to their setup).
Verify locally:
ss -ltnp | grep 18081You should only see 127.0.0.1:18081.
Workstation: Tor Hidden Service for RPC
Edit /etc/tor/torrc on the workstation and add:
HiddenServiceDir /var/lib/tor/monero-rpc
HiddenServiceVersion 3
HiddenServicePort 18081 127.0.0.1:18081Restart Tor:
sudo sv restart torRetrieve the onion address:
sudo cat /var/lib/tor/monero-rpc/hostnameAt this stage, the service is reachable over Tor, but not yet access-controlled.
Laptop: Wallet as a Thin Client
Monero GUI (Primary)
In Settings → Node:
- Enable Remote node
- Address:
<your-onion-address> - Port:
18081 - SOCKS proxy IP:
127.0.0.1 - SOCKS proxy port:
9062(isolated port from Post 1) - Enable Trusted daemon
Restart the GUI after applying changes.
Monero CLI (Optional)
monero-wallet-cli \
--daemon-address <your-onion-address>:18081 \
--proxy 127.0.0.1:9062 \
--trusted-daemonThe laptop will not download the blockchain. Any “syncing” shown is wallet scanning, not node synchronization.
Why Onion Addresses Are Not Access Control
An onion address identifies a service — it does not authenticate clients.
If someone obtains the onion address:
- they can attempt connections
- they can brute-force RPC credentials
- they can consume resources
RPC usernames and passwords provide weak protection and operate after the connection is established.
Proper access control must happen at the Tor layer,
before traffic reaches monerod.
Tor v3 Client Authorization
Tor v3 client authorization restricts access using public-key cryptography.
- The hidden service maintains an allow-list of client public keys
- Clients present a corresponding private key
- Unauthorized clients are silently dropped
monerodnever sees unauthorized traffic
This is strong, clean access control.
Implementing Client Authorization
Workstation: Authorize the Laptop
Generate a client keypair and create an authorization file in:
/var/lib/tor/monero-rpc/authorized_clients/The file format is:
descriptor:x25519:<client-public-key>
Restart Tor after adding the file.
Laptop: Install the Client Key
Ensure the client auth directory exists:
sudo mkdir -p /var/lib/tor/onion_auth
sudo chown tor:tor /var/lib/tor/onion_auth
sudo chmod 700 /var/lib/tor/onion_authInstall the client key in:
/var/lib/tor/onion_auth/<name>.auth_privateRestart Tor on the laptop:
sudo sv restart torVerification and Enforcement
Test access from the laptop:
curl --socks5-hostname 127.0.0.1:9062 \
http://<your-onion-address>:18081/get_infoYou should receive JSON output.
Remove the client key temporarily and restart Tor. The connection should now fail.
Restore the key and restart Tor again. Access should return.
Operational Notes
- Back up the client authorization key securely
- Adding another client repeats the same process
- Revoking access is as simple as removing the server-side auth file
- Tor or Monero restarts do not affect authorization
- If the workstation is offline, wallets cannot connect
What This Setup Does Not Do
This setup does not:
- Make Monero perfectly anonymous
- Protect against compromised wallets
- Replace good key management
- Eliminate the need for operational discipline
It provides private, authenticated access to your own node — nothing more and nothing less.
Summary
- One authoritative Monero node
- No public RPC exposure
- No duplicated blockchain
- Tor-only transport
- Cryptographically enforced access control
This approach is simple, robust, and scales cleanly if you later add more authorized clients.