Configuración Mullvad + Tor + Bridges (obfs4/meek) + DNS Seguro en Debian

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:

  1. Mullvad VPN: protege tu dirección IP real y cifra todo el tráfico.
  2. Tor: anonimiza el tráfico y permite evadir la censura.
  3. Bridges (obfs4/meek): oculta el uso de Tor frente a ISP o gobiernos que bloquean Tor.
  4. 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

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

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 obfs4
  • meek-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
    • 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!

     

     

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *