RustDesk es una aplicación de escritorio remoto de código abierto, alternativa a TeamViewer y AnyDesk. Por defecto los clientes usan los servidores públicos de RustDesk, pero puedes alojar tu propio servidor para que el registro de equipos y el tráfico de relay pasen solo por tu infraestructura. En este tutorial desplegarás el servidor RustDesk con Docker Compose en Ubuntu 24.04, abrirás los puertos necesarios y configurarás los clientes para que lo usen.
Requisitos previos
Para seguir esta guía necesitas:
- Un servidor con Ubuntu 24.04 LTS e IP pública, por ejemplo un VPS de CubePath. Con 1 vCPU y 1 GB de RAM es suficiente para un equipo pequeño; el consumo crece con el tráfico que pasa por el relay.
- Un usuario no root con privilegios
sudo. - Docker Engine y el plugin de Docker Compose instalados desde el repositorio oficial de Docker.
- Opcional: un nombre de dominio con un registro A que apunte al servidor, por ejemplo
rustdesk.your_domain. Si no lo tienes, usa la IPyour_server_ip.
Cómo funciona el servidor RustDesk
El servidor open source tiene dos componentes:
| Componente | Función | Puertos |
|---|---|---|
hbbs | Servidor de ID (rendezvous): registra los equipos y les ayuda a conectarse directamente entre sí | 21115/tcp, 21116/tcp, 21116/udp, 21118/tcp |
hbbr | Relay: reenvía el tráfico cuando la conexión directa entre equipos no es posible | 21117/tcp, 21119/tcp |
Los puertos 21118 y 21119 solo los usa el cliente web. Si no lo vas a usar, no hace falta abrirlos.
Paso 1: Crear el archivo de Docker Compose
Crea un directorio para el servicio. Los datos, incluido el par de claves del servidor, se guardarán en su subdirectorio data:
sudo mkdir -p /opt/rustdesk
cd /opt/rustdesk
Crea el archivo compose.yaml:
sudo nano /opt/rustdesk/compose.yaml
services:
hbbs:
container_name: hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs
volumes:
- ./data:/root
network_mode: host
depends_on:
- hbbr
restart: unless-stopped
hbbr:
container_name: hbbr
image: rustdesk/rustdesk-server:latest
command: hbbr
volumes:
- ./data:/root
network_mode: host
restart: unless-stopped
network_mode: host hace que los contenedores escuchen directamente en los puertos del servidor. Así hbbs ve la IP pública real de los clientes, necesaria para la conexión directa entre equipos (hole punching). Ambos servicios comparten el directorio data, donde hbbs genera las claves.
Paso 2: Arrancar el servidor
Descarga la imagen y arranca los contenedores en segundo plano:
sudo docker compose up -d
Comprueba que los dos contenedores están en ejecución:
sudo docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
hbbr rustdesk/rustdesk-server:latest "hbbr" hbbr 20 seconds ago Up 19 seconds
hbbs rustdesk/rustdesk-server:latest "hbbs" hbbs 20 seconds ago Up 19 seconds
Verifica que los puertos están a la escucha:
sudo ss -tulpn | grep -E ':2111[5-9]'
Debes ver hbbs en 21115, 21116 (TCP y UDP) y 21118, y hbbr en 21117 y 21119.
Paso 3: Obtener la clave pública del servidor
En el primer arranque, hbbs genera un par de claves Ed25519 en data. Los clientes usan la clave pública para verificar que hablan con tu servidor y cifrar la conexión. Muéstrala:
sudo cat /opt/rustdesk/data/id_ed25519.pub
OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=
Copia ese valor; lo necesitarás en cada cliente.
Importanteel archivo
data/id_ed25519es la clave privada del servidor. Inclúyelo en tus copias de seguridad. Si se pierde y se genera una nueva, tendrás que actualizar la clave en todos los clientes.
Paso 4: Abrir los puertos en el firewall
Permite los puertos del servidor en UFW. Asegúrate de mantener permitido SSH antes de activar el firewall:
sudo ufw allow OpenSSH
sudo ufw allow 21115:21117/tcp
sudo ufw allow 21116/udp
sudo ufw enable
Si vas a usar el cliente web, añade también sudo ufw allow 21118:21119/tcp. Comprueba las reglas:
sudo ufw status
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
21115:21117/tcp ALLOW Anywhere
21116/udp ALLOW Anywhere
NotaDocker modifica iptables para los puertos que publica, pero aquí los contenedores usan la red del host, así que las reglas de UFW sí se aplican a RustDesk.
Paso 5: Configurar los clientes
Instala el cliente RustDesk en los equipos desde la página de descargas oficial o desde las versiones en GitHub. Después, en cada cliente:
- Abre Ajustes y entra en Red.
- Desbloquea la configuración de red si el cliente lo pide y abre Servidor de ID/Relay.
- En Servidor de ID, escribe
rustdesk.your_domainoyour_server_ip. - Deja Servidor Relay vacío: el cliente usará el mismo host. Deja vacío también Servidor API, que solo se usa en la edición de pago.
- En Key, pega la clave pública del paso 3 y guarda.
En la parte inferior de la ventana principal, el cliente debe mostrar Listo en lugar de un error de conexión. Configura dos equipos de la misma forma y conéctate de uno a otro con el ID que muestra el equipo remoto.
Para no repetir la configuración a mano, en un cliente ya configurado abre Ajustes > Red, usa la opción de exportar la configuración del servidor y copia la cadena resultante. En los clientes Linux puedes importarla desde la terminal:
sudo rustdesk --config 'cadena_exportada'
Paso 6: Acceso desatendido en un equipo Linux
Para conectarte a un equipo sin que nadie acepte la conexión, define una contraseña permanente. En el cliente Linux, que instala el servicio rustdesk con el paquete .deb, ejecuta como root:
sudo rustdesk --password 'your_strong_password'
Usa una contraseña larga y única: cualquiera con el ID del equipo y esta contraseña puede controlarlo. Consulta el ID que debes usar desde el equipo que se conecta:
rustdesk --get-id
Comprueba que el servicio está activo para que el equipo acepte conexiones aunque no haya ninguna sesión iniciada:
systemctl status rustdesk
Paso 7: Actualizar y hacer copias de seguridad
Para actualizar el servidor, descarga la imagen nueva y recrea los contenedores. Los datos y las claves se conservan en data:
cd /opt/rustdesk
sudo docker compose pull
sudo docker compose up -d
Guarda una copia del directorio data, que contiene las claves y la base de datos de equipos registrados:
sudo tar -czf /root/rustdesk-data-$(date +%F).tar.gz -C /opt/rustdesk data
Solución de problemas
El cliente muestra un error de conexión o "Key mismatch". Comprueba que la clave del cliente coincide exactamente con el contenido de id_ed25519.pub, sin espacios ni saltos de línea. Revisa los logs del servidor:
sudo docker compose logs --tail 50 hbbs
Los clientes no llegan al servidor. Desde un equipo externo, comprueba que los puertos TCP responden:
nc -zv your_server_ip 21116
nc -zv your_server_ip 21117
Si fallan, revisa sudo ufw status y cualquier firewall externo al servidor.
Las conexiones son lentas. Si la conexión directa entre equipos no es posible (NAT estricto en alguno de los dos extremos), todo el tráfico pasa por hbbr y la latencia depende de la ubicación del servidor. Elige una ubicación cercana a tus usuarios. Verifica también que el puerto 21116/udp está abierto, porque se usa para la conexión directa.
Conclusión
Tienes un servidor RustDesk propio en Ubuntu 24.04 funcionando con Docker Compose, con los puertos necesarios abiertos y los clientes verificando la clave pública de tu servidor. Como siguientes pasos, puedes distribuir la cadena de configuración a todos tus equipos, programar la copia de seguridad del directorio data con un temporizador de systemd, o limitar en UFW el acceso a los puertos de RustDesk a los rangos de IP de tu oficina si todos los clientes se conectan desde allí.
