Install a CS 1.6 Server on Debian 12

June 4, 2026 Daemon666 8 min read

Debian 12 "bookworm" is a clean, stable base for a CS 1.6 server, but HLDS is a 32-bit binary, so the one thing that trips people up on a fresh 64-bit Debian is the missing i386 libraries. This walks through the whole install: enable multi-arch, install the 32-bit runtime, pull the game files with SteamCMD, and launch under a non-root user.

1. Update and create a service user

Never run a game server as root. As root, update the system and make a dedicated user:

apt update && apt upgrade -y
adduser --disabled-password --gecos "" csserver

Everything from here on runs as csserver. Switch to it:

su - csserver

2. Enable the i386 architecture

HLDS and SteamCMD are 32-bit. On 64-bit Debian you must add the i386 architecture before the libraries are installable. As root:

dpkg --add-architecture i386
apt update

Skip this and the 32-bit packages in the next step simply will not be found, and HLDS later fails to start with a loader error about a missing library.

3. Install the 32-bit libraries and tools

As root, install the runtime HLDS needs plus the tools to fetch it:

apt install -y lib32gcc-s1 lib32stdc++6 ca-certificates curl tar

lib32gcc-s1 and lib32stdc++6 are the 32-bit C/C++ runtimes the engine links against — the two libraries whose absence causes the classic error while loading shared libraries on first launch. ca-certificates lets SteamCMD validate its TLS connection.

4. Install SteamCMD

Back as csserver, download and unpack SteamCMD into its own folder:

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

The general SteamCMD setup, including the Valve-hosted download, is covered in installing SteamCMD on Linux if you want the detail. Run it once to let it self-update:

./steamcmd.sh +quit

5. Download the CS 1.6 server files

The CS 1.6 dedicated server is Steam app 90. Because app 90 is an old HLDS package, set its mod config to cstrike and validate. Run SteamCMD with an anonymous login:

./steamcmd.sh +force_install_dir ~/hlds \
  +login anonymous \
  +app_set_config 90 mod cstrike \
  +app_update 90 validate \
  +quit

App 90 is notorious for needing a few retries — if it stops partway, run the exact same command again and it resumes. Keep going until it reports the install as fully up to date. For the safety considerations around where server files come from, see downloading server files safely.

6. First launch

Change into the install and start HLDS with a sane command line:

cd ~/hlds
./hlds_run -game cstrike +ip 0.0.0.0 -port 27015 \
  +map de_dust2 +maxplayers 20 +sv_lan 0

sv_lan 0 is required to reach the master list; the default port 27015 is UDP. If it boots to the console and prints the map loading, the install works. From here, consider swapping HLDS for ReHLDS for performance, and set up a systemd service so it survives reboots.

7. Open the firewall and lock down access

A running server that nobody can reach is a firewall problem. Debian 12 ships without a running firewall by default, but a VPS provider often adds one. If you use ufw, allow the game port as UDP:

ufw allow 27015/udp

CS 1.6 is UDP-only, so a TCP rule passes nothing — a frequent cause of "the server runs but the browser never sees it." Set a strong rcon_password in server.cfg before you expose the box, because an open RCON port on a public IP is found within hours. The full port list, including the master-server ports, is in the firewall ports guide.

Common errors

  • error while loading shared libraries: libstdc++.so.6 — the 32-bit libraries are missing. Enable i386 and install lib32gcc-s1 and lib32stdc++6.
  • SteamCMD: Failed to install app '90' (Missing file permissions) — you ran it as root earlier and the files are root-owned. Fix ownership: chown -R csserver:csserver ~/hlds.
  • app_update 90 stalls or errors partway — a known app-90 quirk. Re-run the identical command; it resumes.
  • Server starts but is not in the browsersv_lan 1, or UDP 27015 is closed. Set sv_lan 0 and open the port; see firewall ports and server not in master list.
  • hlds_run: not found even though it exists — a 32-bit loader is missing, or you are in the wrong directory. Confirm the i386 libs and run from ~/hlds.

Verification

With the server running, from another machine open the console in CS and connect <server-ip>:27015. You should join and see de_dust2. On the server, status lists you as a player. Then confirm it appears in the internet server browser after a minute — if you can join from outside and it lists publicly, the Debian 12 install is complete and you can move on to a systemd service and ReHLDS.

Участники: Daemon666 ✦
Поделиться: