Introducción
Este manual está dirigido a usuarios que necesitan alta privacidad y anonimato en Internet, como periodistas, activistas o personas que viven bajo censura. La configuración descrita combina:
- Mullvad VPN: protege tu dirección IP real y cifra todo el tráfico.
- Tor: anonimiza el tráfico y permite evadir la censura.
- Bridges (obfs4/meek): oculta el uso de Tor frente a ISP o gobiernos que bloquean Tor.
- DNS cifrado (DoH/DoT): protege tus consultas de nombres de dominio frente a vigilancia.
El flujo de tráfico resultante es:
Tu Sistema (Debian)
↓
Mullvad VPN
↓
Tor Client (con Bridges)
↓
Internet
Advertencia: Esta configuración es avanzada. Una mala implementación puede exponer tu IP real o permitir fugas de DNS. Se recomienda usar Tor Browser para navegación anónima y no mezclarlo con navegadores normales.
Preparación de Mullvad VPN
Instalación y conexión
Instala desde los repositorios oficiales
# Download the Mullvad signing key
sudo curl -fsSLo /usr/share/keyrings/mullvad-keyring.asc https://repository.mullvad.net/deb/mullvad-keyring.asc
# Add the Mullvad repository server to apt
echo "deb [signed-by=/usr/share/keyrings/mullvad-keyring.asc arch=$( dpkg --print-architecture )] https://repository.mullvad.net/deb/stable stable main" | sudo tee /etc/apt/sources.list.d/mullvad.list
# Install the package
sudo apt update
sudo apt install mullvad-vpn
Descargar desde la pagina web
- Descarga la aplicación oficial de Mullvad para Linux (Debian compatible).
- Conecta la VPN a un servidor seguro.
Configurar Mullad
- Daita: La función DAITA (Defense Against AI-guided Traffic Analysis) en Mullvad VPN es una capa adicional de protección orientada a la obfuscación del tráfego para dificultar que incluso análisis avanzados basados en IA identifiquen patrones de uso, sitios visitados o actividades del usuario.
- Salto múltiple: La opción “salto múltiple” (Multihop / Multiple hop) de Mullvad te permite enrutar tu tráfico a través de dos (o más) servidores en lugar de uno: primero atraviesa un entry (servidor de entrada) y luego un exit (servidor de salida). Es, en la práctica, un túnel dentro de otro (tunnel-within-a-tunnel) usando WireGuard.


Configuración de DNS Seguro (DoT/DoH con systemd-resolved)
DNS sobre TLS (DoT) con systemd-resolved
Instala y habilita el resolvedor:
sudo apt install systemd-resolved -y
sudo systemctl enable systemd-resolved
sudo systemctl start systemd-resolved
Edita el archivo de configuración:
sudo vi /etc/systemd/resolved.conf
Añadir lo siguiente:
[Resolve]
DNS=194.242.2.3#dns.mullvad.net 194.242.2.2#dns.mullvad.net
DNSOverTLS=yes
Reiniciar el servicio:
sudo systemctl restart systemd-resolved
Enlazar el resolv.conf al stub local:
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
Verificar el estado:
resolvectl status
Resultado esperado:
El DNS global debe apuntar a 194.242.2.2 y 194.242.2.3 (Mullvad), con “DNS over TLS: yes”.
Desactivar IPv6
sudo vi /etc/sysctl.conf
# Añade al final
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
sudo sysctl -p
Verificación de VPN
curl -s https://ifconfig.co
Debe mostrar la IP del servidor Mullvad, no tu IP real.
Verificación DNS
Verifica con: https://mullvad.net/check

Configuración de Bridges y Tor
Obtener bridges
- Visita bridges.torproject.org o envía correo a
bridges@torproject.org. - Se recomiendan 2-3 bridges obfs4

