Cómo crear un servidor de Counter-Strike en VPS Linux con SRCDS
Tutorial paso a paso para montar un servidor dedicado de Counter-Strike (CS 1.6 o CS2) en VPS Linux usando SteamCMD, SRCDS, firewall y systemd.
Montar tu propio servidor de Counter-Strike en una VPS Linux da control total sobre tick rate, plugins, mapas custom y reglas anti-cheat — cosas que los servidores compartidos en hostings game-as-a-service normalmente no permiten ajustar. Este tutorial cubre la instalación de SRCDS (Source Dedicated Server) en una VPS Ubuntu 24.04, con foco en CS:GO (AppID 232330) y variantes basadas en el mismo engine. Los mismos pasos, ajustando el AppID, funcionan para CS 1.6 vía HLDS.
Persona de esta guía: desarrollador u owner de comunidad que ya tiene familiaridad con SSH y la línea de comandos Linux, y quiere ejecutar un servidor público o privado para clan, entrenamiento o comunidad. Tiempo estimado de ejecución: 30 a 45 minutos desde cero hasta el primer jugador conectado, sin contar el tiempo de descarga de los assets de Steam (3-4 GB para CS:GO).
No vamos a tratar plugins Metamod/SourceMod, anti-cheat externo ni panel web — el objetivo es dejar el binario SRCDS funcionando de forma confiable con systemd, firewall configurado y capaz de aparecer en la búsqueda pública de Steam.
Requisitos previos
Necesitas una VPS Linux con Ubuntu 24.04 LTS, mínimo 2 vCPUs y 2 GB de RAM para CS:GO (1 vCPU y 1 GB cubren CS 1.6), 10 GB de disco libre, acceso root o un usuario con sudo, y un GSLT (Game Server Login Token) generado en steamcommunity.com/dev/managegameservers si quieres un servidor público de CS:GO.
La VPS necesita IP IPv4 pública dedicada — los servidores Steam no funcionan detrás de NAT compartido sin port forwarding explícito, y la mayoría de los hostings de VPS ya entrega IP dedicada por defecto. El puerto UDP principal será 27015. El bloqueo de UDP en proveedores genéricos es común, así que confirma con el soporte del proveedor antes de continuar.
Ubuntu 24.04 LTS 27015 27015 232330 90 10 GB Preparar el sistema
SRCDS es un binario de 32 bits, así que incluso en una VPS x86_64 moderna necesitas habilitar la arquitectura i386 e instalar las librerías compatibles. SteamCMD también depende de libstdc++ específicas.
Actualiza los paquetes del sistema:
sudo apt update && sudo apt upgrade -yReinicia solo si se actualiza el kernel (sudo reboot). De lo contrario, continúa directo.
Habilita la arquitectura de 32 bits e instala las dependencias:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y lib32gcc-s1 lib32stdc++6 libcurl4-gnutls-dev:i386 \
ca-certificates wget curl tar screen ufwLos paquetes :i386 son obligatorios — SRCDS se queja con un error genérico de “library not found” si faltan, sin decir cuál.
Crea un usuario dedicado para el servidor (nunca ejecutes SRCDS como root):
sudo useradd -m -s /bin/bash csserver
sudo passwd csserverEjecutar como root expone el sistema entero si el servidor es explotado por algún bug del engine. Un usuario dedicado aísla el proceso.
Instalar SteamCMD y descargar el servidor
SteamCMD es la utilidad oficial de Valve para instalar y actualizar servidores dedicados. Descarga el contenido del mismo CDN del cliente Steam.
Cambia al usuario csserver y crea la estructura de carpetas:
sudo su - csserver
mkdir -p ~/steamcmd ~/csgo-server
cd ~/steamcmdDescarga y extrae SteamCMD:
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
tar -xvzf steamcmd_linux.tar.gz
rm steamcmd_linux.tar.gzLa primera ejecución de SteamCMD auto-actualiza la utilidad y descarga runtime adicional — espera unos minutos.
Instala el CS:GO Dedicated Server (AppID 232330):
./steamcmd.sh +force_install_dir /home/csserver/csgo-server \
+login anonymous \
+app_update 232330 validate \
+quitPara CS 1.6 (HLDS), reemplaza por:
./steamcmd.sh +force_install_dir /home/csserver/cs16-server \
+login anonymous \
+app_update 90 validate \
+quitLa descarga es de aproximadamente 3-4 GB para CS:GO y 300 MB para CS 1.6. Si la conexión se cae a mitad, ejecuta el mismo comando — SteamCMD continúa desde donde paró y validate corrige archivos corruptos.
Si aparece “AppID 740 — Server is updating”, espera 30 segundos y ejecuta de nuevo. Es el propio SteamCMD descargando dependencias de CS:GO en paralelo.
Configurar el firewall y los puertos
El servidor escucha en UDP 27015 (game + query Steam). TCP 27015 también se usa para RCON cuando está habilitado. Liberar estos puertos en UFW es obligatorio.
Configura UFW liberando SSH y los puertos de CS:
exit # vuelve al usuario sudo
sudo ufw allow 22/tcp
sudo ufw allow 27015/udp
sudo ufw allow 27015/tcp
sudo ufw --force enable
sudo ufw status numberedConfirma que SSH (22/tcp) esté liberado antes de habilitar — te desconectas y quedas atrapado fuera de la VPS en caso contrario.
UFW solo controla el firewall local de la VPS. Varios proveedores tienen un segundo firewall externo en el borde de la red que necesita ajustarse en su panel. Si el servidor arranca pero nadie logra conectar, casi siempre es eso.
Crear el archivo de configuración
El server.cfg define nombre, contraseña (opcional), reglas de juego y parámetros de red. Sin él, el servidor arranca con los defaults de Valve.
Vuelve al usuario csserver y crea el archivo:
sudo su - csserver
nano ~/csgo-server/csgo/cfg/server.cfgPega una plantilla mínima funcional:
hostname "Mi Servidor CS:GO ES"
rcon_password "CAMBIA_POR_ALGO_FUERTE"
sv_password ""
sv_lan 0
sv_region 4
mp_friendlyfire 0
sv_cheats 0
sv_pure 1
mp_autoteambalance 1
mp_limitteams 1
mp_maxrounds 30
log on
sv_logbans 1
sv_logecho 1
sv_logfile 1sv_region 4 corresponde a América del Sur — ayuda en el filtro de ubicación en Steam. rcon_password debe ser larga y única; RCON expuesto con contraseña débil es un vector común de takeover.
Configurar systemd para que el servidor inicie en el boot
Ejecutar SRCDS dentro de screen funciona para pruebas, pero en producción usa systemd — restart automático en crash, logs centralizados vía journalctl y arranque automático al boot de la VPS.
Crea el servicio systemd (como root):
exit
sudo nano /etc/systemd/system/csgo.serviceContenido:
[Unit]
Description=CS:GO Dedicated Server
After=network.target
[Service]
Type=simple
User=csserver
WorkingDirectory=/home/csserver/csgo-server
ExecStart=/home/csserver/csgo-server/srcds_run -game csgo -console -usercon \
+game_type 0 +game_mode 1 +mapgroup mg_active +map de_dust2 \
-tickrate 128 -port 27015 +sv_setsteamaccount TU_GSLT_AQUI \
-maxplayers_override 16
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.targetSustituye TU_GSLT_AQUI por el token generado en steamcommunity.com/dev/managegameservers. Sin un GSLT válido, el servidor no aparece en la búsqueda pública de CS:GO desde 2016.
Habilita e inicia el servidor:
sudo systemctl daemon-reload
sudo systemctl enable csgo.service
sudo systemctl start csgo.service
sudo systemctl status csgo.serviceEl status debe mostrar active (running) y algunas líneas de log de SRCDS arrancando.
Verificación
Confirma que el servidor está respondiendo en el puerto correcto y es visible externamente.
Verifica el proceso y el puerto:
sudo ss -ulnp | grep 27015
sudo journalctl -u csgo.service -n 50 --no-pagerDebes ver *:27015 en LISTEN UDP y logs mostrando el mapa de_dust2 cargado.
En el cliente Steam, abre la consola (~) y conecta:
connect TU_IP_DE_LA_VPS:27015Si conecta, el servidor está operacional. Para la búsqueda pública, ve a “Servidores de la Comunidad” en el menú de CS:GO — el servidor aparece en 2-5 minutos tras el registro con GSLT válido.
Resolución de problemas
El servidor arranca pero no acepta conexiones
Casi siempre es el firewall externo del proveedor (no UFW) bloqueando UDP 27015. Prueba con nmap -sU -p 27015 TU_IP desde otra máquina. Si devuelve “filtered”, contacta al soporte del proveedor.
”Server is enforcing secure connections, your client is not”
VAC deshabilitado en el cliente o versión desactualizada. Para debug en red local sin VAC, agrega -insecure en la línea del ExecStart, pero nunca en producción pública.
Lag/spikes a pesar de CPU OK
SRCDS es single-threaded — si un core está saturado por otro proceso, el tick se atrasa. Usa htop y confirma que el core donde corre SRCDS está por debajo del 70% durante los picos. En VPS con vCPU compartida, pide migración a un plan con CPU dedicada.
Próximos pasos
Con el servidor base operacional, algunos caminos comunes de evolución:
- Instalar SourceMod + Metamod para plugins (admin, mapas custom, anti-cheat plugin)
- Configurar workshop collection con mapas competitivos vía
+host_workshop_collection - Agregar un segundo servidor en la misma VPS en el puerto 27016 para servidor de pug/aim
- Configurar backup automático de logs y configs con cron + rsync hacia storage remoto
- Monitorear performance con
systemd-cgtopo Netdata para visualizar el uso por instancia
Si estás llevando varios servidores a producción, una VPS Hostini de la línea /jogos ya viene con IP dedicada, sin oversell de CPU y puertos UDP liberados por defecto — dos dolores comunes al migrar desde hostings genéricos para ejecutar un servidor de juego competitivo con tick 128.
Preguntas frecuentes
¿Cuál es la diferencia entre HLDS y SRCDS para Counter-Strike?
HLDS (Half-Life Dedicated Server) es el binario usado por CS 1.6 y mods basados en el engine GoldSrc. SRCDS (Source Dedicated Server) ejecuta CS:Source, CS:GO y — con adaptaciones vía Steam — CS2. La instalación con SteamCMD usa AppIDs distintos: 90 para HLDS/CS 1.6 y 232330 para CS:GO. CS2 actualmente no tiene un binario dedicado público estable y suele alojarse en infraestructura propia.
¿Cuánta RAM y CPU necesito para un servidor de CS estable?
Para CS 1.6 con hasta 32 slots, 1 vCPU dedicada y 1 GB de RAM son suficientes. Para CS:GO con 16-20 slots en tick 64, planifica 2 vCPUs y 2 GB de RAM. Tick 128 duplica la demanda de CPU — prefiere 3 GHz+ por core, ya que SRCDS es single-threaded por instancia. El disco importa menos: 10 GB cubren la instalación y los mapas custom.
¿Por qué el servidor no aparece en la búsqueda de Steam aunque esté en ejecución?
Tres causas comunes: el puerto UDP 27015 está bloqueado en el firewall del proveedor (no solo en el ufw de la VPS), el parámetro +sv_lan está en 1 (debe ser 0 para internet), o el servidor no tiene GSLT (Game Server Login Token) configurado — obligatorio para CS:GO público desde 2016. Verifica cada punto antes de reinstalar.
¿Se pueden ejecutar varios servidores en la misma VPS?
Sí. Cada instancia SRCDS corre en un puerto UDP distinto (27015, 27016, 27017, etc) y usa configs separadas vía el parámetro +port. Cada servidor consume una vCPU plena durante los picos, así que no pases de N-1 instancias donde N es el número de vCPUs de la VPS, dejando margen para el sistema.
¿Qué es el tick rate y cómo lo aumento a 128?
El tick rate es cuántas veces por segundo el servidor procesa el input de los jugadores. CS:GO por defecto usa 64. Para 128, agrega -tickrate 128 en los parámetros de inicio del srcds_run. Tick 128 mejora la precisión de disparos y movimiento pero exige CPU más rápida y mayor ancho de banda por jugador (~30 KB/s vs 15 KB/s en tick 64).
¿Cómo actualizo el servidor cuando sale un parche de Valve?
Ejecuta nuevamente steamcmd con el mismo comando de instalación — detecta la diferencia y baja solo el delta. Detén el systemd antes (sudo systemctl stop csgo), actualiza y vuelve a iniciar. En servidores públicos de CS:GO, mantenerlo desactualizado hace que desaparezca de la búsqueda hasta que coincida con la versión actual del cliente.