🧷 Introduzione
Questa guida è il primo step di un progetto modulare orientato alla costruzione di un’infrastruttura mail completamente privata e operativa esclusivamente su rete Tor. L’obiettivo è fornire un ambiente SMTP/IMAP accessibile solo tramite Hidden Service .onion, con RainLoop come interfaccia webmail leggera e funzionale, il tutto servito da Nginx.
Lo scenario è quello di un mail server totalmente isolato dalla clearnet, progettato per inviare e ricevere email tra utenti locali, in un contesto di sicurezza, anonimato e controllo assoluto dell’infrastruttura.
🎯 Obiettivo della Parte 1
Installare e configurare un Mail Server Tor-Based in grado di:
- Ricevere e inviare email solo tra account interni @.onion
- Offrire accesso alla webmail solo tramite rete Tor
- Non esporre alcun servizio alla rete pubblica
- Restare leggero, modulare e facilmente estendibile
🔬 Requisiti minimi (POC)
Questa configurazione è stata testata su una VM Debian 12 con:
- 1 vCPU, 1GB RAM, 10GB storage (NVMe)
- Hypervisor: Proxmox VE (ma può essere replicata anche con VMware / VirtualBox)
- Accesso solo tramite VPN interna o Tor Hidden Service
Non sono richiesti IP pubblici, DNS o configurazioni router: il servizio è pubblicato nativamente su Tor.
📌 Nota In questa fase non verranno trattati aspetti di sicurezza avanzata o comunicazioni tra server .onion esterni. Questi temi verranno approfonditi nelle prossime guide, esclusivamente per finalità didattiche e tecniche. Ogni utilizzo improprio o in violazione di normative è sotto esclusiva responsabilità dell’utente.
🔐 1. Generazione dominio .onion personalizzato
🎯 Creazione un Vanity Address .onion
apt update && apt upgrade -y
apt install -y build-essential libssl-dev htop psmisc gcc libc6-dev libsodium-dev make autoconf sudo swaks
git clone https://github.com/cathugger/mkp224o.git
cd mkp224o
./autogen.sh
./configure
make
./mkp224o -d StealthMailKey Stealt
⚙️ 2. Installazione pacchetti base
apt install -y htop gnupg wget apt-transport-https
wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | tee /usr/share/keyrings/deb.torproject.org-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/deb.torproject.org-keyring.gpg] https://deb.torproject.org/torproject.org bookworm main" | tee /etc/apt/sources.list.d/tor.list
echo "deb-src [signed-by=/usr/share/keyrings/deb.torproject.org-keyring.gpg] https://deb.torproject.org/torproject.org bookworm main" | tee -a /etc/apt/sources.list.d/tor.list
apt update
apt install -y tor deb.torproject.org-keyring
systemctl enable tor --now
apt install sudo nginx php php-fpm php-mbstring php-intl php-xml php-common php-curl php-zip php-gd php-imap php-cli php-bcmath postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-sieve dovecot-managesieved unzip swaks -y
🌐 3. Configurazione Hidden Service Tor
mkdir -p /var/lib/tor/mailserver/
cp /root/mkp224o/StealthMailKey/stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion/* /var/lib/tor/mailserver/
chown -R debian-tor:debian-tor /var/lib/tor/mailserver/
chmod 700 /var/lib/tor/mailserver/
cat <<EOF >> /etc/tor/torrc
HiddenServiceDir /var/lib/tor/mailserver/
HiddenServicePort 80 127.0.0.1:80
HiddenServicePort 25 127.0.0.1:25
HiddenServicePort 143 127.0.0.1:143
HiddenServicePort 993 127.0.0.1:993
EOF
systemctl restart tor
cat /var/lib/tor/mailserver/hostname
📌 Nota sull’approccio ai file di configurazione
Per facilitare la lettura e rendere la guida più efficace, ho scelto di riportare i file di configurazione senza i commenti originali. Vengono mostrate solo le direttive realmente necessarie all’operatività del sistema, evitando elementi superflui.
È una scelta deliberata: consente di focalizzarsi sulle impostazioni cruciali e riduce il rumore durante l’analisi tecnica.
Detto questo, in ambienti di produzione è fortemente consigliato mantenere i commenti, sia per una migliore comprensione delle opzioni configurabili, sia per agevolare troubleshooting e manutenzione nel tempo.
Qui si è preferito un approccio essenziale, pensato per chi ha bisogno di una configurazione chiara, funzionale e facilmente replicabile.
✉️ 4. Configurazione Postfix (SMTP)
📤 /etc/postfix/transport
– Regole di inoltro SMTP
echo "" > /etc/postfix/transport
cat <<EOF >> /etc/postfix/transport
stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion local:
.onion smtp:[127.0.0.1]:25
* error:5.7.1 Relay access denied
EOF
⚙️ /etc/postfix/main.cf
– Configurazione principale di Postfix
echo "" > /etc/postfix/main.cf
cat <<EOF >> /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 3.6
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level = may
smtp_tls_CApath = /etc/ssl/certs
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = StealthMail
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = localhost, stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion
home_mailbox = Maildir/
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
disable_dns_lookups = yes
transport_maps = hash:/etc/postfix/transport
EOF
🧩 /etc/postfix/master.cf
– Servizi gestiti da Postfix
echo "" > /etc/postfix/master.cf
cat <<EOF >> /etc/postfix/master.cf
smtp inet n - y - - smtpd
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
pickup unix n - y 60 1 pickup
cleanup unix n - y - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - y 1000? 1 tlsmgr
rewrite unix - - y - - trivial-rewrite
bounce unix - - y - 0 bounce
defer unix - - y - 0 bounce
trace unix - - y - 0 bounce
verify unix - - y - 1 verify
flush unix n - y 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - y - - smtp
relay unix - - y - - smtp
-o syslog_name=postfix/$service_name
showq unix n - y - - showq
error unix - - y - - error
retry unix - - y - - error
discard unix - - y - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - y - - lmtp
anvil unix - - y - 1 anvil
scache unix - - y - 1 scache
postlog unix-dgram n - n - 1 postlogd
maildrop unix - n n - - pipe
flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp unix - n n - - pipe
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail unix - n n - - pipe
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp unix - n n - - pipe
flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix - n n - 2 pipe
flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman unix - n n - - pipe
flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
smtpd pass - - n - - smtpd
-o smtpd_sasl_auth_enable=yes
EOF
📥 5. Configurazione Dovecot (IMAP)
🔐 /etc/dovecot/conf.d/10-auth.conf
– Autenticazione utenti
echo "" > /etc/dovecot/conf.d/10-auth.conf
cat <<EOF >> /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext
auth_username_format = %u
EOF
🛠️ /etc/dovecot/conf.d/10-master.conf
– Socket e servizi interni
echo "" > /etc/dovecot/conf.d/10-master.conf
cat <<EOF >> /etc/dovecot/conf.d/10-master.conf
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0666
user = www-data
group = www-data
}
}
EOF
📁 /etc/dovecot/conf.d/10-mail.conf
– Struttura caselle e storage
echo "" > /etc/dovecot/conf.d/10-mail.conf
cat <<EOF >> /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
namespace inbox {
inbox = yes
}
mail_privileged_group = mail
mail_fsync = optimized
lock_method = fcntl
protocol !indexer-worker {
}
auth_username_format = %u
EOF
📋 /etc/dovecot/conf.d/10-logging.conf
– Log di sistema
echo "" > /etc/dovecot/conf.d/10-logging.conf
cat <<EOF >> /etc/dovecot/conf.d/10-logging.conf
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
plugin {
}
EOF
⚙️ /etc/dovecot/dovecot.conf
– Configurazione globale Dovecot
echo "" > /etc/dovecot/dovecot.conf
cat <<EOF >> /etc/dovecot/dovecot.conf
!include_try /usr/share/dovecot/protocols.d/*.protocol
dict {
}
!include conf.d/*.conf
!include_try local.conf
!include_try /usr/share/dovecot/protocols.d/*.protocol
listen = 127.0.0.1
!include conf.d/*.conf
!include_try local.conf
EOF
🧾 /etc/dovecot/conf.d/auth-system.conf.ext
– Backend autenticazione
echo "" > /etc/dovecot/conf.d/auth-system.conf.ext
cat <<EOF >> /etc/dovecot/conf.d/auth-system.conf.ext
passdb {
driver = pam
args = dovecot
}
userdb {
driver = passwd
}
EOF
🔒 /etc/pam.d/dovecot
– Modulo PAM per Dovecot
echo "" > /etc/pam.d/dovecot
cat <<EOF >> /etc/pam.d/dovecot
#%PAM-1.0
@include common-auth
@include common-account
@include common-session
EOF
🔄 Riavvio finale dei servizi
Dopo aver completato la configurazione, riavvia tutti i servizi coinvolti per applicare le modifiche:
systemctl restart postfix dovecot nginx php8.2-fpm tor
Verifica che ciascun servizio sia attivo e funzionante:
systemctl status postfix dovecot nginx php8.2-fpm tor
👤 6. Creazione utenti mail
✅ Utente di test per verifica funzionalità IMAP (facoltativo ma consigliato durante la fase di setup):
useradd -m testimap
passwd testimap
mkdir -p /home/testimap/Maildir
chown -R testimap:testimap /home/testimap/Maildir
sudo -u testimap maildirmake.dovecot /home/testimap/Maildir
# 1. Crea l'utente
useradd -m testimap2
passwd testimap2
# 2. Crea correttamente la Maildir per Dovecot
sudo -u testimap2 maildirmake.dovecot /home/testimap2/Maildir
# 3. (Facoltativo) Verifica la struttura
ls -l /home/testimap2/Maildir
# Output atteso:
# cur/ new/ tmp/
# 4. (Assicurati dei permessi, se necessario)
chown -R testimap2:testimap2 /home/testimap2/Maildir
🧱 Crezione nuovi utenti mail:
# Crea un nuovo utente con Maildir e password
useradd -m NOMEUTENTE
passwd NOMEUTENTE
# Crea la struttura Maildir corretta
sudo -u NOMEUTENTE maildirmake.dovecot /home/NOMEUTENTE/Maildir
# Imposta permessi
chown -R NOMEUTENTE:NOMEUTENTE /home/NOMEUTENTE/Maildir
📥 Test SMTP porta 587 (submission)
sudo -u www-data swaks \
--to testimap@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion \
--from testimap@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion \
--server 127.0.0.1:587 \
--auth LOGIN \
--auth-user testimap \
--auth-password testimap \
--tls
sudo -u www-data swaks \
--to testimap2@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion \
--from testimap2@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion \
--server 127.0.0.1:587 \
--auth LOGIN \
--auth-user testimap2 \
--auth-password testimap2 \
--tls
🔐 Test IMAP con STARTTLS (porta 143)
Verifica che Dovecot risponda correttamente e accetti login:
openssl s_client -connect 127.0.0.1:143 -starttls imap -crlf
Quando sei connesso, digita (seguito da INVIO
):
a1 LOGIN testimap testimap
a2 LIST "" "*"
Se tutto è configurato correttamente, otterrai:
a1 OK Logged in
* LIST (\HasNoChildren) "." INBOX
a2 OK List completed
🔌 Disattiva Apache se attivo, per evitare conflitti sulla porta 80:
systemctl disable --now apache2
🧩 Step 1 – Scaricare RainLoop
mkdir -p /var/www/rainloop
cd /var/www/rainloop
curl -sL https://repository.rainloop.net/installer.php | php
🛡️ Step 2 – Assegnazione Permessi
chown -R www-data:www-data /var/www/rainloop
chmod -R 755 /var/www/rainloop
🌐 Step 3 – Creazione Virtual Host Nginx
cat <<'EOF' > /etc/nginx/sites-available/rainloop
server {
listen 80;
server_name stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion;
root /var/www/rainloop;
index index.php index.html;
access_log /var/log/nginx/rainloop_access.log;
error_log /var/log/nginx/rainloop_error.log;
# BLOCCA accesso alla cartella /data (importantissimo)
location ~ ^/data {
deny all;
return 403;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
EOF
🔗 Step 4 – Abilitazione Vhost e reload Nginx
ln -s /etc/nginx/sites-available/rainloop /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Quando hai fatto, apri il browser Tor e vai su:
http://stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion/?admin
Credenziali di default:
Password: 12345
Username: admin
🔐 Sicurezza dell’Accesso Admin in RainLoop
Dopo l’installazione, RainLoop utilizza credenziali predefinite per l’accesso all’interfaccia di amministrazione (/?admin
). Per evitare accessi non autorizzati, segui questi passaggi:
- Login all’interfaccia di amministrazione:
- URL:
http://stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion/?admin
- Username:
mailadmin
- Password:
Stealth!2025_secure
- URL:
- Cambia immediatamente queste credenziali:
- Vai su Security → Change Admin Credentials.
- Scegli un nome utente non prevedibile (es.
mxmgr874
). - Imposta una password complessa, almeno 12 caratteri con lettere, numeri e simboli.
RainLoop sarà così pronto per l’uso in modo sicuro e accessibile solo tramite rete Tor.
✉️ Configurazione dominio in RainLoop
Una volta effettuato il primo accesso all’interfaccia admin di RainLoop, è necessario configurare il dominio .onion
per abilitare l’invio e la ricezione delle email tramite il tuo server Tor locale.
Vai su Domains e clicca su Add Domain, quindi inserisci i seguenti parametri:
📝 Parametri consigliati:
- Name:
stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion
(Questo abilita l’uso di email tipoutente@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion
)
📥 IMAP Settings
- IMAP Server:
127.0.0.1
- Port:
143
- Secure:
STARTTLS
📤 SMTP Settings
- SMTP Server:
127.0.0.1
- Port:
587
- Secure:
STARTTLS
- Authentication: ✅ Abilitato
👤 Opzioni utente
- Use short login: ✅ Abilitato
(Usatestimap
invece ditestimap@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion
)

✅ Test dell’infrastruttura email tramite RainLoop
Ora che il dominio .onion
è stato correttamente configurato nell’interfaccia admin di RainLoop, possiamo procedere con i primi test funzionali utilizzando gli account di esempio creati in precedenza.
Per testare l’invio e la ricezione di email in ambiente Tor-only, accedi all’interfaccia utente di RainLoop all’indirizzo:
http://stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion
🔐 Credenziali di esempio funzionanti:
- Email:
testimap@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion
- Password:
testimap
Dopo il login, puoi testare lo scambio interno di messaggi inviando un’email da testimap
a testimap2
(e viceversa), entrambi configurati sul tuo mail server Tor.
📬 Esempi di test:
- Da:
testimap@…
→ A:testimap2@…
- Da:
testimap2@…
→ A:testimap@…
✅ Se le email vengono ricevute e visualizzate nella webmail, allora tutto il sistema – Postfix + Dovecot + RainLoop sotto Tor – è correttamente configurato e funzionante.

🔐 Nota: RainLoop comunica direttamente con i tuoi servizi IMAP e SMTP in localhost. Nessun dato transita fuori dalla tua rete Tor, mantenendo la massima privacy.
📘 Conclusioni
Hai completato con successo l’installazione di un server email interamente operativo e accessibile esclusivamente tramite rete Tor. Grazie all’integrazione tra Postfix, Dovecot, RainLoop e il servizio .onion
, ora puoi creare caselle email sicure, inviare e ricevere messaggi tra utenti del tuo sistema in un ambiente totalmente isolato e anonimo.
Questa infrastruttura è autosufficiente, non dipende da servizi esterni come Gmail o Outlook, ed è ideale per ambienti ad alta esigenza di privacy, gruppi ristretti o comunicazioni interne su darknet.
🚀 Prossimi Passi
Le seguenti guide sono in fase di sviluppo (work in progress) e verranno rese disponibili successivamente:
🔐 Guida 2 – Messa in Sicurezza del Mail Server Tor (work in progress)
Hardening del sistema: cifratura, firewall, Fail2Ban, audit log, backup automatici e restrizione degli accessi all’interfaccia RainLoop.
🌍 Guida 3 – Relay verso altri server .onion (work in progress)
Estendi la comunicazione a server Tor esterni configurando Postfix per il relay sicuro su domini .onion.