Ejecutando un Bridge Tor en Linux: Guía Completa obfs4 y WebTunnel
Un mismo puente ejecutando obfs4 y WebTunnel a la vez, con Nginx haciendo que la mitad WebTunnel sea indistinguible de HTTPS normal. Running y Valid llegan en menos de una hora; Stable y Guard tardaron aquí alrededor de una semana, porque se puntúan por fiabilidad sostenida y no por un contador de uptime.

En 2026, más de 2,5 millones de personas al día llegan a una Internet libre y abierta a través de la red Tor conectando directamente a un relé — Tor Metrics sitúa esa estimación diaria por encima de los tres millones durante la mayor parte del año, y solo cuenta conexiones directas: quien entra por un bridge, que es de lo que trata esta guía, se contabiliza aparte y no está en esa cifra. Periodistas en regímenes autoritarios, activistas que organizan protestas, denunciantes que destapan casos de corrupción y ciudadanos corrientes que protegen su privacidad: todos ellos dependen de una red operada íntegramente por voluntarios.
¿El problema? Solo hay unos 2.600 bridges dando servicio a esos millones de usuarios. Los bridges son el recurso más crítico y escaso en el ecosistema Tor — son el primer punto de contacto para usuarios en países censurados, y cada nuevo bridge ayuda directamente a alguien a acceder a la información libremente.
Esta guía te enseñará todo lo que necesitas saber sobre la red Tor, el enrutamiento onion, y cómo configurar un bridge obfs4 + WebTunnel listo para producción en Linux — completo con camuflaje Nginx, endurecimiento del firewall, monitorización con Prometheus e integración con CrowdSec.
TL;DR — un puente, dos pluggable transports
6 puntos clave- Un mismo puente puede ejecutar obfs4 y WebTunnel a la vez, y merece la pena porque fallan en sitios distintos: obfs4 aleatoriza el tráfico para que no se parezca a ningún protocolo, mientras que WebTunnel se esconde dentro de HTTPS normal en el puerto 443 y sobrevive a los censores que bloquean de plano todo el tráfico “inclasificable”.
- Nginx es lo que hace creíble a WebTunnel. Se pone delante del puente en el 443 y sirve un sitio web real en todas las rutas salvo la secreta, así que un censor que sondee el host ve una web normal en vez de un endpoint que responde raro.
- Los flags del consenso tardan días, no minutos. Running y Valid llegan en menos de una hora; Stable y Guard tardaron alrededor de una semana en este despliegue. Se puntúan a partir de un tiempo medio entre fallos ponderado y, en el caso de Guard, también de ancho de banda y familiaridad —no de un contador de uptime—, así que un puente que se reinicia cada dos días no deja de reiniciar la evidencia con la que se puntúan, y puede que no llegue a obtenerlos.
- Detrás de NAT hay que reenviar los TCP 9001, 4443 y 443 —ORPort, obfs4 y WebTunnel respectivamente— y abrirlos en el firewall del host; el autotest del ORPort falla en silencio si el router no lo hace.
- Dile a tu IDS que deje en paz a los clientes de Tor. CrowdSec ve muchas conexiones desde muchas direcciones y banea a usuarios legítimos si no se excluyen los puertos del puente.
- Todo corre bajo systemd, así que el stack vuelve solo tras un reinicio, que es justo lo que exigen los flags basados en uptime.
La red Tor: una introducción
¿Qué es Tor?
Tor (The Onion Router) es una red descentralizada operada por voluntarios, diseñada para proteger la privacidad de los usuarios y resistir la censura. Cuando usas Tor, tu tráfico de Internet se enruta a través de una serie de relés cifrados, lo que hace que sea extremadamente difícil para cualquiera — tu ISP, gobierno o un actor malicioso — rastrear tu actividad y asociarla contigo.
Pero Tor no es solo una herramienta de privacidad. Es una parte esencial de la infraestructura de derechos humanos. En países como China, Irán, Rusia y Myanmar, donde los gobiernos bloquean activamente el acceso a la información, Tor es a menudo la única forma para que los ciudadanos accedan a Internet sin censura.
Una breve historia
Los orígenes de Tor se remontan a los años 90 en el Laboratorio de Investigación Naval de EE.UU. (NRL), donde investigadores Paul Syverson, David Goldschlag y Michael Reed desarrollaron el concepto de enrutamiento onion — una técnica de comunicación anónima sobre una red de ordenadores. Puedes leer más sobre la historia completa de Tor en el sitio oficial.
- Se inventa el enrutamiento onion Hito
Syverson, Goldschlag y Reed, en el Laboratorio de Investigación Naval de EE.UU., desarrollan el concepto de cifrado en capas para la comunicación anónima.
- Nace el Proyecto Tor Estándar
Roger Dingledine y Nick Mathewson, ambos del MIT, se unen a Syverson para construir 'The Onion Router' — Tor. El código se publica como software libre con alrededor de una docena de nodos voluntarios.
- La EFF empieza a financiarlo Estándar
La Electronic Frontier Foundation reconoce la importancia de Tor para los derechos digitales y aporta una financiación crítica en los primeros años. El NRL libera el código al dominio público.
- Se funda Tor Project, Inc. Hito
El Proyecto Tor se convierte en una organización sin ánimo de lucro 501(c)(3) con sede en Massachusetts, lo que asegura desarrollo y gobernanza a largo plazo.
- Llegan los bridges Estándar
Se desarrollan direcciones de relé secretas (bridges) para ayudar a los usuarios a esquivar firewalls en países censurados donde el directorio de Tor está bloqueado.
- Empieza el Navegador Tor Estándar
Un navegador propio que empaqueta Tor en una aplicación fácil de usar y reduce drásticamente la barrera de entrada para usuarios no técnicos.
- Primavera Árabe Hito
Tor desempeña un papel crítico cuando activistas de Túnez, Egipto, Libia y Siria lo usan para organizar protestas y comunicarse de forma segura pese a la censura gubernamental.
- Revelaciones de Snowden Obsoleto
Las revelaciones de Edward Snowden sobre los programas de vigilancia masiva global disparan la adopción de Tor en todo el mundo.
- Se publica WebTunnel Estándar
Un pluggable transport nuevo que disfraza el tráfico de Tor como HTTPS corriente, lo que lo hace casi imposible de bloquear sin daño colateral.
- Hoy
~10.000 relés, ~2.600 bridges y más de 2,5 millones de usuarios diarios en más de 200 países. La red está operada íntegramente por voluntarios.
¿Cómo funciona el enrutamiento onion?
El enrutamiento onion debe su nombre a las capas de una cebolla — tus datos se envuelven en múltiples capas de cifrado, y cada relé en el circuito “pela” una capa para revelar el siguiente destino. Ningún relé único conoce jamás tanto el origen como el destino del tráfico.
Esto es lo que lo hace seguro:
| Relé | Sabe | No sabe |
|---|---|---|
| Guard (Entrada) | Tu dirección IP real | Qué sitios web visitas |
| Middle | Solo relé anterior y siguiente | Ni tu IP ni tu destino |
| Exit | El sitio web de destino | Tu dirección IP real |
Detalles técnicos clave de la construcción de circuitos de Tor (ver también la descripción general del sistema en la especificación de Tor):
- Selección de la ruta del circuito: el cliente elige los relés al azar y evita dos relés en la misma subred
/16o en el mismo país, para ganar diversidad. - Intercambio de claves: cada salto usa un handshake ntor (basado en Curve25519) para establecer un secreto compartido, con lo que se obtiene forward secrecy.
- Celdas de tamaño fijo: dentro de Tor todo se transmite en celdas de 512 bytes, lo que impide el análisis de tráfico por tamaño de paquete.
- Rotación de circuitos: los circuitos se rotan cada 10 minutos aproximadamente, para acotar la ventana de los ataques de correlación de tráfico.
- Autoridades de directorio: nueve servidores de confianza mantienen el consenso sobre el estado de la red, las claves de relé y los flags.
El ecosistema Tor: tipos de voluntarios
La red Tor está compuesta por diferentes tipos de nodos operados por voluntarios, cada uno sirviendo un propósito distinto:
| Rol | Qué hace | Nivel de riesgo | Impacto |
|---|---|---|---|
| Guard Relay | Primer salto del circuito. Ve la IP del usuario, pero no el destino. | Bajo | Alto — aporta ancho de banda |
| Middle Relay | Salto intermedio. No ve nada útil. | Muy bajo | Medio — añade ancho de banda y diversidad de ruta |
| Exit Relay | Último salto. Se conecta al destino en nombre del usuario. | Alto | Muy alto — el recurso más necesario y escaso |
| Bridge | Punto de entrada oculto para usuarios de países censurados. No figura en el directorio público de Tor. | Bajo | Crítico — es lo que permite eludir la censura directamente |
| Snowflake Proxy | Proxy WebRTC efímero que ayuda a los usuarios censurados a llegar a la red Tor. | Muy bajo | Medio — fácil de ejecutar, incluso en una pestaña del navegador |
| Directory Authority | Servidor de confianza que mantiene el consenso de la red. | N/A | Crítico — solo existen 9, operadas por el Proyecto Tor |
¿Qué son los pluggable transports?
Los censores no solo bloquean Tor por IP: usan inspección profunda de paquetes (DPI) para identificar y bloquear el propio protocolo Tor. Los pluggable transports resuelven esto disfrazando el tráfico de Tor como algo completamente diferente.
| Transporte | Método de disfraz | Resistencia a la censura | Velocidad | Despliegue |
|---|---|---|---|---|
| obfs4 | Hace que el tráfico parezca bytes aleatorios | Alta — resiste el fingerprinting por DPI | Rápida | Muy desplegado, fácil de configurar |
| WebTunnel | Imita tráfico HTTPS/WebSocket | Muy alta — parece navegación web normal | Rápida | Más reciente, requiere servidor web + dominio |
| Snowflake | Usa WebRTC a través de proxies efímeros | Muy alta — los proxies rotan constantemente | Variable | Solo en cliente (los voluntarios ejecutan proxies de navegador) |
| meek | Disfraza el tráfico como peticiones a servicios en la nube (Azure, CDN) | Extrema — bloquearlo implica bloquear servicios en la nube | Lenta | Costoso de mantener, último recurso |
En esta guía configuraremos obfs4 y WebTunnel en el mismo servidor, para maximizar el impacto con una sola máquina.
Requisitos previos
Paso 1: instalar Tor del repositorio oficial
Instalar requisitos previos
sudo apt updatesudo apt install -y apt-transport-https gpg curlAñadir la clave GPG del Proyecto Tor
curl -fsSL https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc \| sudo gpg --dearmor -o /usr/share/keyrings/tor-archive-keyring.gpgAñadir el repositorio de Tor
Sustituye
CODENAMEpor el nombre en clave de tu distribución (por ejemplo,bookworm,trixieojammy):CODENAME=$(lsb_release -cs)echo "deb [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] \https://deb.torproject.org/torproject.org $CODENAME main" \| sudo tee /etc/apt/sources.list.d/tor.listInstalar Tor y obfs4proxy
sudo apt updatesudo apt install -y tor deb.torproject.org-keyring obfs4proxyComprueba la instalación:
tor --versionobfs4proxy -versionSalida esperadaTor version 0.4.9.6. obfs4proxy-0.0.14
Paso 2: instalar WebTunnel (opcional pero recomendado)
WebTunnel es un pluggable transport más reciente que disfraza las conexiones de Tor como tráfico HTTPS normal. A diferencia de obfs4 (que parece datos aleatorios), WebTunnel usa de verdad upgrades de WebSocket sobre HTTPS, lo que lo hace casi indistinguible de la navegación web legítima. El Proyecto Tor publica instrucciones de configuración oficiales y una guía para compilarlo desde el código fuente.
Instalar Go (si aún no está instalado)
sudo apt install -y golang-goComprueba que tienes Go 1.21 o superior, que es lo que pide WebTunnel. Ojo si sigues en Debian 12: su paquete
golang-goes Go 1.19 y no llega, así que ahí hay que tirar debookworm-backportso del tarball oficial. Debian 13 trae 1.24 y sirve tal cual:go versionClonar y compilar WebTunnel
cd /tmpgit clone https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/webtunnel.gitcd webtunnel/main/servergo build -o webtunnel-server .sudo cp webtunnel-server /usr/local/bin/sudo chmod +x /usr/local/bin/webtunnel-serverComprobar el binario
/usr/local/bin/webtunnel-server --help 2>&1 | head -5
Paso 3: configurar tu bridge de Tor
Vamos con la configuración principal. El fichero torrc controla todo el comportamiento de Tor.
Sustituye el contenido de /etc/tor/torrc por:
# =============================================================
# Tor Bridge Configuration — obfs4 + WebTunnel
# =============================================================
# --- General Settings ---
SocksPort 0 # Not a client — disable SOCKS
RunAsDaemon 0 # Managed by systemd
DataDirectory /var/lib/tor
Log notice file /var/log/tor/notices.log
Log notice syslog
# --- Security Hardening ---
DisableDebuggerAttachment 1 # Prevent ptrace/debugger attachment
# --- Bridge Mode ---
BridgeRelay 1 # This is a bridge, not a relay
PublishServerDescriptor bridge # Publish to BridgeDB (not public directory)
# --- ORPort — IPv4 (NAT from router) + IPv6 (direct, global) ---
# IMPORTANT: Use 0.0.0.0 for NAT environments, not 127.0.0.1
ORPort 0.0.0.0:9001
ORPort [YOUR_IPV6_ADDRESS]:9001
ExtORPort auto
# --- Contact & Identity ---
ContactInfo your-email<at>example<dot>com
Nickname YourBridgeName
# --- obfs4 Transport ---
# Port 4443 must be forwarded from your router
ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy
ServerTransportListenAddr obfs4 0.0.0.0:4443
# --- WebTunnel Transport ---
# Listens locally; Nginx reverse-proxies HTTPS to it
ServerTransportPlugin webtunnel exec /usr/local/bin/webtunnel-server
ServerTransportListenAddr webtunnel 127.0.0.1:15000
ServerTransportOptions webtunnel url=https://YOUR-DOMAIN/YOUR-SECRET-PATH
# --- Bandwidth Limits ---
# Adjust to what your connection can sustain (example: 250 Mbps)
RelayBandwidthRate 31 MBytes # Sustained rate
RelayBandwidthBurst 35 MBytes # Burst allowance
# --- Memory — cap internal queue memory (OOM protection) ---
MaxMemInQueues 4096 MB
# --- Statistics ---
ConnDirectionStatistics 1 # Enable connection direction stats
# --- DoS Protection ---
DoSRefuseSingleHopClientRendezvous 1
# --- Monitoring: Prometheus Metrics ---
MetricsPort 0.0.0.0:9052
MetricsPortPolicy accept 192.168.0.0/16
MetricsPortPolicy accept 127.0.0.0/8
# --- Control Port (for Nyx monitoring tool) ---
ControlPort 9051
CookieAuthentication 1Repasemos las secciones críticas:
Opciones de configuración clave, explicadas
- BridgeRelay 1
Modo bridgeLe dice a Tor que es un bridge, no un relé público. Los bridges no figuran en el directorio público de Tor.- ORPort 0.0.0.0:9001
Onion Router Port (IPv4)El puerto que Tor usa para comunicarse con otros relés. Usa 0.0.0.0 (no 127.0.0.1) si estás detrás de NAT — Tor necesita escuchar en todas las interfaces para que el autotest pase.- ORPort [IPv6]:9001
Onion Router Port (IPv6)Si tienes una dirección IPv6 global, añade una segunda línea ORPort con esa dirección entre corchetes. IPv6 no necesita NAT: la dirección es accesible directamente.- ExtORPort auto
Extended ORPortCanal de comunicación interno entre Tor y los pluggable transports. Con 'auto', Tor elige un puerto local al azar.- ServerTransportListenAddr obfs4
Dirección de escucha de obfs4El puerto donde obfs4proxy espera las conexiones ofuscadas entrantes. Tiene que ser alcanzable desde Internet.- ServerTransportListenAddr webtunnel
Dirección de escucha de WebTunnelEscucha solo en 127.0.0.1 porque Nginx gestiona el HTTPS público y hace de proxy inverso hacia este puerto.- DisableDebuggerAttachment 1
Endurecimiento de seguridadImpide que herramientas como ptrace o gdb se enganchen al proceso de Tor. Protege las claves criptográficas en memoria frente a volcados y depuración.- MaxMemInQueues 4096 MB
Límite de memoria para colasLimita la memoria que Tor dedica a las colas de circuitos. Evita escenarios de OOM (falta de memoria) en servidores con mucha carga de tráfico.- ConnDirectionStatistics 1
Estadísticas de dirección de conexionesHabilita la recogida de estadísticas sobre el sentido de las conexiones (entrantes frente a salientes). Útil para analizar el tráfico del bridge.- DoSRefuseSingleHopClientRendezvous 1
Protección DoSRechaza los circuitos de encuentro (rendezvous) que llegan de clientes de un solo salto. Se usan habitualmente en abusos y ataques de denegación de servicio contra servicios ocultos.- MetricsPort
Endpoint de PrometheusExpone las métricas internas de Tor en formato Prometheus. Restringe el acceso con MetricsPortPolicy.
Generar la ruta secreta de WebTunnel
El transporte WebTunnel usa una ruta de URL secreta que hace las veces de token de autenticación. Genera una cadena aleatoria de 24 caracteres:
7Zkw18j2NWGK9X7PiiPUQRJBUsa ese valor en dos sitios:
- El
torrc:ServerTransportOptions webtunnel url=https://your-domain.com/YOUR_SECRET - La configuración de Nginx:
location = /YOUR_SECRET
Paso 4: configurar Nginx para camuflaje WebTunnel
Lo bonito de WebTunnel es que tu servidor parece un sitio web completamente normal. Los visitantes ven una página HTML corriente; solo quien conoce la ruta secreta puede conectarse al bridge de Tor. Esto es camuflaje por ruta secreta. No es domain fronting: aquello usa un dominio en el SNI de TLS y otro distinto en la cabecera Host, mientras que aquí hay un solo dominio y lo que oculta el bridge es la ruta.
Crear un sitio web de camuflaje
Esto es lo que ven los visitantes (y los censores) cuando entran en tu dominio:
sudo mkdir -p /var/www/tor-camouflagecat << 'EOF' | sudo tee /var/www/tor-camouflage/index.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Welcome</title><style>body { font-family: system-ui, sans-serif; max-width: 800px;margin: 50px auto; padding: 20px; color: #333; }h1 { color: #2c3e50; }</style></head><body><h1>Welcome</h1><p>This is a personal project page. Nothing to see here.</p></body></html>EOFObtener un certificado TLS (si todavía no tienes uno)
sudo apt install -y certbot python3-certbot-nginxsudo certbot --nginx -d your-domain.comCrear el bloque de servidor de Nginx
/etc/nginx/sites-available/tor-bridge.conf# Tor WebTunnel Bridge — Camouflage configuration # This looks like a normal HTTPS website but proxies # a secret path to the WebTunnel pluggable transport server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name your-domain.com; # TLS certificates ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # === Normal website (camouflage) === root /var/www/tor-camouflage; index index.html; location / { try_files $uri $uri/ =404; } # === WebTunnel reverse proxy (secret path) === # Replace YOUR_SECRET_PATH with your generated secret location = /YOUR_SECRET_PATH { proxy_pass http://127.0.0.1:15000; proxy_http_version 1.1; # WebSocket upgrade headers (required for WebTunnel) proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # Standard proxy headers proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Accept-Encoding ""; add_header Front-End-Https on; proxy_redirect off; proxy_buffering off; proxy_request_buffering off; # Long timeout for persistent Tor connections proxy_read_timeout 36000s; proxy_send_timeout 36000s; # Disable logging for the secret path (privacy) access_log off; error_log off; } } # HTTP to HTTPS redirect server { listen 80; listen [::]:80; server_name your-domain.com; return 301 https://$host$request_uri; }Habilitar el sitio y probarlo
sudo ln -sf /etc/nginx/sites-available/tor-bridge.conf \/etc/nginx/sites-enabled/sudo nginx -t && sudo systemctl reload nginx
Sitio web HTTPS normal
Una petición GET / a tu dominio devuelve una página HTML sencilla. El DPI ve tráfico TLS 1.3 estándar hacia un dominio registrado. Nada sospechoso.
HTTP/1.1 200 OK
Content-Type: text/html
<html>Welcome...</html>Conexión del bridge de WebTunnel
Una petición GET /SECRET_PATH con una cabecera Connection: Upgrade llega al servidor WebTunnel, que abre un túnel persistente para el tráfico de Tor — todo dentro de la misma sesión TLS.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
[El tráfico de Tor circula por el túnel]Paso 5: configurar el reenvío de puertos
Si tu servidor está detrás de un router (lo habitual en instalaciones domésticas), tienes que reenviar estos puertos desde la IP pública del router hasta la IP local de tu servidor:
| Puerto | Protocolo | Propósito | ¿Necesario? |
|---|---|---|---|
| 9001 | TCP | ORPort — comunicación entre relés | Sí (siempre) |
| 4443 | TCP | obfs4 — transporte ofuscado | Sí (si ejecutas obfs4) |
| 443 | TCP | HTTPS — WebTunnel vía Nginx | Sí (si ejecutas WebTunnel) |
Los pasos exactos dependen de tu router. El proceso general es este:
Entra en el panel de administración de tu router (normalmente en
192.168.0.1o192.168.1.1)Busca la sección de reenvío de puertos (suele estar bajo “NAT”, “Firewall” o “Port Forwarding”)
Crea reglas para cada puerto:
- Puerto externo: 9001 → IP interna: la IP de LAN de tu servidor → Puerto interno: 9001
- Puerto externo: 4443 → IP interna: la IP de LAN de tu servidor → Puerto interno: 4443
- Puerto externo: 443 → IP interna: la IP de LAN de tu servidor → Puerto interno: 443 (si no está ya reenviado)
Guarda y aplica los cambios.
Firewall del servidor (UFW)
Si usas UFW (Uncomplicated Firewall) en tu servidor:
Si usas iptables directamente:
IPv6: sin NAT
Comprueba que el puerto IPv6 está abierto:
Paso 6: configuración de AppArmor
En sistemas Debian/Ubuntu, AppArmor puede restringir lo que Tor y obfs4proxy tienen permitido hacer. Hay que asegurarse de que el perfil de obfs4proxy permite la ejecución:
Paso 7: iniciar y verificar
Inicia Tor
sudo systemctl restart torMira los logs para confirmar que el bootstrap ha ido bien
sudo journalctl -u tor -f --no-pager | head -30Busca estas líneas clave:
Salida de un bootstrap correctoBootstrapped 0% (starting): Starting Bootstrapped 5% (conn): Connecting to a relay Bootstrapped 10% (conn_done): Connected to a relay Bootstrapped 14% (handshake): Handshaking with a relay Bootstrapped 15% (handshake_done): Handshake with a relay done Bootstrapped 75% (enough_dirinfo): Loaded enough directory info to build circuits Bootstrapped 90% (ap_handshake_done): Handshake finished with a relay to build circuits Bootstrapped 95% (circuit_create): Establishing a Tor circuit Bootstrapped 100% (done): Done Self-testing indicates your ORPort 86.x.x.x:9001 is reachable from the outside. Excellent. Registered server transport 'obfs4' at '0.0.0.0:4443' Registered server transport 'webtunnel' at '127.0.0.1:15000'Comprueba que los tres procesos están en ejecución
ps aux | grep -E "(tor|obfs4|webtunnel)" | grep -v grepDeberías ver tres procesos:
tor,obfs4proxy, ywebtunnel-server.Comprueba que todos los puertos están en escucha
ss -tlnp | grep -E "(:443|9001|4443|15000|9051|9052)"Puertos que deberían estar en escuchaLISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=...,fd=...)) LISTEN 0 4096 0.0.0.0:9001 0.0.0.0:* users:(("tor",pid=...,fd=...)) LISTEN 0 4096 0.0.0.0:4443 0.0.0.0:* users:(("obfs4proxy",pid=...,fd=...)) LISTEN 0 4096 127.0.0.1:15000 0.0.0.0:* users:(("webtunnel-ser",pid=...,fd=...)) LISTEN 0 4096 127.0.0.1:9051 0.0.0.0:* users:(("tor",pid=...,fd=...)) LISTEN 0 4096 0.0.0.0:9052 0.0.0.0:* users:(("tor",pid=...,fd=...))Recupera la huella digital de tu puente
cat /var/lib/tor/fingerprint
Comprobar la accesibilidad externa
Desde otra máquina (o con un comprobador de puertos online), comprueba que tus puertos son accesibles:
Paso 8: monitorización con Prometheus y Grafana
Tor expone un conjunto muy completo de métricas por su MetricsPort en formato Prometheus. Con ellas puedes vigilar en tiempo real el uso de ancho de banda, las conexiones, la construcción de circuitos y la salud del relé.
Configurar el scraping de Prometheus
Añade un target de scrape para tu puente Tor en la configuración de Prometheus:
scrape_configs:
- job_name: 'tor-bridge'
scrape_interval: 30s
scrape_timeout: 10s
metrics_path: '/metrics'
static_configs:
- targets: ['YOUR_SERVER_IP:9052']
labels:
instance: 'tor-bridge'
nickname: 'YourBridgeName'Métricas clave que vigilar
Tor expone decenas de métricas de Prometheus. Estas son las más importantes para quien opera un puente:
| Métrica | Tipo | Lo que te dice |
|---|---|---|
tor_relay_connections_total | Counter | Conexiones totales por tipo y sentido (entrantes/salientes, OR/directorio) |
tor_relay_traffic_bytes | Counter | Bytes leídos y escritos en total — tu aportación de ancho de banda a la red |
tor_relay_flag | Gauge | Flags de directorio asignados a tu relé (Stable, Running, Valid, etc.) |
tor_relay_circuits_total | Gauge | Número de circuitos activos por estado (abiertos, cerrados, etc.) |
tor_relay_streams_total | Counter | Streams procesados — una aproximación a las conexiones reales de usuarios |
tor_relay_load_oom_bytes_total | Counter | Eventos de falta de memoria — si sube, añade más RAM |
tor_relay_load_tcp_exhaustion_total | Counter | Agotamiento de puertos TCP — si sube, ajusta los parámetros de red del kernel |
process_resident_memory_bytes | Gauge | RAM que usa ahora mismo el proceso Tor |
process_cpu_seconds_total | Counter | Tiempo de CPU consumido por Tor |
Panel de Grafana
Puedes montar un panel de Grafana bastante completo con gráficas para:
- Ancho de banda —
rate(tor_relay_traffic_bytes[5m])— throughput de entrada y salida en tiempo real - Conexiones —
tor_relay_connections_totalpor tipo — quién se está conectando - Flags del relé —
tor_relay_flag— ¿ha reconocido la red tu puente? - Circuitos —
tor_relay_circuits_total— cuántos circuitos hay activos - Recursos del sistema —
process_resident_memory_bytes,process_cpu_seconds_total - Salud —
tor_relay_load_oom_bytes_total,tor_relay_load_tcp_exhaustion_total
Nyx: monitorización desde el terminal
Nyx es una interfaz de terminal para vigilar Tor en tiempo real. Se conecta al ControlPort y muestra gráficas de ancho de banda, conexiones, circuitos y configuración.
Paso 9: integración con CrowdSec (si aplica)
Si ejecutas CrowdSec en el mismo servidor (algo habitual si ya tienes Nginx), te vas a encontrar con un problema: CrowdSec está diseñado para bloquear IPs maliciosas, pero los clientes del puente Tor disparan falsos positivos. Tu propio IDS puede acabar bloqueando a usuarios legítimos de Tor que se conectan a tu puente.
La solución es un bypass de tres capas que garantiza que el tráfico de Tor no se bloquee nunca:
Capa 1: iptables — esquivar el bouncer de firewall
Inserta reglas ACCEPT para los puertos concretos de Tor antes de la CROWDSEC_CHAIN:
Capa 2: Nginx — esquivar el bouncer Lua
Si el bouncer de Nginx de CrowdSec usa un rewrite_by_lua_block a nivel de http {}, añade una excepción para tu dominio de Tor:
rewrite_by_lua_block {
local cs = require "plugins.crowdsec.lib.crowdsec"
-- Bypass CrowdSec for Tor bridge domain
if ngx.var.host == "your-tor-domain.com" then
-- Skip CrowdSec check entirely for Tor bridge traffic
else
local ok, err = cs.Allow(ngx.var.remote_addr)
if not ok then
ngx.exit(ngx.HTTP_CLOSE)
end
end
}Capa 3: lista blanca en el parser de CrowdSec
Aun con lo anterior, CrowdSec seguirá analizando tus logs de Tor y puede generar decisiones locales. Crea una lista blanca en el parser para que ignore todo el tráfico hacia tu dominio de Tor:
name: custom/tor-bridge-whitelist
description: "Ignore all traffic to the Tor bridge domain"
whitelist:
reason: "Tor bridge traffic — legitimate by definition"
expression:
- evt.Parsed.target_fqdn == 'your-tor-domain.com'Para que CrowdSec detecte el target_fqdn, tus logs de Nginx tienen que incluir la variable $host. Crea un formato de log propio:
# Log format with vhost prefix for CrowdSec target_fqdn detection
log_format combined_vhost
'$host $remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';Después úsalo en el bloque de servidor de Tor:
access_log /var/log/nginx/tor.access.log combined_vhost;Tras cualquier cambio, recarga los dos servicios:
Persistir las reglas de iptables tras un reinicio
Las reglas de bypass de iptables se pierden al reiniciar. Crea un servicio systemd que las vuelva a aplicar:
[Unit]
Description=Tor Bridge — iptables bypass for CrowdSec
After=crowdsec-firewall-bouncer.service
Wants=crowdsec-firewall-bouncer.service
[Service]
Type=oneshot
RemainAfterExit=yes
# IPv4: Accept Tor traffic before CROWDSEC_CHAIN
ExecStart=/bin/sh -c '\
iptables -C INPUT -p tcp --dport 4443 -j ACCEPT 2>/dev/null || \
iptables -I INPUT 1 -p tcp --dport 4443 -j ACCEPT; \
iptables -C INPUT -p tcp --dport 9001 -j ACCEPT 2>/dev/null || \
iptables -I INPUT 1 -p tcp --dport 9001 -j ACCEPT'
# IPv6: Same rules
ExecStart=/bin/sh -c '\
ip6tables -C INPUT -p tcp --dport 4443 -j ACCEPT 2>/dev/null || \
ip6tables -I INPUT 1 -p tcp --dport 4443 -j ACCEPT; \
ip6tables -C INPUT -p tcp --dport 9001 -j ACCEPT 2>/dev/null || \
ip6tables -I INPUT 1 -p tcp --dport 9001 -j ACCEPT'
[Install]
WantedBy=multi-user.targetDescripción general de la arquitectura
Esta es la arquitectura completa de lo que has montado:
Lista de verificación
Con todo configurado, repasa esta lista para confirmar que tu bridge funciona por completo:
- Servicio Tor activo:
systemctl is-active tor - Bootstrap al 100%:
journalctl -u tor | grep "Bootstrapped 100%" - Autotest del ORPort IPv4 superado:
grep "is reachable from the outside" /var/log/tor/notices.log - Autotest del ORPort IPv6 superado (si lo configuraste): busca tu dirección IPv6 en el mensaje de accesibilidad
- Tres procesos en ejecución:
tor,obfs4proxy,webtunnel-server - Cinco puertos en escucha: 9001, 4443, 15000, 9051, 9052
- Puerto IPv6 en escucha (si lo configuraste):
ss -tlnp6 | grep 9001 - La configuración de Nginx es válida:
nginx -t - La página de camuflaje devuelve HTTP 200:
curl -I https://your-domain.com/ - La ruta de WebTunnel devuelve 502:
curl -I https://your-domain.com/SECRET(es lo esperado: requiere el protocolo correcto) - Prometheus haciendo scraping:
curl http://localhost:9052/metrics | head - El firewall permite los puertos de Tor:
ufw status | grep -E "9001|4443" - Existe la huella digital del puente:
cat /var/lib/tor/fingerprint - Van apareciendo los flags del relé (¡paciencia!): Running y Valid en torno a 1 hora, Stable unos 7 días y Guard unos 8, según el flag
- Accesible por IPv6 desde fuera:
nc -6zv TU_IPV6 9001 - El bypass de CrowdSec funciona (si procede):
cscli explaincon una línea de log de prueba
Notas operativas
¿Qué sucede después de arrancar el bridge?
- Bootstrap y autotest Estándar
Tor se conecta a la red, descarga el consenso y comprueba si tu ORPort es accesible. Si el autotest pasa, tu puente ya está operativo.
- Publicación del descriptor
Tor publica el descriptor de tu puente en la Autoridad de Puentes. BridgeDB ya lo conoce, pero todavía no lo reparte entre los usuarios.
- Distribución por BridgeDB Estándar
BridgeDB empieza a repartir tu línea de puente entre quienes piden puentes. Aquí pueden aparecer tus primeras conexiones de clientes.
- Llegada de los flags
Las autoridades de directorio asignan los flags según el comportamiento de tu puente. Running y Valid llegan primero; Stable exige unos 7 días de funcionamiento ininterrumpido.
- Régimen estable Hito
Tu puente está plenamente integrado en la red Tor. Vigila las métricas, mantén el software actualizado y cuida el uptime para maximizar el impacto.
Buenas prácticas de mantenimiento
- Mantén Tor actualizado: revisa las actualizaciones cada semana —
sudo apt update && sudo apt upgrade tor - Vigila los logs: revisa
/var/log/tor/notices.logen busca de avisos y errores - Observa las métricas: configura alertas de Grafana para caídas anómalas de ancho de banda o fallos de conexión
- Cuida el uptime: la red Tor penaliza a los relés que se caen a menudo
- Nunca borres
/var/lib/tor/pt_state/— ahí están tus claves obfs4. Perderlas implica estrenar identidad de puente - ¿IP dinámica? Si tu IP pública cambia, la línea de puente obfs4 deja de valer. A WebTunnel no le afecta (va por nombre de dominio). Plantéate un servicio DDNS para obfs4.
- Renueva los certificados TLS: si usas Let’s Encrypt con renovación automática, esto se resuelve solo
Copia de seguridad de los ficheros críticos
Estos ficheros contienen la identidad de tu bridge. Perderlos significa empezar de cero con otra huella digital:
Solución de problemas
Cómo lo tengo montado
Cuatro nodos Tor, que es justo el motivo de que esta guía exista en lugar de ser un resumen del manual.
Dos puentes: uno en Valencia, en el mismo servidor que sirve esta página, y otro en Alicante en un mini PC en casa — ese segundo cuelga de una línea de fibra doméstica por detrás del router MikroTik, de ahí que la sección de NAT y reenvío de puertos de más arriba esté escrita como está. Los dos relays intermedios son instancias VPS de IONOS, una en Londres y otra en Madrid, porque un relay quiere ancho de banda estable y una línea residencial no lo da de forma fiable.
Sinceramente, no hay ningún incidente que contar. No ha pasado nada dramático: ni una notificación de retirada, ni una queja por abuso, ni la visita de nadie. El puente y los relays simplemente han funcionado. Merece la pena decirlo así de claro, porque la pregunta que la gente se hace antes de montar uno es “qué me va a pasar si hago esto”, y la respuesta aquí, desde una línea doméstica en España, ha sido: nada.
Dos cosas sí me sorprendieron, y ambas están en esta guía por eso.
La primera es lo que tardan los flags del consenso. Yo esperaba que el puente estuviera “funcionando” en una hora, y en sentido estricto lo estaba: Running y Valid llegan enseguida. Stable tardó aquí alrededor de una semana, y Guard algo más. Son observaciones de este despliegue, no un calendario: las autoridades de directorio asignan Stable a partir de un tiempo medio entre fallos ponderado, no de un contador de uptime a secas, y Guard exige además Stable, Fast, familiaridad y ancho de banda suficiente, así que tus fechas serán otras. La lección práctica se sostiene igual: un reinicio para cambiar una línea de configuración retrasa la medición, así que trastea en la primera hora y luego déjalo en paz.
La segunda es que CrowdSec baneó a mis propios clientes de Tor antes de que se me ocurriera excluir los puertos del puente. Desde el punto de vista del IDS, un puente es exactamente lo que parece un ataque: muchas conexiones, muchas direcciones, ningún patrón. Estaba haciendo su trabajo correctamente y el resultado seguía siendo el equivocado, que es el modo de fallo que conviene recordar: la regla que se dispara aquí es la misma que describo en los artículos del honeypot de MikroTik y del tarpit de nginx, apuntando a tráfico que sí quería.
La red te necesita
Ejecutar un bridge de Tor es una de las cosas con más impacto que puedes hacer por la libertad en Internet. Cada bridge que operas es un salvavidas directo para gente bajo censura: periodistas en Irán, activistas en China, estudiantes en Rusia, ciudadanos en Myanmar. La barrera técnica es modesta; el impacto humano, incalculable.
Si esta guía te ha resultado útil, compártela con quien pueda querer contribuir. Cuantos más bridges haya, más difícil se lo pondremos a los censores.
Y si quieres ir más allá: monta un servidor dedicado a relés de salida, el recurso más escaso y con más impacto de toda la red Tor. Esa es una guía para otro día.
Preguntas frecuentes
¿Qué es un bridge de Tor y por qué son tan importantes los bridges?
Un bridge es un punto de entrada oculto a la red Tor que no figura en el directorio público, así que permite a los usuarios de países censurados llegar a Tor incluso cuando los relés conocidos están bloqueados. En 2026 la red tiene unos 10.000 relés pero solo unos 2.600 bridges, lo que los convierte en el recurso más crítico y escaso para eludir la censura.
¿Cuál es la diferencia entre obfs4 y WebTunnel?
obfs4 hace que el tráfico de Tor parezca bytes aleatorios para resistir el fingerprinting por DPI y es fácil de configurar; WebTunnel disfraza el tráfico como navegación HTTPS/WebSocket corriente, lo que lo hace casi imposible de bloquear a costa de necesitar un servidor web y un dominio. Ejecutar ambos en un mismo servidor ofrece dos métodos de evasión distintos a la vez.
¿Por qué ORPort debe usar 0.0.0.0 en lugar de 127.0.0.1 detrás de NAT?
Tor hace un autotest de accesibilidad que comprueba que el ORPort sea alcanzable desde Internet, y vincularlo a localhost (127.0.0.1) hace que ese autotest falle. Detrás de un router debes usar ORPort 0.0.0.0:9001 (o tu IP de LAN) y reenviar el puerto 9001 desde el router.
¿Qué puertos necesito reenviar para un bridge de Tor?
Reenvía TCP 9001 (ORPort, siempre requerido), TCP 4443 (obfs4, si ejecutas obfs4) y TCP 443 (HTTPS para WebTunnel vía Nginx, si ejecutas WebTunnel). Las direcciones IPv6 son globalmente enrutables, así que necesitan reglas de firewall que permitan el tráfico en lugar de reenvío de puertos.
¿Por qué la ruta secreta de WebTunnel devuelve un error 502 con curl?
Un error 502 Bad Gateway al hacer curl a la ruta secreta es el comportamiento esperado, porque WebTunnel necesita un handshake completo del protocolo WebSocket/WebTunnel que un simple GET HTTP no puede completar. Si los clientes de Tor consiguen conectarse, todo funciona correctamente.
¿Cuánto tarda mi bridge en obtener flags de relé y conexiones de clientes?
Los flags aparecen poco a poco: Running y Valid tardan alrededor de 1 hora, Stable necesita unos 7 días de funcionamiento ininterrumpido y Guard unos 8 días. BridgeDB reparte los bridges nuevos a lo largo de 24–48 horas, así que es normal esperar hasta una semana antes de ver tus primeras conexiones de clientes.
Lecturas y recursos adicionales
- red Tor Tor Project
- Tor Metrics sitúa esa estimación diaria por encima de los tres millones durante la mayor parte del año Tor Metrics
- Tor Wikipedia
- orígenes de Tor onion-router.net
- Paul Syverson Wikipedia
- enrutamiento onion Wikipedia
- la historia completa de Tor Tor Project
- construcción de circuitos Tor Project
- descripción general del sistema tpo.pages.torproject.net
- red Tor tiene unos **10.000 relés** pero solo alrededor de **2.600 bridges** Tor Metrics
- pluggable transports arxiv.org
- obfs4 Tor Project
- WebTunnel Tor Project
- extensión de navegador Snowflake snowflake.torproject.org
- repositorio Debian/Ubuntu Tor Project
- instrucciones de configuración oficiales Tor Project
- compilarlo desde el código fuente Tor Project
- Nyx nyx.torproject.org
- CrowdSec CrowdSec
- Tor Metrics Relay Search Tor Metrics
- honeypot de MikroTik jmrp.io
- tarpit de nginx jmrp.io