Part 1 - A Secure Tor Client Setup on Artix Linux (runit)

Introduction

Tor is often installed with the expectation of “anonymity by default”, but in practice most anonymity failures come from unclear scope and misconfiguration, not from Tor itself.

This post describes a correct, explicit Tor client setup on Artix Linux using runit. It is designed to provide anonymous network traffic for:

Traffic that is routed through Tor is anonymised at the network level. Traffic that is not routed through Tor is not anonymised.

This is intentional: anonymity should be explicit, auditable, and application-scoped, not implicit and fragile.


Threat Model and Scope

This setup assumes:

This setup does provide anonymous Tor traffic for:

This setup does not:


Installing Tor on Artix Linux (runit)

Install Tor from the official repositories:

sudo pacman -S tor

Enable the service under runit:

sudo ln -s /etc/runit/sv/tor /run/runit/service/

Verify that Tor is running:

sudo sv status tor

Minimal, Secure Tor Client Configuration

Below is a clean and auditable torrc suitable for a laptop or workstation acting as a Tor client.

User tor
DataDirectory /var/lib/tor

###############
# SOCKS Proxy #
###############

# Default SOCKS proxy (Tor Browser, general use)
SOCKSPort 127.0.0.1:9050

# Isolated SOCKS proxy for sensitive applications (e.g. Monero)
SOCKSPort 127.0.0.1:9062 IsolateClientAddr IsolateDestAddr

###############
# Controller  #
###############

# Required for Tor Browser / Nyx
ControlPort 127.0.0.1:9051

# Secure controller authentication
CookieAuthentication 1
CookieAuthFile /var/lib/tor/control_auth_cookie
CookieAuthFileGroupReadable 1

# Optional Unix control socket (also cookie-protected)
ControlSocket /var/lib/tor/control_socket
ControlSocketsGroupWritable 1

###############
# Client Auth #
###############

# Required for Tor v3 client authorization
ClientOnionAuthDir /var/lib/tor/onion_auth

###############
# Logging     #
###############

Log notice syslog

###############
# Safety      #
###############

# Client only (not a relay or exit)
ORPort 0
ExitRelay 0

# Explicitly disable transparent proxying
TransPort 0
DNSPort 0

What This Configuration Achieves

Anonymous Traffic (When Used Correctly)

Tor provides network-level anonymity:


SOCKS Isolation Explained

Multiple SOCKS ports only provide isolation when isolation flags are used.

This configuration:

SOCKSPort 127.0.0.1:9062 IsolateClientAddr IsolateDestAddr

ensures:

Without isolation flags, multiple SOCKS ports do not guarantee separation.


ControlPort and Security

The Tor ControlPort is required for:

The risk associated with the ControlPort is local, not network-level. If an attacker gains local control access, they may influence Tor behaviour.

This configuration mitigates that risk by:

If you do not use Tor Browser or controller tools, the entire controller section may be omitted.


Firewall Considerations

For a Tor client:

Tor initiates all network connections itself. No ports need to be opened.


Verifying the Setup

Validate the configuration before restarting Tor:

sudo tor --verify-config -f /etc/tor/torrc

Restart Tor:

sudo sv restart tor

Confirm listening ports:

ss -ltnp | egrep '9050|9051|9062'

Test Tor connectivity:

curl --socks5-hostname 127.0.0.1:9050 https://check.torproject.org

What This Setup Does Not Do

This configuration does not:

It provides a correct, explicit Tor client foundation:


Summary

This setup is intended to be understood, not blindly copied.

In the next post, this Tor client foundation is used to run a private Monero remote node over Tor, secured with Tor v3 client authorization.