
Tor es reconocido por su alto nivel de anonimato, gracias al enrutamiento de tráfico a través de múltiples nodos voluntarios. Aunque esto aumenta la privacidad, también reduce la velocidad en comparación con opciones como Cloudflare Tunnels o Nginx Proxy Manager. Aun así, cuando buscas acceder a servicios internos sin abrir puertos ni adquirir un dominio, Tor se convierte en una solución gratuita y factible, sobre todo si la privacidad es prioritaria.
En este tutorial, aprenderás a exponer un servicio interno en la red Tor utilizando como ejemplo un servidor web básico basado en la imagen oficial nginx:alpine, sin depender de ninguna imagen personalizada.
Casos de Uso Populares
- Acceso a aplicaciones de monitoreo
Usar Uptime Kuma en combinación con Tor te permite monitorear tus servicios desde cualquier parte del mundo, sin exponer puertos y con máxima privacidad. - Paneles internos de prueba
Verifica la configuración de Tor utilizando aplicaciones mínimas como nginx:alpine antes de desplegar proyectos más complejos. - Alternativa a Túneles de Cloudflare o Nginx Proxy Manager
Aunque alternativas como Cloudflare Tunnels y Nginx Proxy Manager ofrecen velocidad y simplicidad con certificados SSL automáticos, Tor aporta privacidad extrema sin necesidad de depender de terceros ni adquirir un dominio. - Entornos de laboratorio y aprendizaje
Si gestionas contenedores en Docker o usas Proxmox VE para máquinas virtuales, Tor puede ser una solución simple para probar conectividad externa en laboratorios sin exponer tu red. - Privacidad para aplicaciones sensibles
Tor es perfecto para aplicaciones que requieren un nivel de anonimato superior, como servidores de comunicación para activistas, periodistas o desarrolladores de software en contextos críticos.
Requisitos Previos
- Un servidor o máquina local con Linux.
- Permisos de
sudopara instalar paquetes y editar archivos de configuración. - Docker instalado, si deseas correr contenedores (consulta Cómo Instalar Docker y Docker Compose en Linux: Guía Paso a Paso).
- Un servicio web interno (usaremos la imagen oficial
nginx:alpinecomo ejemplo).
Paso 1: Instalar y Configurar Tor
1. Instalar Tor
Ejecuta los siguientes comandos para instalar Tor:
sudo apt update
sudo apt install tor -y2. Editar la Configuración de Tor
Abre el archivo de configuración de Tor:
sudo nano /etc/tor/torrcAñade las siguientes líneas al final del archivo:
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:80HiddenServiceDir: Directorio donde Tor almacenará las claves y la dirección.onion.HiddenServicePort: Mapea el puerto 80 de tu servidor local al puerto 80 del servicio oculto en Tor.
Guarda los cambios (Ctrl+O, Enter) y cierra el archivo (Ctrl+X).
3. Reiniciar el Servicio de Tor
Reinicia Tor para aplicar los cambios:
sudo systemctl restart torTor creará automáticamente el directorio especificado en HiddenServiceDir y los archivos necesarios para tu servicio oculto.
Paso 2: Desplegar un contenedor web de prueba
1. Ejecutar el Contenedor
Usaremos la imagen oficial nginx:alpine con una página propia montada dentro. Así el ejemplo no depende de ninguna imagen de terceros que haya que mantener:
Primero, la carpeta y el fichero que vamos a servir:
mkdir -p ~/tor-demo
nano ~/tor-demo/index.htmlPega dentro esto. Es exactamente la página que aparece en las capturas de más abajo, con una diferencia que importa: la animación va incrustada en el propio fichero, no se descarga de ningún CDN. Un servicio oculto no debería pedirle nada a la red abierta, ni siquiera un script decorativo.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Web Server</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #f06, #4a90e2);
height: 100vh; display: flex; align-items: center; justify-content: center;
color: #fff; text-align: center; overflow: hidden;
}
canvas { position: fixed; inset: 0; z-index: 0; }
.container {
position: relative; z-index: 1;
background: rgba(0, 0, 0, .6); padding: 40px; border-radius: 15px;
box-shadow: 0 8px 16px rgba(0, 0, 0, .3);
}
h1 { font-size: 2.4rem; }
</style>
</head>
<body>
<canvas id="red"></canvas>
<div class="container"><h1>¡Welcome to my Web Server!</h1></div>
<script>
// Red de puntos. Va incrustado a proposito: un servicio oculto no deberia
// pedirle nada a la red abierta, ni siquiera un script decorativo.
const c = document.getElementById('red'), x = c.getContext('2d');
let p = [];
function medir() {
c.width = innerWidth; c.height = innerHeight;
p = Array.from({ length: Math.min(90, innerWidth / 14) }, () => ({
x: Math.random() * c.width, y: Math.random() * c.height,
vx: (Math.random() - .5) * .4, vy: (Math.random() - .5) * .4
}));
}
function pintar() {
x.clearRect(0, 0, c.width, c.height);
x.fillStyle = x.strokeStyle = 'rgba(255,255,255,.55)';
for (const a of p) {
a.x += a.vx; a.y += a.vy;
if (a.x < 0 || a.x > c.width) a.vx *= -1;
if (a.y < 0 || a.y > c.height) a.vy *= -1;
x.fillRect(a.x, a.y, 2, 2);
}
for (let i = 0; i < p.length; i++)
for (let j = i + 1; j < p.length; j++) {
const d = Math.hypot(p[i].x - p[j].x, p[i].y - p[j].y);
if (d < 130) {
x.globalAlpha = (1 - d / 130) * .35;
x.beginPath(); x.moveTo(p[i].x, p[i].y); x.lineTo(p[j].x, p[j].y); x.stroke();
x.globalAlpha = 1;
}
}
requestAnimationFrame(pintar);
}
addEventListener('resize', medir); medir(); pintar();
</script>
</body>
</html>Y ahora levanta el contenedor:
docker run -d --name web-tor -p 127.0.0.1:80:80 -v ~/tor-demo:/usr/share/nginx/html:ro nginx:alpineFíjate en el 127.0.0.1 del comando, porque no es un detalle. Publicar con -p 80:80 a secas dejaría el contenedor accesible en todas las interfaces del servidor, incluida la que da a tu red o a internet. Y eso tiene una consecuencia concreta para lo que perseguimos aquí: cualquiera podría pedir la misma página por la red abierta desde tu IP, compararla con la que sirve tu dirección .onion y deducir que ambas son la misma máquina. Atando el contenedor a 127.0.0.1, lo único que puede alcanzarlo es Tor, que es exactamente lo que dice tu torrc.
-d: Ejecuta el contenedor en segundo plano.--name web-tor: Asigna un nombre al contenedor.-p 127.0.0.1:80:80: Mapea el puerto 80 del contenedor al 80 de tu máquina, pero solo en loopback. Sin el127.0.0.1quedaría publicado en todas las interfaces.
2. Verificar el Servicio Localmente
Si estás en la misma máquina que aloja el contenedor, abre un navegador y accede a http://localhost
Si el contenedor se está ejecutando en una VM o contenedor LXC en Proxmox (o cualquier otro servidor remoto), primero averigua la dirección IP con:
ip aEn mi caso es:

Luego, en tu navegador (desde otra máquina en la misma red), visita http://<dirección-IP>. Deberías ver tu página de prueba para confirmar que el servidor web está funcionando correctamente.

Paso 3: Obtener tu Dirección .onion
Obtener la Dirección del Servicio Oculto
sudo cat /var/lib/tor/hidden_service/hostnameEste comando te mostrará tu dirección .onion. En mi caso exakxafo34v2qcnt7ab2pntkfxxj6afeni237bkpgrvuyqxca7psveyd.onion

Proteger y Respaldar el Directorio del Hidden Service
Asegúrate de proteger las claves privadas almacenadas en /var/lib/tor/hidden_service/. Si pierdes estos archivos o se eliminan, tu dirección .onion cambiará. Para mantener la misma dirección en caso de restaurar el servicio o migrar a otra máquina, respalda este directorio de forma segura.
sudo chmod -R 700 /var/lib/tor/hidden_service/
sudo chown -R debian-tor:debian-tor /var/lib/tor/hidden_service/Estas líneas restringen el acceso a las claves y garantizan que solo el usuario debian-tor (encargado de Tor) pueda modificarlas.
Paso 4: Acceder al Servicio desde Tor
- Instalar Tor Browser
Descarga el navegador Tor en tu dispositivo local. - Abrir la Dirección .onion
Inicia el navegador Tor y accede a la URL.oniongenerada en el paso anterior.