Instalar Tor y transportes
sudo apt update
sudo apt install tor obfs4proxy meek-client
Instalar meek-client
En debian no se puede instalar meek-client mediente repositorio. Por lo tanto lo tenemos que compilar.
Instalamos las dependencias
sudo apt install -y golang git
Clona el repositorio oficial
cd ~
git clone https://git.torproject.org/pluggable-transports/meek.git
cd meek/meek-client
Compila el binario
go build
Esto generará un archivo llamado meek-client en la misma carpeta.
Instálalo en el sistema
sudo mv meek-client /usr/local/bin/
sudo chmod +x /usr/local/bin/meek-client
obfs4proxy: transporte obfs4meek-client: transporte meek (opcional, útil en censura extrema)
Configurar Bridges en torrc
sudo vi /etc/tor/torrc
Añadir:
ClientOnly 1
UseBridges 1
# Obfs4
ClientTransportPlugin obfs4 exec /usr/bin/obfs4proxy
Bridge obfs4 IP_ADRESS:PORT XXXXXXXXX cert=XXXXX iat-mode=0
Bridge obfs4 IP_ADRESS:PORT XXXXXXXXX cert=XXXXX iat-mode=2
# Meek
ClientTransportPlugin meek exec /usr/bin/meek-client
Bridge meek 0.0.2.0:3 url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com
# Configuración estándar
SocksPort 9050
Log notice file /var/log/tor/notices.log
Log debug file /var/log/tor/debug.log
Iniciar Tor
sudo systemctl enable --now tor
sudo journalctl -u tor -f
Verificación
- VPN conectada correctamente
curl -s https://ifconfig.co
Resultado esperado: IP del servidor Mullvad.
- Kill Switch activo
Desconecta la VPN temporalmente:
sudo systemctl stop mullvad-vpn
curl -s https://ifconfig.co
Resultado esperado: ninguna IP visible, el tráfico no debería salir (kill switch funcionando).
- IPv6 desactivado
ip a | grep inet6
Resultado esperado: no hay direcciones IPv6 activas.
2. DNS Seguro (Mullvad DoH / DoT)
- DNS cifrado activo
resolvectl status
Resultado esperado: DNS global apunta a 194.242.2.x (Mullvad).
- DNS leak check
Visitar: https://mullvad.net/check
Resultado esperado: “No DNS leaks”, servidor contiene “dns” en el nombre.
3. Tor + Bridges + Transportes Conectables
- Tor activo
sudo systemctl status tor
- Revisar logs de Tor
sudo journalctl -u tor -f
Resultado esperado: puentes conectados, sin errores.
- Puentes obfs4 activos
Revisar que tu torrc contiene las líneas de bridges correctas:
Bridge obfs4 1.2.3.4:9001 ABCDEF1234567890 cert=MIIB... iat-mode=0
ClientTransportPlugin obfs4 exec /usr/bin/obfs4proxy
Uso de Tor Browser
- Tor Browser instalado y actualizado
- Abrir solo Tor para actividades anónimas
- Check tor Node
- Visitar: https://check.torproject.org
- Resultado esperado: “Congratulations. You are using Tor.”
- No mezclar navegadores
- Recomendación: usar apps normales para navegación cotidiana y Tor Browser solo para actividades sensibles.

