2hours.gg/

Servidores de juegos por horas. Paga solo cuando juegas.

Cómo ejecutar un servidor de juego solo para Windows en Linux

Algunos juegos de Steam solo traen un servidor dedicado para Windows. No hay binario Linux en el depot, así que el consejo habitual es «ejecútalo en una máquina Windows». No hace falta. Con Wine puedes ejecutar el servidor de Windows en una máquina Linux normal, y se conectará a Steam y aceptará jugadores reales. Esta es la receta exacta que nos funcionó, usando Alien Swarm: Reactive Drop (un juego co-op gratuito de Source) como ejemplo. El mismo enfoque debería servir para otros servidores dedicados de Source solo para Windows.

Primero, comprueba que de verdad no hay servidor Linux

No lo des por hecho. Pregúntale directamente a Steam antes de recurrir a Wine. Apunta steamcmd a la app y lee su lista de plataformas:

steamcmd +login anonymous +app_info_print <appid> +quit \
  | grep -iE "oslist|name"

Si la app del servidor dedicado es solo «oslist windows», no hay build Linux nativo al que recurrir. También puedes intentar forzar una instalación Linux; cuando de verdad no hay depot Linux, falla enseguida:

steamcmd +@sSteamCmdForcePlatformType linux \
  +login anonymous +app_update <appid> validate +quit
# ERROR! Failed to install app '<appid>' (Missing configuration)

Ese error, y que no aterrice ningún archivo ELF, lo confirma. Ahora Wine es el camino. Instala el servidor Y la app 1007 (los Steamworks Common Redistributables) en la misma carpeta, con el tipo de plataforma windows. La app 1007 trae las DLL de Steam que el servidor necesita, y verás por qué en el Paso 2:

steamcmd +@sSteamCmdForcePlatformType windows +login anonymous \
  +force_install_dir /path/to/server \
  +app_update <appid> validate \
  +app_update 1007 validate \
  +quit

Por qué falla el intento ingenuo con Wine

Ejecutar el servidor directamente desde Wine choca con dos muros seguidos:

  • Sin consola: el servidor espera un terminal de verdad. Redirigir desde /dev/null da CTextConsoleWin32::GetLine: !GetNumberOfConsoleInputEvents y nunca arranca.
  • No se puede cargar la biblioteca de Steam: incluso una vez que arranca, imprime «Unable to load Steam support library» y nunca se registra en Steam, así que nadie puede encontrarlo ni entrar.

Ambos tienen arreglo. Esta es la receta completa.

Paso 1: dale un terminal de verdad (PTY)

Una máquina sin pantalla no tiene terminal, y el servidor de consola de Windows se niega a arrancar sin uno. Envuelve el arranque en script, que asigna un pseudo-terminal, y usa Xvfb para una pantalla falsa:

Xvfb :99 -screen 0 1024x768x24 &
export DISPLAY=:99 WINEPREFIX=/wine
script -qfc "wine srcds_console.exe -console -condebug \
  -game <gamedir> +map <map> -port 27015" /tmp/server.log

Eso por sí solo hace que el servidor cargue un mapa y enlace su puerto de juego. Pero todavía no puede hablar con Steam.

Paso 2: dos DLL de Steam, dos fuentes distintas

El motor Source necesita AMBAS, steamclient.dll y steam.dll, junto al exe del servidor, y aquí está la trampa que nos costó una ronda entera extra de depuración: vienen de sitios DISTINTOS, y la app 1007 solo te da UNA de ellas.

  • steamclient.dll: viene de la app 1007 (Steamworks Common Redistributables), que instalaste en el Paso 1. Canónica, con versión coincidente, mantenida por Valve.
  • steam.dll: NO está en la app 1007. Es parte del CLIENTE de Steam, y la única forma limpia de conseguirla es ejecutar la steamcmd.exe de Windows una vez bajo Wine, que se autoactualiza y deja steam.dll (más steamclient.dll) en su propia carpeta.

Así que haz bootstrap de steam.dll con steamcmd.exe bajo Wine, y luego copia ambas DLL junto al exe del servidor:

# steam.dll: run Windows steamcmd once under Wine (needs Xvfb for a display)
cd "$WINEPREFIX/drive_c/steamcmd"
curl -fsSLO https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip
unzip -o steamcmd.zip
DISPLAY=:99 wine steamcmd.exe +quit    # lays down steam.dll + steamclient.dll

# place both next to the server exe
cd /path/to/server
cp "$WINEPREFIX/drive_c/steamcmd/steam.dll" .
[ -f steamclient.dll ] || cp "$WINEPREFIX/drive_c/steamcmd/steamclient.dll" .

Paso 3: por qué steam.dll es la pieza que importa

Esta es la parte que casi nadie apunta. El error dice «Unable to load Steam support library», y la biblioteca de soporte a la que se refiere no es steamclient.dll, es steam.dll. El motor Source busca steam.dll junto a su propio ejecutable para arrancar toda la cadena de Steam. Con solo steamclient.dll presente (que es todo lo que te da la app 1007) sigue fallando; en el momento en que steam.dll está junto al .exe, el log pasa del fallo al éxito:

Connection to Steam servers successful.
VAC secure mode is activated.

VAC no se activa a menos que el servidor sea un gameserver correctamente logueado, así que esa línea es tu prueba de que se registró. La mayoría de servidores Source se loguean aquí de forma anónima y no necesitan ningún Game Server Login Token (GSLT). Solo unos pocos juegos (como CS2) requieren uno.

La trampa: A2S se queda mudo pero el servidor está bien

Aquí está el truco que más tiempo nos costó, y la razón por la que casi nos rendimos. Bajo Wine el servidor NO responde a A2S_INFO, la consulta UDP que las herramientas usan para leer el nombre, el mapa y el número de jugadores de un servidor. Consúltalo y cada puerto agota el tiempo de espera, incluso desde la misma máquina. Si usas A2S como health check, el servidor parece completamente muerto.

No está muerto. Que A2S esté mudo bajo Wine no impide que entren jugadores reales. El navegador de servidores del juego lista los servidores desde la master list de Steam (a la que el servidor se anuncia por su cuenta), y una conexión directa usa el protocolo del juego, no A2S. Así que la prueba de verdad es un cliente conectándose, no una consulta respondiendo. Cuando por fin lo probamos, un jugador real se conectó y jugó al primer intento:

Client "player" connected (10.0.0.5:27005).
1/ 8 on map <mapname>

La lección práctica: para un servidor hospedado bajo Wine, no hagas health check con A2S. Comprueba algo que refleje de verdad que está vivo, como la línea «VAC secure mode is activated» en el log, la línea del número de jugadores, o una simple comprobación de que el puerto UDP del juego está enlazado.

¿Funciona esto con todos los juegos de Windows?

Sé honesto sobre el alcance. Lo probamos en un servidor con motor Source, y la misma receta (PTY, un runtime construido con steamcmd, steam.dll junto al exe) debería funcionar para otros servidores dedicados de Source solo para Windows. Los juegos en otros motores integran Steam de forma distinta, así que trátalos como experimentos aparte. Dos cosas que esperar en cualquier caso: los arranques son más lentos que en Linux nativo (Wine más el paso de steamcmd más el login de Steam), y el comportamiento de A2S mudo de arriba probablemente aplicará a todos.

O sáltate todo esto

Este es el tipo de trasteo que se come una tarde entera. Si solo quieres el servidor, nosotros gestionamos el parque Linux y la fontanería de Wine por ti, por hora, con una IP pública desde el primer minuto. Mira lo que hospedamos en 2hours.gg.

Ver también

← Volver a todas las guías