Opciones Adicionales: HTTPS Interno
Aunque Tor cifra automáticamente el tráfico entre el cliente y el último nodo Tor, habilitar HTTPS en tu servicio local añade cifrado de extremo a extremo, asegurando que, incluso dentro de tu red local, la comunicación esté protegida. Esto resulta clave en entornos productivos donde hay varios dispositivos o usuarios que podrían interceptar el tráfico sin cifrar en la LAN
Próximos Pasos
- Exponer Servicios Complejos
Tras verificar el funcionamiento con esta prueba, expón aplicaciones como Uptime Kuma, Nextcloud o paneles de administración como Proxmox VE. - Explorar Alternativas
Para servicios que requieran mayor velocidad, considera opciones como Cloudflare Tunnels o Nginx Proxy Manager. - Fortalecer la Seguridad
Habilita contraseñas o autenticación en tus servicios para evitar accesos no deseados. - Virtualización y Entornos de Prueba
Si usas Proxmox VE, puedes exponer servicios en contenedores LXC o máquinas virtuales a través de Tor.
Consejos Adicionales
Registrar Logs de Tor
Para depurar errores o verificar que tu servicio se inicie correctamente, revisa los logs de Tor:
journalctl -u torSi deseas llevar los registros a un archivo específico, abre el archivo de configuración /etc/tor/torrc y añade la siguiente línea
Log notice file /var/log/tor/notices.logCon esto, activarás un registro de nivel “notice” en el fichero /var/log/tor/notices.log. Asegúrate de reiniciar Tor para que los cambios surtan efecto:
sudo systemctl restart torDe esta manera, podrás consultar eventos detallados y posibles advertencias sobre el servicio oculto.
Uso de Varios Puertos
Si quieres exponer más de un puerto (por ejemplo, 80 y 443) en tu servicio oculto, basta con añadir líneas adicionales en tu torrc:
HiddenServicePort 80 127.0.0.1:80
HiddenServicePort 443 127.0.0.1:443De esta forma, puedes manejar HTTP y HTTPS simultáneamente.
Permisos en Contenedores
Si tu servidor aloja múltiples aplicaciones, considera hacer el binding de tus contenedores a 127.0.0.1 (en lugar de 0.0.0.0) para reforzar la seguridad. Así, el servicio solo será accesible localmente, y Tor se encargará de exponerlo a la red externa sin necesidad de un bind público.
Conclusión
Exponer servicios internos en la red Tor es una forma práctica de garantizar privacidad sin necesidad de adquirir un dominio ni abrir puertos en tu router. Aunque la velocidad de Tor es limitada, es ideal para proyectos pequeños, entornos de prueba y servicios sensibles donde el anonimato sea prioritario.
Para la mayoría de los proyectos, la velocidad y facilidad de configuración de Cloudflare Tunnels y Nginx Proxy Manager pueden resultar más atractivas. Sin embargo, si la privacidad es prioritaria o deseas un entorno experimental sin exponer puertos ni comprar un dominio, Tor es una herramienta invaluable.
¿Tienes dudas o sugerencias? ¡Déjalas en los comentarios! 😊