Cómo crear un servidor Rust en VPS Linux desde cero (Ubuntu 24.04)

Aprende a crear un servidor Rust en VPS Linux paso a paso: instalación con SteamCMD, configuración de puertos, oxide/uMod y systemd persistente.

Rust es uno de los juegos de supervivencia multijugador más exigentes en infraestructura — mapa procedural enorme, miles de entidades persistentes y física constante dejan al servidor con un perfil de carga próximo al de una base de datos en pico. Levantar un servidor dedicado propio da control total sobre el wipe schedule, plugins, tasa de gather y reglas de la comunidad, pero exige una VPS Linux correctamente configurada.

Este tutorial muestra el camino completo para crear un servidor Rust en VPS Linux desde cero: instalación de SteamCMD, descarga de RustDedicated, configuración de puertos, integración opcional con oxide/uMod para plugins, y persistencia mediante systemd para sobrevivir a reboots. Persona objetivo: propietario nuevo de servidor que quiere levantar una instancia vanilla o moderada sin depender de un panel propietario.

Tiempo estimado de ejecución: 60 a 90 minutos, de los cuales ~15-20 minutos corresponden a la generación procedural del mapa en el primer arranque — no es un cuelgue, es trabajo real de RustDedicated creando el mundo. Terminas el tutorial con un servidor accesible en la lista de la comunidad y auto-restart configurado.

Prerrequisitos

Antes de empezar, confirma que tu VPS cumple los requisitos mínimos. Rust es exigente — subdimensionar resulta en rubber-banding, lag spikes y crashes durante wipes.

Prerrequisitos de hardware y acceso

VPS con Ubuntu 24.04 LTS (o 22.04 LTS), 8 GB de RAM mínimo (16 GB recomendado para 50+ slots), 4 vCPUs, 30 GB de SSD libres e IPv4 público dedicado. Acceso root vía SSH y puertos de salida 27015-27020 y 28015-28017 liberados en el firewall del proveedor.

Sistema Ubuntu 24.04 LTS
RAM mínima 8 GB
Puerto de juego 28015/UDP
Puerto RCON 28016/TCP
Puerto query 28017/UDP

Conéctate a la VPS por SSH antes de continuar — todo el procedimiento corre remotamente.

Preparación del sistema y usuario dedicado

Correr un servicio de juego como root es un antipatrón de seguridad. Vamos a crear un usuario dedicado para RustDedicated, con home propio y sin permisos sudo. En caso de que el proceso sea comprometido, el atacante no tiene una escalada fácil a root.

01

Actualiza el sistema e instala las dependencias necesarias para SteamCMD:

sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common
sudo add-apt-repository -y multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y lib32gcc-s1 lib32stdc++6 libsdl2-2.0-0:i386 \
  curl wget tar unzip screen ufw

SteamCMD todavía depende de librerías de 32 bits (i386) incluso en un sistema de 64 bits — esa es la razón del dpkg --add-architecture i386.

02

Crea el usuario rust dedicado, sin login directo por contraseña:

sudo adduser --disabled-password --gecos "" rust
sudo mkdir -p /home/rust/server
sudo chown -R rust:rust /home/rust

De aquí en adelante, todos los comandos del servidor corren con sudo -u rust o después de sudo su - rust.

03

Configura el firewall liberando solo lo necesario:

sudo ufw allow OpenSSH
sudo ufw allow 28015/udp comment 'Rust game'
sudo ufw allow 28016/tcp comment 'Rust RCON'
sudo ufw allow 28017/udp comment 'Rust query'
sudo ufw --force enable
sudo ufw status verbose
RCON expuesto en internet

El puerto 28016 (RCON) acepta comandos administrativos. En producción, restríngelo por IP en UFW: sudo ufw allow from TU_IP_ADMIN to any port 28016 proto tcp en lugar de liberarlo al mundo. RCON con contraseña débil expuesto es un vector común de toma de servidor.

Instalación de SteamCMD y RustDedicated

SteamCMD es el cliente de línea de comandos de Steam usado para descargar y actualizar servidores dedicados. RustDedicated se distribuye vía app ID 258550 y tiene aproximadamente 8 GB de descarga inicial.

04

Cambia al usuario rust y descarga SteamCMD:

sudo su - rust
mkdir -p ~/steamcmd && cd ~/steamcmd
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -

El tar zxvf - descomprime directo desde el stdout de curl, evitando un archivo intermedio.

05

Descarga RustDedicated vía SteamCMD (descarga anónima, sin login Steam):

cd ~/steamcmd
./steamcmd.sh +force_install_dir /home/rust/server \
  +login anonymous \
  +app_update 258550 validate \
  +quit

Este comando demora 10-25 minutos dependiendo del ancho de banda de la VPS. El parámetro validate hace checksum de todos los archivos — úsalo siempre en primera instalación y en updates después de wipe forzado por Facepunch (primer jueves de cada mes).