Automatización comprobaciones
check-anon.sh, un script Bash completo que automatiza las comprobaciones clave de tu setup Mullvad → Tor (bridges obfs4/meek) + DNS seguro en Debian.
El script realiza las pruebas que pediste: IP externa, IP vía Tor, estado de Mullvad/Tor, puentes/transportes, DNS (systemd-resolved), IPv6, SOCKS5, procesos obfs4proxy/meek-client, y cheques de firewall/kill-switch. También muestra salidas relevantes de logs para diagnóstico.
set -euo pipefail
IFS=$'\n\t'
# Colores
RED='\033[0;31m'
GRN='\033[0;32m'
YEL='\033[0;33m'
BLU='\033[0;34m'
NORM='\033[0m'
echo -e "${BLU}========== Comprobación Mullvad -> Tor (bridges + DNS seguro) ==========${NORM}\n"
# -----------------------------
# 0) Verificar utilidades
# -----------------------------
need_cmds=(curl ss ip systemctl journalctl pgrep resolvectl)
for cmd in "${need_cmds[@]}"; do
if ! command -v "$cmd" >/dev/null 2>&1; then
echo -e "${YEL}AVISO:${NORM} El comando '$cmd' no está disponible. Algunas comprobaciones fallarán."
fi
done
echo
# -----------------------------
# 1) Conectividad general
# -----------------------------
echo -e "${BLU}1) Conectividad general e IP externa${NORM}"
if command -v curl >/dev/null 2>&1; then
echo -n " -> IP pública (fuera de Tor): "
ip_out=$(curl -s --max-time 10 https://ifconfig.co || true)
if [[ -z "$ip_out" ]]; then
echo -e "${RED}ERROR:${NORM} No se pudo obtener IP pública."
else
echo -e "${GRN}$ip_out${NORM}"
fi
else
echo -e "${YEL}SKIP:${NORM} curl no disponible."
fi
echo
# -----------------------------
# 2) VPN Mullvad
# -----------------------------
echo -e "${BLU}2) Verificación básica de VPN (Mullvad)${NORM}"
if command -v resolvectl >/dev/null 2>&1; then
resolv_info=$(resolvectl status --no-pager 2>/dev/null || true)
if [[ -z "$resolv_info" ]]; then
echo -e "${YEL}No hay información de resolvectl.${NORM}"
else
echo "$resolv_info" | sed -n '1,6p'
if echo "$resolv_info" | grep -qi "194\.242\.2|dns\.mullvad"; then
echo -e " -> DNS apunta a Mullvad: ${GRN}OK${NORM}"
else
echo -e " -> DNS apunta a Mullvad: ${YEL}NO${NORM}"
fi
fi
else
echo -e "${YEL}SKIP:${NORM} resolvectl no disponible."
fi
echo
# -----------------------------
# 3) Estado Tor
# -----------------------------
echo -e "${BLU}3) Estado del servicio Tor y puentes${NORM}"
tor_active="unknown"
if command -v systemctl >/dev/null 2>&1; then
tor_active=$(systemctl is-active tor 2>/dev/null || true)
if [[ "$tor_active" == "active" ]]; then
echo -e " -> Tor service: ${GRN}active${NORM}"
else
echo -e " -> Tor service: ${RED}${tor_active}${NORM}"
fi
else
echo -e "${YEL}SKIP:${NORM} systemctl no disponible."
fi
# Logs recientes de Tor
if command -v journalctl >/dev/null 2>&1; then
echo -e " -> Últimas líneas de log de Tor (bridges/obfs4/meek/bootstrap/errores):"
echo "----------------------------------------"
sudo journalctl -u tor -n 80 --no-pager | grep -iE "bridge|obfs4|meek|bootstrap|100%|error|failed" || true
echo "----------------------------------------"
fi
echo
# -----------------------------
# 4) Transportes (obfs4/meek)
# -----------------------------
echo -e "${BLU}4) Transportes conectables (obfs4/meek)${NORM}"
if command -v pgrep >/dev/null 2>&1; then
if pgrep -x obfs4proxy >/dev/null 2>&1; then
echo -e " -> obfs4proxy: ${GRN}ejecutándose${NORM}"
else
echo -e " -> obfs4proxy: ${YEL}no encontrado${NORM}"
fi
if pgrep -x meek-client >/dev/null 2>&1 || command -v meek-client >/dev/null 2>&1; then
echo -e " -> meek-client: ${GRN}instalado/ejecutándose${NORM}"
else
echo -e " -> meek-client: ${YEL}no instalado/ejecutándose${NORM}"
fi
fi
echo
# -----------------------------
# 5) SOCKS5 local
# -----------------------------
echo -e "${BLU}5) SOCKS5 local (Tor)${NORM}"
if command -v ss >/dev/null 2>&1; then
if ss -ltnp 2>/dev/null | grep -qE "127.0.0.1:9050|:9050"; then
echo -e " -> SOCKS5 (127.0.0.1:9050): ${GRN}LISTEN${NORM}"
else
echo -e " -> SOCKS5 (127.0.0.1:9050): ${RED}NO LISTEN${NORM}"
fi
fi
echo
# -----------------------------
# 6) IP vía Tor
# -----------------------------
echo -e "${BLU}6) IP pública a través de Tor (SOCKS5)${NORM}"
tor_ip=$(curl -s --socks5-hostname 127.0.0.1:9050 --max-time 20 https://icanhazip.com || true)
if [[ -n "$tor_ip" ]]; then
echo -e " -> IP vía Tor: ${GRN}$tor_ip${NORM}"
else
echo -e " -> IP vía Tor: ${RED}No se pudo obtener${NORM}"
fi
echo
# -----------------------------
# 7) IPv6
# -----------------------------
echo -e "${BLU}7) Comprobación IPv6 (fugas)${NORM}"
ipv6_addrs=$(ip -6 addr show scope global 2>/dev/null || true)
if [[ -z "$ipv6_addrs" ]]; then
echo -e " -> IPv6: ${GRN}No detectada${NORM}"
else
echo -e " -> IPv6: ${RED}Detectadas direcciones globales:${NORM}"
echo "$ipv6_addrs"
echo -e "${YEL}Revisa si tu VPN soporta IPv6; si no, desactívala o configúrala correctamente.${NORM}"
fi
echo
# -----------------------------
# 8) DNS seguro
# -----------------------------
echo -e "${BLU}8) DNS seguro (DoT/DoH)${NORM}"
if command -v resolvectl >/dev/null 2>&1; then
resolvectl status | sed -n '1,20p'
if resolvectl status | grep -qi "mullvad"; then
echo -e " -> DNS apunta a Mullvad: ${GRN}OK${NORM}"
else
echo -e " -> DNS apunta a Mullvad: ${YEL}NO${NORM}"
fi
fi
echo
# Comprobación rápida Mullvad web
if command -v curl >/dev/null 2>&1; then
echo " -> Comprobación Mullvad / DNS leak (web, no concluyente)"
mullvad_check=$(curl -s --max-time 15 https://mullvad.net/check || true)
if echo "$mullvad_check" | grep -qi "No DNS leaks"; then
echo -e " -> ${GRN}No DNS leaks detectados${NORM}"
else
echo -e " -> ${YEL}Resultado no concluyente. Abrir https://mullvad.net/check${NORM}"
fi
fi
echo
# -----------------------------
# 9) Firewall (iptables)
# -----------------------------
echo -e "${BLU}9) Reglas de firewall (básica)${NORM}"
if command -v iptables >/dev/null 2>&1; then
sudo iptables -L OUTPUT -n -v --line-numbers || true
echo -e " -> Revisa reglas OUTPUT y Kill Switch (VPN)"
else
echo -e "${YEL}SKIP:${NORM} iptables no disponible."
fi
echo
# -----------------------------
# 10) Resumen final
# -----------------------------
echo -e "${BLU}========== Resumen (recomendaciones) ==========${NORM}"
[[ -n "${ip_out:-}" ]] && echo -e " - IP pública (fuera de Tor): ${GRN}${ip_out}${NORM}"
[[ -n "${tor_ip:-}" ]] && echo -e " - IP vía Tor: ${GRN}${tor_ip}${NORM}"
[[ "$tor_active" != "active" ]] && echo -e " - Tor service: ${RED}${tor_active}${NORM}"
echo -e "${YEL}Si alguno falla, sigue las recomendaciones:${NORM}"
echo " - Tor no activo -> sudo systemctl start tor ; revisar /etc/tor/torrc y bridges."
echo " - SOCKS no escucha -> verificar SocksPort 9050 en /etc/tor/torrc."
echo " - IP de Mullvad no detectada -> revisar VPN y Kill Switch."
echo " - DNS no apunta a Mullvad -> revisar /etc/systemd/resolved.conf o /etc/resolv.conf."
echo " - Direcciones IPv6 presentes -> desactivar IPv6 o configurarlo en VPN."
echo -e "${GRN}Comando recomendado antes de operar en terreno:${NORM}"
echo " sudo ./check-anon.sh && abrir Tor Browser y verificar https://check.torproject.org y https://mullvad.net/check"
echo -e "${BLU}Fin de comprobaciones.${NORM}"
:wq!