Por qué alojar tu propio servidor de escritorio remoto
Las soluciones comerciales como TeamViewer y AnyDesk comparten una característica: cada conexión pasa por su infraestructura de relay, independientemente de la distancia real entre las dos máquinas. Esto genera tres problemas concretos.
Privacidad y cumplimiento. Los datos fluyen a través de servidores de terceros sujetos a la legislación de su país de alojamiento. Para proveedores IT que acceden a sistemas financieros, médicos o legales, esta delegación implícita puede invalidar un acuerdo de cumplimiento (RGPD, ISO 27001, HIPAA). RustDesk self-hosted elimina esta dependencia: el tráfico cifrado permanece en tu datacenter.
Historial de vulnerabilidades. TeamViewer ha sufrido varios incidentes notables — en 2016, miles de cuentas fueron comprometidas mediante credential stuffing; en 2024, una intrusión en el entorno corporativo fue atribuida a un grupo APT. Estos incidentes no implican al protocolo, pero destacan que depender de un tercero significa depender de su superficie de ataque.
Coste de licencias. TeamViewer Business parte de más de 600 €/año para un solo usuario simultáneo. AnyDesk es más barato pero sigue un modelo por puesto. RustDesk self-hosted reduce el coste al de tu VPS — un ServOrbit desde 99 DH/mes cubre a todo un equipo.
Lo que te ofrece RustDesk self-hosted
- Sin límites de sesión — sin licencia por puesto ni cuota de conexiones simultáneas; tu servidor atiende a tantos usuarios como tu VPS pueda manejar
- Cifrado extremo a extremo garantizado — curva Ed25519 para intercambio de claves, ChaCha20-Poly1305 para el flujo de vídeo y las entradas de teclado/ratón: la clave pública de tu servidor está integrada en el cliente, haciendo la interceptación estructuralmente imposible
- Latencia controlada — tu relay está en el datacenter de tu elección; al elegir la región más cercana a tus equipos, el RTT es consistentemente inferior al de un relay SaaS genérico en Europa del Norte
- Clientes multiplataforma — Windows, macOS, Linux, Android, iOS y navegador web desde un único servidor central, sin configuraciones diferentes por plataforma
- IDs personalizados — asigna identificadores memorables (
SERVIDOR-DB-01,LAPTOP-ALICIA) en lugar de los IDs numéricos aleatorios generados por defecto - API REST integrada — RustDesk Server Pro expone una API REST para consultar el estado de conexiones, listar máquinas registradas y automatizar el aprovisionamiento mediante tus propios scripts o un CMDB
- Registro de auditoría completo — cada conexión, desconexión y transferencia de archivo queda registrada con marca temporal en el servidor; imprescindible en entornos con requisitos de trazabilidad
Arquitectura RustDesk: hbbs y hbbr
RustDesk separa el rol de señalización del rol de relay en dos procesos distintos.
hbbs — el servidor de rendez-vous (servidor de ID). Es el punto de entrada. Cada cliente RustDesk que arranca se registra con un identificador numérico (o personalizado). Cuando se inicia una conexión, ambas partes contactan hbbs para intercambiar direcciones IP e intentar una conexión P2P directa. hbbs escucha en los puertos TCP 21115 y 21116, así como UDP 21116.
hbbr — el servidor relay. Si la conexión P2P falla (NAT simétrico, firewall restrictivo), el tráfico se retransmite a través de hbbr. El relay solo ve flujos cifrados — no puede leer el contenido. hbbr escucha en el puerto TCP 21117.
Flujo de una conexión. La máquina A contacta hbbs vía TCP para obtener la dirección de la máquina B. Ambas máquinas intentan una conexión UDP directa (hole punching). Si tiene éxito, hbbr no interviene y la latencia es mínima. Si falla, hbbs proporciona a A la dirección de hbbr para retransmitir — con un ligero overhead de pocos milisegundos. En la práctica, P2P funciona en la mayoría de redes domésticas y empresariales que no tienen NAT estricto.
Requisitos del VPS
Recursos mínimos. 1 GB de RAM y 1 vCPU son suficientes para hasta unas 20 conexiones simultáneas en modo relay. Más allá, el factor limitante es el ancho de banda: un flujo Full HD se codifica a aproximadamente 2-4 Mbit/s. Para 50 conexiones simultáneas en relay, planifica 2 vCPU, 2 GB de RAM y un VPS con un rendimiento garantizado de al menos 200 Mbit/s.
Puertos a abrir.
- TCP 21115 — negociación NAT
- TCP 21116 — registro de ID
- UDP 21116 — hole punching P2P
- TCP 21117 — flujo retransmitido
- TCP 21118 y 21119 — cliente web (opcional)
- TCP 443 — interfaz admin HTTPS (si se activa)
Software requerido. Docker Engine 24+ y Docker Compose v2 (comando docker compose sin guion). Se recomienda un dominio o subdominio para exponer la interfaz de administración detrás de TLS — de lo contrario las conexiones de administración usan HTTP en claro.
Desplegar RustDesk Server en un VPS
Crear el directorio y docker-compose.yml
Crea la estructura de directorios y el archivo Compose:
mkdir -p /opt/rustdesk/data cd /opt/rustdeskContenido de
docker-compose.yml:services: hbbs: image: rustdesk/rustdesk-server:latest command: hbbs ports: - "21115:21115" - "21116:21116" - "21116:21116/udp" - "21118:21118" volumes: - ./data:/root restart: unless-stopped depends_on: - hbbr hbbr: image: rustdesk/rustdesk-server:latest command: hbbr ports: - "21117:21117" - "21119:21119" volumes: - ./data:/root restart: unless-stoppedEl volumen compartido
./datagarantiza quehbbsyhbbrusen el mismo par de claves generado en el primer arranque.Iniciar los contenedores y recuperar las claves
Inicia los dos servicios en segundo plano:
docker compose up -dEn el primer arranque,
hbbsgenera automáticamente un par de claves Ed25519 en./data/. Recupera la clave pública:cat /opt/rustdesk/data/id_ed25519.pubAnota este valor — lo necesitarás para configurar cada cliente. Sin él, los clientes se negarán a conectarse a tu servidor. Guarda también
id_ed25519(clave privada) en un lugar seguro; si se ve comprometida, todos los clientes necesitarán reconfiguración con una clave nueva.Configurar el firewall (puertos TCP/UDP)
Abre los puertos necesarios en
ufw:ufw allow 21115/tcp ufw allow 21116/tcp ufw allow 21116/udp ufw allow 21117/tcp ufw allow 21118/tcp ufw allow 21119/tcp ufw reloadSi tu VPS también está protegido por un firewall de red en el panel ServOrbit, aplica las mismas reglas allí. Luego verifica que los puertos estén escuchando:
ss -tlnup | grep -E '2111[5-9]'Exponer la interfaz admin detrás de un reverse proxy HTTPS
RustDesk Server Pro proporciona una interfaz web de administración en el puerto 21114 (HTTP). Para exponerla en HTTPS, añade nginx como reverse proxy.
Vhost nginx mínimo para
rustdesk.tu-dominio.com:server { listen 443 ssl; server_name rustdesk.tu-dominio.com; ssl_certificate /etc/letsencrypt/live/rustdesk.tu-dominio.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/rustdesk.tu-dominio.com/privkey.pem; location / { proxy_pass http://127.0.0.1:21114; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }Obtén el certificado con Certbot:
certbot --nginx -d rustdesk.tu-dominio.comConfigurar los clientes desktop (Windows, macOS, Linux)
Descarga el cliente RustDesk desde [rustdesk.com](https://rustdesk.com) y abre la configuración de red (icono de engranaje → Red). Introduce:
- Servidor ID: dirección IP o nombre de dominio de tu VPS
- Servidor Relay: mismo valor
- Clave: el valor copiado deid_ed25519.pubConfirma. El indicador de conexión se pone verde si el servidor es accesible y la clave es correcta. A partir de ese momento, ningún intento de conexión pasará por los servidores públicos de RustDesk.
Configurar los clientes móviles (Android e iOS)
En Android, instala RustDesk desde Play Store o directamente mediante APK (útil si Play Store está restringido en algunos dispositivos empresariales). En iOS, RustDesk está disponible en App Store.
En ambos casos, ve a Ajustes → Servidor ID/Relay e introduce los mismos valores que para el cliente desktop: dirección del servidor y clave pública. La clave puede compartirse mediante código QR desde la interfaz admin de RustDesk Server Pro, lo que simplifica el despliegue masivo en flotas móviles.
Probar una conexión extremo a extremo
En dos máquinas configuradas con tu servidor, anota el identificador mostrado en la máquina destino. Desde la máquina origen, introduce ese identificador en el campo de conexión de RustDesk e inicia la sesión.
Verifica en los logs que la conexión pasa por tu infraestructura:
docker logs rustdesk-hbbr-1 --tail 20Una línea con
[RELAY]indica que se usa el relay (NAT estricto). Una línea[DIRECT]o la ausencia de líneas en los logs dehbbrindica una conexión P2P directa — ideal para la latencia.
Configurar TLS para conexiones seguras
Por defecto, los flujos RustDesk están cifrados extremo a extremo con ChaCha20-Poly1305 — no se requiere TLS adicional para las sesiones de escritorio remoto en sí. Sin embargo, la interfaz de administración (puerto 21114) y la API REST funcionan en HTTP en claro si no las proteges.
Opción 1: Certbot + nginx (recomendado). Como se muestra en el paso 4, nginx actúa como reverse proxy frente al puerto 21114. Certbot renueva el certificado automáticamente mediante un timer systemd.
Opción 2: Traefik como edge proxy. Si ya usas Traefik para otros servicios en el mismo VPS, simplemente añade labels al servicio hbbr en Compose:
labels:
- "traefik.enable=true"
- "traefik.http.routers.rustdesk-admin.rule=Host(`rustdesk.tu-dominio.com`)"
- "traefik.http.routers.rustdesk-admin.tls.certresolver=letsencrypt"
- "traefik.http.services.rustdesk-admin.loadbalancer.server.port=21114"Lo que permanece sin cifrar por diseño. Los puertos 21115-21119 no usan HTTPS porque emplean sus propios protocolos binarios. El cifrado de esos flujos lo gestionan las claves Ed25519 y ChaCha20 — no TLS. No intentes forzar HTTPS en estos puertos.
Activar autenticación y control de acceso
La versión open source de RustDesk Server no tiene interfaz de autenticación nativa — cualquier cliente que conozca tu clave pública puede intentar conectarse a una máquina registrada (si esa máquina acepta la petición). RustDesk Server Pro (auto-alojable, gratuito hasta 20 usuarios) añade varias capas de control.
Cuentas de usuario y grupos. La interfaz de administración permite crear cuentas con nombre, agruparlas y definir políticas de acceso por grupo. Un técnico puede tener acceso solo a las máquinas del grupo 'Infraestructura', no a los equipos de RRHH.
Aprobación de conexión. Cada máquina puede configurarse para requerir confirmación física del usuario local antes de permitir el control remoto — el cuadro de diálogo 'Aceptar conexión' aparece en la pantalla de la máquina destino.
Registro de auditoría completo. Cada evento (conexión iniciada, aceptada, rechazada, duración, transferencia de archivo) queda registrado con la identidad del iniciador y la marca temporal. Los logs son exportables como CSV desde la interfaz de administración.
Deshabilitar los servidores públicos. Para forzar el uso exclusivo de tu servidor — sin fallback a los relays públicos de RustDesk si no está disponible — añade la opción --key con tu clave privada al comando hbbs. Los clientes configurados con tu clave pública rechazarán cualquier servidor alternativo, incluido el servidor oficial de RustDesk.
Optimizar la calidad de imagen y el rendimiento
RustDesk usa por defecto su propio códec de vídeo (VP9 o H.264 según la plataforma) con calidad adaptativa basada en el ancho de banda detectado. Varios parámetros permiten ajustar este comportamiento.
Calidad de imagen. En la configuración del cliente, 'Calidad de imagen' puede ajustarse a Baja, Media, Alta o Personalizada. En entornos empresariales sobre LAN o un VPS cercano geográficamente, 'Alta' es utilizable sin saturar el ancho de banda. En una conexión móvil o de larga distancia, 'Media' reduce la latencia percibida.
Códec. RustDesk selecciona automáticamente el mejor códec disponible: H.265 si ambos extremos tienen codificación/decodificación por hardware, VP9 en caso contrario. En un VPS sin GPU, VP9 es el predeterminado — razonable en uso de CPU para flujos ofimáticos. Evita forzar H.264 en un VPS con poco CPU si tienes múltiples conexiones simultáneas.
P2P vs relay. Una conexión P2P directa es siempre preferible: evita el salto adicional a través de hbbr, eliminando el intermediario y reduciendo el tiempo de ida y vuelta. Si tus usuarios se conectan desde la misma LAN que la máquina destino, verifica que el firewall no bloquee las conexiones UDP directas entre hosts — RustDesk intenta P2P primero antes de recurrir al relay.
RustDesk vs TeamViewer vs AnyDesk vs Guacamole
Desplace la tabla
| Criterio | RustDesk (self-hosted) | TeamViewer | AnyDesk | Guacamole |
|---|---|---|---|---|
| Modelo de alojamiento | Self-hosted (VPS) | SaaS (nube del proveedor) | SaaS (nube del proveedor) | Self-hosted (servidor web) |
| Coste de licencia | Gratis (OSS) / Pro de pago | Desde 600 €/año/usuario | Desde 180 €/año/usuario | Gratis (Apache 2.0) |
| Protocolo | Propietario cifrado (Ed25519 + ChaCha20) | Propietario (híbrido RDP/VNC) | DeskRT (códec propietario) | VNC / RDP / SSH vía navegador |
| Conexión P2P | Sí (con fallback relay) | No (siempre vía nube) | Sí (con fallback) | No (proxy central) |
| Clientes móviles nativos | Android + iOS nativos | Android + iOS nativos | Android + iOS nativos | Solo navegador |
| Registro de auditoría | Sí (Pro) | Sí (Business+) | Sí (Business+) | Limitado (logs de servidor brutos) |
| API REST | Sí (Pro) | Sí (de pago) | No (API de terceros) | Sí (REST parcial) |
| Soberanía de datos | Total (tu infraestructura) | Nula (nube TeamViewer) | Parcial (relay AnyDesk) | Total (tu infraestructura) |
Despliegue enterprise: aprovisionamiento masivo de clientes
RustDesk admite configuración automática mediante un archivo de configuración integrado en el ejecutable del cliente. Al compilar o empaquetar para tu flota, coloca un archivo RustDesk2.toml en el directorio de configuración con tus valores:
relay-server = "tu-vps.ejemplo.com"
id-server = "tu-vps.ejemplo.com"
key = "<tu_clave_pública_ed25519>"En Windows, este archivo va en %APPDATA%\RustDesk\config\. En Linux, en ~/.config/rustdesk/. Puedes desplegar esta configuración mediante tu herramienta de gestión de flota (Ansible, Intune, Puppet) sin interacción del usuario. La clave pública y la dirección del servidor están precargadas — el usuario instala RustDesk y queda directamente conectado a tu infraestructura.
Monitorizar y mantener el servidor
Métricas Docker. Monitoriza el consumo de recursos en tiempo real con docker stats — un pico de CPU en hbbr indica un número inusualmente alto de conexiones retransmitidas. Si la media supera el 80% durante varios minutos, considera aumentar el vCPU o verificar si conexiones bloqueadas están generando bucles de reintento.
Rotación de logs. Los contenedores escriben en stdout/stderr, gestionados por el demonio Docker. Añade una política de rotación en docker-compose.yml para evitar que los logs llenen el disco:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"Actualización de la imagen. RustDesk publica nuevas versiones regularmente. Para actualizar con mínimo tiempo de inactividad percibido:
docker compose pull
docker compose up -dDocker reemplaza los contenedores uno a uno. Las sesiones en curso a través de hbbr se cortan durante el reinicio (pocos segundos) — prefiere las actualizaciones en horas de menor actividad. Las claves en ./data/ se conservan — no se requiere reconfiguración de clientes.
Resolver problemas comunes
Conexión imposible, ID no encontrado. Verifica que hbbs está ejecutándose (docker ps) y que los puertos TCP 21115-21116 y UDP 21116 son accesibles desde el exterior: nc -vz <ip-vps> 21116. Si el test falla, el firewall de red (ufw o regla del VPS) está bloqueando el puerto.
'Clave incorrecta' en el cliente. La clave mostrada en el cliente no coincide con id_ed25519.pub en el servidor. Vuelve a leer el valor exacto con cat /opt/rustdesk/data/id_ed25519.pub y reconfigura el cliente — ojo con los espacios o saltos de línea al copiar y pegar.
Siempre en modo relay, nunca P2P. El hole punching UDP falla si una de las dos redes usa NAT simétrico (habitual en algunas redes móviles 4G/5G y VPN corporativas). No es un bug — el relay funciona correctamente, con una latencia ligeramente mayor. Para forzar el diagnóstico, compara los logs de hbbr con y sin VPN activo en el lado del cliente.
Interfaz de administración inaccesible. El puerto 21114 no está expuesto en el docker-compose.yml base — hay que añadirlo explícitamente o acceder a través del reverse proxy nginx del paso 4. Comprueba también que estás usando la imagen rustdesk-server-pro (la versión open source no tiene interfaz de administración).
Actualización de imagen sin regenerar claves. Tras docker compose pull && docker compose up -d, verifica que ./data/id_ed25519.pub no ha cambiado — no debería, pero la corrupción del volumen puede en raras ocasiones regenerar el par. Si la clave ha cambiado, todos los clientes necesitarán reconfiguración.