06

Confirma que el binario existe y es ejecutable:

ls -la /home/rust/server/RustDedicated
file /home/rust/server/RustDedicated

Salida esperada: archivo ELF 64-bit LSB executable, dinámicamente enlazado. Si ls no lo encuentra, la descarga falló silenciosamente — vuelve a ejecutar el paso 05 y observa la salida completa de SteamCMD buscando ERROR! Failed to install app '258550'.

Configuración inicial del servidor

Antes del primer arranque, configura los parámetros que definen identidad, tamaño del mapa, slots y nombre del servidor. Estos parámetros van en un script de inicio — facilita ajustes futuros sin alterar units de systemd.

07

Crea el script de start en /home/rust/server/start.sh:

nano /home/rust/server/start.sh

Contenido:

#!/bin/bash
cd /home/rust/server

exec ./RustDedicated -batchmode -nographics \
  +server.identity "hostini" \
  +server.port 28015 \
  +server.queryport 28017 \
  +rcon.port 28016 \
  +rcon.password "CAMBIA_ESTA_CONTRASENA_FUERTE" \
  +rcon.web 1 \
  +server.maxplayers 50 \
  +server.hostname "Mi Servidor Rust" \
  +server.description "Servidor vanilla, wipe quincenal" \
  +server.url "https://hostini.com.br" \
  +server.headerimage "https://i.imgur.com/TU_BANNER.png" \
  +server.seed 1337 \
  +server.worldsize 3500 \
  +server.saveinterval 300 \
  +server.tickrate 30

Hazlo ejecutable:

chmod +x /home/rust/server/start.sh
Elección de seed y worldsize

El par (seed, worldsize) define el mapa procedural — el mismo par genera siempre el mismo mapa. Mapas de 3000 arrancan en 5 minutos y caben cómodamente en 50 slots; 4500 duplica el tiempo de generación y exige 16+ GB de RAM. Evita worldsize por encima de 4500 sin hardware dedicado.

08

Haz el primer arranque manual para generar el mapa y validar la config:

cd /home/rust/server
./start.sh

Verás logs de Unity, después Generating procedural map. En 5-15 minutos aparece Server startup complete — el servidor está aceptando conexiones. Presiona Ctrl+C para detenerlo y seguir con la persistencia vía systemd.

Persistencia con systemd

Mantener el servidor corriendo dentro de screen o tmux funciona pero no sobrevive a reboots. systemd es la solución estándar Linux: el servidor arranca en boot, reinicia ante crash y queda monitoreado por journalctl.

09

Sal del usuario rust y crea la unit como root:

exit  # vuelve a root
sudo nano /etc/systemd/system/rust.service

Contenido:

[Unit]
Description=Rust Dedicated Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=rust
Group=rust
WorkingDirectory=/home/rust/server
ExecStart=/home/rust/server/start.sh
Restart=on-failure
RestartSec=15
StandardOutput=append:/home/rust/server/logs/server.log
StandardError=append:/home/rust/server/logs/server.err
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Crea el directorio de logs y ajusta permisos:

sudo -u rust mkdir -p /home/rust/server/logs
sudo systemctl daemon-reload
sudo systemctl enable --now rust.service
10

Acompaña el startup en tiempo real:

sudo journalctl -u rust.service -f

Cuando veas Server startup complete, el servidor está listo. Usa Ctrl+C para salir del follow del journal — eso no detiene el servidor.

Plugins opcionales con oxide/uMod

Para un servidor totalmente vanilla, salta esta sección. Para moderación custom, economía, kits, anti-cheat u otras funcionalidades comunes en servidores hispanos, oxide/uMod es el framework estándar.

11

Detén el servidor antes de instalar oxide:

sudo systemctl stop rust.service

Descarga e instala oxide.rust dentro del directorio del servidor:

sudo -u rust bash -c "cd /home/rust/server && \
  wget -q https://umod.org/games/rust/download/develop -O oxide.zip && \
  unzip -o oxide.zip && \
  rm oxide.zip"

Inicia el servidor de nuevo:

sudo systemctl start rust.service

Los plugins quedan en /home/rust/server/oxide/plugins/. Tras copiar un .cs a ese directorio, oxide lo compila y carga automáticamente — sin reiniciar el servidor.

Wipe forzado por Facepunch

Cada primer jueves del mes Facepunch fuerza wipe vía update del binario. Los plugins compilados para la versión anterior fallan hasta ser actualizados. Ten un script de auto-update de oxide o monitorea el canal #news del discord oficial de uMod para no dejar el servidor offline el día del force wipe.

Verificación

Confirma que todo está funcionando antes de divulgar la IP a los jugadores.

12

Verifica el estado del servicio:

sudo systemctl status rust.service

Debe mostrar active (running) y el PID del proceso RustDedicated.

13

Confirma que el servidor está escuchando en los puertos correctos:

sudo ss -tulpn | grep -E '28015|28016|28017'

