Tor Only VPS (IPv6)

  • Fix DNS Resolution
sudo bash -c 'echo -e "nameserver 2606:4700:4700::1111\nnameserver 1.1.1.1" > /etc/resolv.conf'

  • Install and Configure Tor

Creating a Swap File

  • May help if tor can’t bootstrap
sudo fallocate -l 500M /swapfile  
sudo chmod 600 /swapfile             
sudo mkswap /swapfile 
sudo swapon /swapfile  
  • nano /etc/fstab
/swapfile none swap sw 0 0

sudo apt update && sudo apt install tor torsocks -y
  • Edit /etc/tor/torrc:
# Enable IPv6-only operation
ClientUseIPv4 0
ClientPreferIPv6ORPort 1

# Logging
#Log notice stdout

# Hidden SSH service
HiddenServiceDir /var/lib/tor/hidden_ssh/
HiddenServicePort 6666 127.0.0.1:22
  • Apply and restart:
sudo systemctl restart tor
sudo journalctl -u tor -f

  • Grab your .onion:
sudo cat /var/lib/tor/hidden_ssh/hostname

  • OpenSSH Configuration (Optional Harden)

    • Edit /etc/ssh/sshd_config:
Port 22
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
  • Then:
sudo systemctl restart ssh
  • Connect Over Tor

    • From your local machine:
torsocks ssh -p 6666 root@your.onion

# Or
TORSOCKS_LOG_LEVEL=5 torsocks ssh -vvv -p 6666 root@your.onion
  • Example .ssh/config
Host tor-vps
    HostName YOUR_ONION_ADDRESS # REPLACE WITH YOUR ONION ADDRESS
    Port 6666
    User debian # CHANGE ME
    ProxyCommand torsocks -P 9050 nc %h %p
    LogLevel DEBUG3
    IdentityFile ~/.ssh/id_rsa

Enable HTTPS

sudo apt update
sudo apt install lighttpd openssl

# Enable the mod_openssl module:
sudo lighty-enable-mod ssl
service lighttpd force-reload
  • NOTE: YOUR_ONION_ADDRESS
# Install Caddy (has easy TLS support)
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
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

# Create self-signed cert for your .onion (replace YOUR_ONION_ADDRESS)
mkdir -p /etc/caddy/certs
cd /etc/caddy/certs
openssl req -x509 -newkey rsa:4096 -sha256 -days 365 \
  -nodes -keyout your_onion.key -out your_onion.crt \
  -subj "/CN=YOUR_ONION_ADDRESS.onion" \
  -addext "subjectAltName=DNS:YOUR_ONION_ADDRESS.onion"

# Create Caddyfile
cat <<EOF | sudo tee /etc/caddy/Caddyfile
YOUR_ONION_ADDRESS.onion:443 {
  tls /etc/caddy/certs/your_onion.crt /etc/caddy/certs/your_onion.key
  reverse_proxy 127.0.0.1:80
}
EOF

# Restart Caddy
sudo systemctl restart caddy

sudo mkdir -p /etc/caddy/certs
cd /etc/caddy/certs
sudo openssl req -x509 -newkey rsa:4096 -sha256 -days 365 \
  -nodes -keyout YOUR_ONION_ADDRESS.key -out YOUR_ONION_ADDRESS.crt \
  -subj "/CN=YOUR_ONION_ADDRESS" \
  -addext "subjectAltName=DNS:YOUR_ONION_ADDRESS/"
  
  YOUR_ONION_ADDRESS:443 {
  tls /etc/caddy/certs/your_onion.crt /etc/caddy/certs/YOUR_ONION_ADDRESS.key
  reverse_proxy 127.0.0.1:80
}


sudo chown root:caddy /etc/caddy/certs/*onion.*
sudo chmod 640 /etc/caddy/certs/*onion.*
  • Finally edit torrc configuration
HiddenServicePort 443 127.0.0.1:443
  • Restart Services
systemctl tor restart
service lighttpd force-reload