Debes ver 3 líneas — una para cada puerto (UDP/TCP/UDP), todas asociadas al proceso RustDedicated.

14

Prueba la conexión del cliente Rust: abre el juego, consola (F1), escribe:

client.connect TU_IP_PUBLICA:28015

En 5-10 segundos caes en la pantalla de carga de assets del servidor. Tras un login exitoso, el servidor aparece automáticamente en la lista de la comunidad dentro de algunas horas.

Resolución de problemas

El servidor no aparece en la lista pública

Causa típica: puerto query (28017/UDP) bloqueado o IP detrás de CGNAT. Prueba desde fuera de la VPS:

nmap -sU -p 28017 TU_IP_PUBLICA

Si retorna open|filtered, ajusta el firewall del proveedor de hosting (no solo UFW interno). Si retorna filtered, la IP probablemente es CGNAT — requerirá IP dedicada.

El mapa se genera pero el servidor crashea en 2-3 minutos

Casi siempre es OOM (out of memory). Verifica vía dmesg | grep -i oom y el syslog. Solución inmediata: reducir worldsize a 3000 y maxplayers a 25. Solución real: upgrade a VPS con más RAM.

El update de RustDedicated rompe los plugins de oxide

Ejecuta el update de oxide antes de levantar el servidor después del force wipe:

sudo systemctl stop rust.service
sudo -u rust bash -c "cd /home/rust/server && \
  wget -q https://umod.org/games/rust/download/develop -O oxide.zip && \
  unzip -o oxide.zip && rm oxide.zip"
sudo systemctl start rust.service

Próximos pasos

Con el servidor corriendo, considera los próximos pasos para elevar la operación:

  • Configura backups automáticos del directorio server/hostini/ (mapa, save y blueprints) vía cron + rsync hacia storage externo.
  • Habilita RCON vía web interface (ya incluido en la config) para administración remota sin SSH.
  • Agrega plugins esenciales como AdminRadar, BetterChat y No Decay para personalizar la experiencia sin dejar el servidor demasiado pesado.
  • Implementa un schedule de wipe quincenal automático vía systemd timer.
  • Si lo estás llevando a producción para una comunidad real, una VPS Hostini ya viene con IPv4 dedicada, protección DDoS activa por defecto y SSD NVMe — tres requisitos que definen si tu servidor Rust se mantiene online en un día de raid coordinado o cae junto con la base.

Preguntas frecuentes

¿Cuánta RAM necesita una VPS para correr Rust dedicado?

El mínimo absoluto para un mapa de 3000 con 10 slots es 8 GB de RAM. Para mapas de 4500 con 50+ jugadores activos, 16 GB es el piso cómodo. Rust hace uso intensivo de memoria conforme crecen las entidades, deployables y la generación procedural — monitorear con htop tras algunas horas de gameplay es esencial.

¿Por qué RustDedicated consume tanta CPU incluso vacío?

La generación procedural del mapa corre en el primer arranque y puede tardar 5-15 minutos consumiendo 1 vCPU entera. Después de eso, el consumo idle queda entre 20-40% de una vCPU moderna. Los picos ocurren en wipe day y durante eventos como cargo ship, patrol heli y raidable bases.

¿Necesito IP dedicada para correr Rust?

Sí. Rust necesita IPv4 público estático para que el cliente conecte directo y para aparecer correctamente en el master server de Facepunch. CGNAT o IP compartida no funcionan — el servidor incluso arranca, pero los jugadores no logran conectarse desde la lista pública.

¿Puedo usar Wine para correr la versión Windows de RustDedicated en Linux?

Técnicamente sí, pero es innecesario. Facepunch mantiene el binario Linux nativo (RustDedicated) totalmente soportado y estable — rendimiento equivalente o mejor que Windows en la misma máquina. Wine solo añade overhead y puntos de falla.

¿Cómo hago wipe sin perder la base de jugadores?

Wipe es la eliminación controlada de los archivos .map y .sav en server/<identity>/. Para preservar progresión de jugadores (XP, blueprints), mantén el archivo player.blueprints.X.db. Wipes parciales (solo mapa, con BPs preservados) y wipes full (todo) son las dos estrategias más comunes, con cadencia típica de 2 semanas.

¿oxide/uMod afecta el rendimiento del servidor?

Sí, los plugins consumen CPU y memoria extras — la mayoría livianos, algunos pesados (anti-cheat custom, plugins de economía compleja). Empieza con 5-10 plugins esenciales y monitorea el tiempo de tick del servidor mediante fps en la consola. Por debajo de 30 fps en el servidor indica sobrecarga de plugins o hardware insuficiente.

Temas:
Próximos pasos VPS, dedicado o panel gestionado para FiveM, SAMP, MTA, Tibia y más.Aloja tu servidor de juegos con Hostini →
¿Te resultó útil este tutorial?
Hablar por WhatsApp