How to Install a CS 1.6 Dedicated Server on Linux
In this guide I will try to explain and show how to install a Counter-Strike 1.6 dedicated server on a rented VPS. I will go over how to pick a suitable configuration and connect to the machine, how to install the game server and run it so that it stays up around the clock.
First we connect to the machine over SSH, prepare the system and create a separate user. Then we sort out how HLDS differs from ReHLDS and why we are going to install the old build from the steam_legacy branch instead of the current one. After that we install SteamCMD, download the server, do a test run and bring it up inside screen so it keeps running after the SSH session is closed.
Next I will show how to replace the engine with ReHLDS and install the remaining server components: Metamod-r, AMX Mod X, ReGameDLL_CS, and much more. Then I show how to set them up to work together and do the initial configuration of the game server.
This guide is for people with no server administration experience. All commands are given in the right order, with an explanation of which user to run them from and what output should appear. By the end of part one you will have a clean working CS 1.6 server that anyone can connect to by IP.
Where to Host a CS 1.6 Server: Home PC vs VPS
Before installing anything it is worth deciding where the server is going to live. That affects both the setup and who will be able to connect to you at all.
CS 1.6 Server on a Home PC
The quickest way is to run the server right on your own machine. Nothing to pay for, everything is at hand, and settings can be changed on the fly. But it is not really a sensible option if you want a proper server. The computer has to stay on 24/7 under constant load, you need a dedicated IP and network configuration, DDoS protection, and so on. This method will not be covered in the guide.
Renting a VPS for a CS 1.6 Server
Hosting is a convenient way to create a Counter-Strike game server. Providers offer a wide choice of plans with stable connectivity and ping, automatic setup, and DDoS protection. The machine runs around the clock, it has its own static IP and a decent channel.
Picking a host is your job. There are plenty of providers, differing in price, hardware, location and terms. You can even find something free for a trial period, and that may well be enough to figure out how a CS 1.6 server is set up and how it runs.
CS 1.6 Dedicated Server Requirements
CPU. In Counter-Strike 1.6 the most important component is the processor. The GoldSrc engine is single-threaded, so the whole load lands on a single core and its frequency is what decides everything. Minimum is 2.5 GHz, three and above is better. One core is enough for that. If you plan to run more than one CS 1.6 server, use this as a reference point: 1 core - 1 server.
RAM. One gigabyte is perfectly enough for a CS 1.6 server. But if you want a full-featured game server with an http server for fast downloads of maps and resources, plus a database, then you need 2 GB.
SSD. 20+ GB per server, and that is with a lot of room to spare. The server files themselves take under a gigabyte, the rest goes to the system, maps, models and logs.
Operating system. Ubuntu is fine, but if there are no special requirements (an admin panel or something else), I would go with a clean Debian 13 x64. Less clutter in the system, less that can break.
Recommended VPS Configuration for CS 1.6
- CPU: 3+ GHz, 1 core
- RAM: 2 GB
- SSD: 20+ GB
- OS: Debian 13 x64
The screenshots below show an example of picking such a machine at one of the providers. Pay attention to the High Frequency line: that is what CS 1.6 needs, processors clocked above 3 GHz.
Connecting to Your Linux VPS via SSH
The machine is rented and running. Now you need to connect to it to do anything on it.
PuTTY and WinSCP
For managing and configuring the server I would recommend two programs: PuTTY for connecting over SSH and WinSCP for working with files through a familiar file manager. PuTTY is a terminal, you type commands into it. WinSCP will come in handy later, when you need to drop maps, configs or mods onto the server: drag them with the mouse from one window into the other and that is it.
First SSH Connection
Open your hosting control panel and go to the server settings. You will need the following details to connect:
- Server IP address
- Username, usually root
- Password
Open PuTTY, type the IP address into the Host Name field, leave the port at 22, create a session and connect. On the first login the program will ask about the host key, agree to it. Then enter the login and password. The password is not shown in the terminal in any way, not even as asterisks, this is normal, just type it and press Enter. If everything went through, you will see the command prompt. You are on the server.
Preparing Debian or Ubuntu for a CS 1.6 Server
A fresh system is almost ready to go, but a couple of things need finishing: update the packages and add what CS 1.6 will not start without.
Updating the System
The first thing to do after logging in is update the system. Type two commands in one line:
apt update && apt full-upgrade -y
apt update && apt full-upgrade -y to update all installed packages
Here apt update refreshes the list of available packages, full-upgrade installs fresh versions of everything already in the system, and the -y key automatically answers "yes" to every question so you do not have to confirm each step by hand. This takes anywhere from a few seconds to a couple of minutes.
32-bit Architecture Support
CS 1.6 is a 32-bit server, so on a 64-bit system you need i386 libraries.
First we allow the system to work with 32-bit architecture:
dpkg --add-architecture i386
After that the package list has to be updated once more so the system can see the 32-bit versions:
apt update
Installing Dependencies
Now we install the libraries themselves and a couple of useful utilities:
apt install -y lib32gcc-s1 lib32stdc++6 libc6:i386 wget tar
Here:
lib32gcc-s1,lib32stdc++6,libc6:i386- 32-bit libraries the server needs to runwget- a tool for downloading files from the networktar- an archiver
Creating a Dedicated Linux User for the CS 1.6 Server
For security reasons working under root on Linux systems is not recommended. The root user can do anything, including wiping the system by accident with a single typo. So I create a separate user, and that is who our server will live under.
Adding the User
Create a user, let us call it cs16:
adduser cs16
The system will ask you to set a password, then it will ask for a name, phone number and other nonsense, those fields can be skipped by just pressing Enter. Confirm at the end.
Sudo Rights and Switching Over
Add the new user to the sudo group so it can run commands with administrator rights:
usermod -aG sudo cs16
Switch over to it:
su - cs16
And just in case we refresh the package list under its name:
sudo apt update
HLDS vs ReHLDS: Which Server Engine to Use
A CS 1.6 server can be run on two different engines. One is official, from Valve, the other one is maintained by the community. Below, I sort out how they differ and why the choice in the end falls on the second one.
HLDS
Half-Life Dedicated Server is the official program from Valve for running dedicated servers of games on the GoldSrc engine: Counter-Strike 1.6, Half-Life, Day of Defeat, Team Fortress and others.
Essentially, it is the server side of the game engine. If the client handles graphics, sound, and character control, then HLDS accepts player connections, calculates physics, processes actions, synchronises the state of the game world between all participants, and manages maps, entities, and game rules.
It has no game graphical interface. It is usually run on a separate machine or a VPS so the server works around the clock.
The architecture was developed in the late 1990s and for many years was the only official server solution for GoldSrc. After Valve wound down active development, bugs, limitations, and outdated technical decisions stayed in it. Even so, thanks to its stability and compatibility, HLDS remained the standard for Counter-Strike 1.6 servers for many years.
ReHLDS
Reverse Engineered Half-Life Dedicated Server is an alternative implementation of the GoldSrc server side, restored from the original HLDS. It is not a new engine written from scratch based on observing how the original HLDS behaves. Its foundation was the decompiled HLDS binary, whose source code was restored to a state that allows building a functionally identical server. Only after that did fixes, optimisations and new features start going into this restored codebase.
ReHLDS is tied to the specific engine version it was restored from. The restoration was done on the basis of builds 6152/6153, and the supported base for installation is HLDS up to build 8684.
HLDS vs ReHLDS
Below is a table showing that this is one and the same server side, but in the second case with fixes and living support.
| HLDS | ReHLDS |
|---|---|
| Original Valve binary, closed source | Engine restored from HLDS, open source |
| Bugs Valve no longer fixes | Dozens of fixes in network code, packet handling, memory management and server logic |
| Limited by its internal architecture | Added APIs for modifications, hooks, extended settings and raised limits |
| Can behave unstably under heavy load | Handles large numbers of players, bots and plugins better |
| Updated only when Valve decides to | Regularly updated and developed by the ReHLDS community |
Installing the CS 1.6 Server with SteamCMD
SteamCMD is Valve's official tool for downloading Steam game servers. This is what we install the CS 1.6 server through. You need to create a folder, download the server archive and unpack it.
Running SteamCMD
- Creating the working folder. Right now, you are in the home folder of the user you created, /home/cs16/ (e.g, cs16@xxx:~$). Here I create a separate folder with the
mkdircommand, where the SteamCMD client itself and its download cache will sit, and go straight into it using thecdcommand:mkdir ~/steamcmd && cd ~/steamcmdUpdate the package list, then create and open the steamcmd directory - Download and unpack.
- Download the SteamCMD archive:
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz - And unpack it:
tar -xvzf steamcmd_linux.tar.gz
- Download the SteamCMD archive:
- Running the installer. From the unpacked archive launch the Steam console script:
./steamcmd.shDownload the SteamCMD archive, extract it, and run steamcmd.sh
On first launch SteamCMD will download the missing files and update itself. Wait until the Steam> prompt appears in the console, that means you can start entering commands to install the server.
Installing the CS 1.6 Server
We are in the SteamCMD console. From here four commands install the server itself.
- First we specify the path where the server goes. I will install into the /cs16srv/ folder (you can use your own name), there is no need to create it in advance, SteamCMD will do that itself:
force_install_dir /home/cs16/cs16srv - Log in to Steam. No account is needed for this, the CS 1.6 server is available anonymously:
login anonymous - Specify the mod that should be installed, since HLDS AppID 90 holds four mods of the Half-Life series:
app_set_config 90 mod cstrike - Starting the installation of the build we need:
Here,app_update 90 -beta steam_legacy validate90is the AppID of the Half-Life server,-beta steam_legacypoints at the classic branch (without it you get the wrong build), andvalidatechecks the integrity of the downloaded files. The download will take a few minutes. If at the end you see this output, everything is ready: Success! App '90' fully installed. - Exit SteamCMD:
quitSet the installation directory, log in anonymously, and install App ID 90
At this point your account should have this structure:
- /home/cs16/steamcmd/ - SteamCMD installer files
- /home/cs16/cs16srv/ - Game server files
Why ReHLDS Requires HLDS Build 8684
As of late 2026 the app_update 90 validate command installs build 10211 October 8, 2024. The app_update 90 -beta steam_legacy validate command installs build 8684 August 3, 2020 - the last build ReHLDS is compatible with. That is the whole reason for the older branch.
ReHLDS Build 8684 vs Valve HLDS Build 10211
| Comparison | ReHLDS 3.15.0.896 (May 2026) | Valve HLDS 10211 (Oct 2024) |
|---|---|---|
| Developer | ReHLDS community, open source | Valve, closed source |
| Base | Engine restored from builds 6152/6153 | Official engine after the Anniversary Update |
| Date/version | Current ReHLDS version | Oct 8, 2024 (10211) |
| Installation | Installed on top of steam_legacy, replaces engine files |
Downloaded with a plain app_update 90 |
| Compatibility | Designed for HLDS 8684 and below | Not a compatible base for ReHLDS |
| ReGameDLL_CS / ReAPI | Full integration and extended APIs | No ReHLDS API |
| Settings | Extra sv_rehlds_* cvars, hooks, raised limits |
Standard Valve settings |
| Modules/plugins | Metamod-R, ReAPI, Reunion, ReVoice, ReGameDLL_CS | Needs plugins built for the new HL25 engine |
| Steam | Uses the steam_legacy base |
Current official Steam Auth Server |
| Sources | Can be studied, edited and built yourself | Only Valve controls the changes |
Why There Is No ReHLDS Compatibility Patch for the Anniversary Update
Since 8684 is the last compatible build, it makes sense to ask why ReHLDS cannot be adapted to the new engine.
The Anniversary Update changed part of the engine and the way its binary components interact. Hence the incompatibility. ReHLDS is not a patch on top of HLDS, it is a separate engine restored from its code, so "just patching it" will not work. It would take decompiling the new engine, reworking functions, physics, compatibility with Metamod, AMX Mod X, ReGameDLL_CS, Reunion, hundreds of plugins, and so on.
No public work is being done in that direction right now, and nobody has announced any plans. Technically the task is solvable, but given the amount of work involved, in my opinion there is no point in it.
ReHLDS vs HLDS Security Considerations
Claiming that ReHLDS is "safer than HLDS" would be an oversimplification. We do not see the full list of vulnerabilities closed in 10211, and we cannot compare it line by line with ReHLDS. But a few things are known clearly enough.
Old HLDS was broken by public exploits for years, crashes, DoS, overflows in packet handling. ReHLDS over all those years has barely shown up in stories like that. Its code is open, changes are visible, bugs are fixed by the community. HLDS has no such process: what Valve fixed and when is known only once a build comes out, and even then only in general terms.
On top of that ReHLDS ships with basic checks like speedhack detection and lets you install serious anticheat modules, anti-VPN and the rest of that stack. HLDS has none of this.
There is a flip side too, and it is worth admitting. Before the Anniversary Update the client would happily load third-party DLLs, with everything that follows in the form of WH and aim bots. How effective VAC was in CS 1.6 is an open question, nobody heard about mass bans. Now the client starts complaining when something tries to load a DLL, and that does look like a real hole closed on Valve's side. Although ReHLDS, when set up properly, could and still can keep such clients off the server.
There is no clear winner here.
First Run of the CS 1.6 Server
The server is installed. Let us check that it works at all, go into the server folder:
cd /home/cs16/cs16srv
ls to confirm that the files were installedAnd run the ./hlds_run script together with the keys (launch parameters):
./hlds_run -game cstrike +map de_dust2 +maxplayers 16 +port 27015
On the first launch, you may run into a fatal error: FATAL ERROR (shutting down): Unable to initialize Steam.
In the log, there is a hint about what caused it:
dlopen failed trying to load: /home/cs16/.steam/sdk32/steamclient.so
with error: cannot open shared object file: No such file or directory
The server needs the steamclient.so library to talk to Steam. It looks for it in the ~/.steam/sdk32/ folder, but right after installing through SteamCMD, that folder does not exist yet - the file sits in the SteamCMD directory. The link to it is created on the first start, so just press Ctrl+C to break the session and run the server again. The second time it will come up fine. Also, you can create it manually.
Let us go over the parameters:
-game cstrike- specifies the mod;+map de_dust2- the map the server starts on;+maxplayers 16- the number of slots;+port 27015- the port the server will accept connections on;
If everything is in order, the console will show:
Connection to Steam servers successful.
VAC secure mode is activated.
Now let us check the server version with the command: version. In response we will see something like:
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
Exe build: 19:52:19 Aug 3 2020 (8684)
Running the CS 1.6 Server in Screen
Right now the server lives exactly as long as your SSH connection is open. Close PuTTY or just lose the connection and the server dies along with the session. This is solved with the terminal session manager Screen. It starts a window that lives on the server on its own, not tied to your SSH connection. Inside it the server keeps running even after you disconnect. You can also come back to that window at any moment to look at the server console, type commands, detach again and leave.
To install it:
sudo apt install screen
Basic Screen terminal commands
| Action | Command |
|---|---|
| Create a new named session | screen -S server_name |
| List all sessions | screen -ls |
| Attach to a session | screen -r server_name |
| Force attach | screen -r -d server_name |
| Detach, leaving the session running | Ctrl + A + D |
| Kill the session (stop the server) | screen -S server_name -X quit |
I create a session named cs16 and start the server in it right away:
screen -S cs16 ./hlds_run -game cstrike +map de_dust2 +maxplayers 16 +port 27015
You will end up in the server console, same as with a normal launch. But now you can "leave" from here, Ctrl + A + D, and you are back in the ordinary terminal while the server keeps running. Let us check the session is alive: screen -ls
The output should look roughly like this:
6398.cs16 (07/21/2029 11:59:57 PM) (Detached)
1 Socket in /run/screen/S-cs16.
screen -ls command confirms that the cs16 session is running and detached
Now you can safely close PuTTY, the server will stay up. To get back into its console, connect over SSH and type screen -r cs16.
CS 1.6 Server Modules and Plugins
One last stage is left - the layer on top of plain HLDS. I will go over which modules you need, what each one does, in what order they go in and how to check that everything landed. Plus a couple of plugins as an example, so you get the mechanics.
What I Install and Why
Below is a table of the components and a diagram of how a CS 1.6 server works. High-priority modules are mandatory, nothing to discuss there. Medium priority is the admin's call, but that call is a small one.
For example, the server will run perfectly fine without Reunion, only non-Steam clients will not be able to connect. And once you let them in, without ReVoice they will not be able to talk by voice to Steam players. So one module pulls in another, and at the same time they are genuinely useful, even if they are not critical.
Same story with anticheat. The best anticheat is the Admin, but he is a living person: he makes mistakes, he sleeps, he cannot dig into the client's files. ReChecker can - it checks dll, models, skins and maps by name and MD5 hash.
| Module | Purpose | Priority |
|---|---|---|
| ReHLDS | Server core | High |
| Metamod-R | Module manager | High |
| AMX Mod X | Plugin manager | High |
| ReGameDLL_CS | CS 1.6 game library | Medium |
| ReAPI | Extended API for AMXX plugins | Medium |
| Reunion | Client compatibility and authentication | Medium |
| ReVoice | Voice chat compatibility | Medium |
| ReSemiclip | Players passing through each other | Medium |
| ReChecker | Checking clients for cheats and mods | Low |
| AMXX Plugins | Plugins =) | Optional |
Server Diagram
ReHLDS is the engine, everything else lives on top of it. Metamod-R attaches to the engine and acts as a loader: on its own it does nothing, but without it not a single module will start. Next comes AMX Mod X, which is technically also a Metamod module, but already with its own platform for plugins. And right at the bottom sit the .amxx plugins themselves.
Installing ReHLDS and the Server Modules
Now the interesting part begins - I put the modules onto the server. Almost every step comes down to the same thing: download an archive, unpack it on your computer and drop the right files onto the server into the correct folder. And this is where WinSCP comes in handy, the one I talked about at the start.
WinSCP is a file manager with two panels. On the left is your computer, on the right is the server. Drag a file from one window into the other and it uploads. No commands, all by mouse, just like an ordinary file explorer.
You connect the same way as in PuTTY. Open WinSCP, press New Site and fill in:
- Host name - your server's IP
- Port - 22
- User name - cs16
- Password - the password of the cs16 user
Log in and you land in the home folder. The server files sit in /home/cs16/cs16srv/, and the game files specifically in /home/cs16/cs16srv/cstrike/. This is the place where I will install the modules.
ReHLDS - the Server Core
ReHLDS is an improved server engine.
Installing ReHLDS
Follow the links below and download the latest release. Unpack the ReHLDS archive and upload the files from the /bin/linux32/ folder into the server's root folder, /home/cs16/cs16srv/, replacing the current ones.
After that start the server and type the version command in the console.
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
ReHLDS version: 3.15.0.896-dev
Build date: 13:37:29 May 18 2026 (4419)
Build from: https://github.com/rehlds/ReHLDS/commit/1963001
If you see that the Valve build Aug 3 2020 (8684) has been replaced with ReHLDS May 18 2026 (4419), the module was installed successfully. The version number and build date may differ depending on the ReHLDS build you installed.
Creating the ReHLDS Configuration
ReHLDS does not create a separate config file on its own. Its cvars can be added straight into server.cfg, but for convenience it is better to keep them in a separate file, for example rehlds.cfg. To load the ReHLDS configuration:
- Go to the folder: /home/cs16/cs16srv/cstrike/
- Create the file: rehlds.cfg
- Add the ReHLDS cvars, setting the parameters to your own liking
listipcfgfile listip.cfg syserror_logfile sys_error.log sv_auto_precache_sounds_in_models //[0/1] Automatically precache sounds attached to models. Deault: 0 sv_delayed_spray_upload //[0/1] Upload custom sprays after entering the game instead of when connecting. It increases upload speed. Default: 0 sv_echo_unknown_cmd //[0/1] Echo in the console when trying execute an unknown command. Default: 0 sv_rcon_condebug //[0/1] Print rcon debug in the console. Default: 1 sv_force_ent_intersection //[0/1] In a 3-rd party plugins used to force colliding of SOLID_SLIDEBOX entities. Default: 0 sv_rehlds_force_dlmax //[0/1] Force a client's cl_dlmax cvar to 1024. It avoids an excessive packets fragmentation. Default: 0 sv_rehlds_hull_centering //[0/1] Use center of hull instead of corner. Default: 0 sv_rehlds_movecmdrate_max_avg // Max average level of 'move' cmds for ban. Default: 1800 sv_rehlds_movecmdrate_avg_punish // Time in minutes for which the player will be banned (0 - Permanent, use a negative number for a kick). Default: 5 sv_rehlds_movecmdrate_max_burst // Max burst level of 'move' cmds for ban. Default: 5500 sv_rehlds_movecmdrate_burst_punish // Time in minutes for which the player will be banned (0 - Permanent, use a negative number for a kick). Default: 5 sv_rehlds_send_mapcycle //[0/1] Send mapcycle.txt in serverinfo message (HLDS behavior, but it is unused on the client). Default: 0 sv_rehlds_stringcmdrate_max_avg // Max average level of 'string' cmds for ban. Default: 250 sv_rehlds_stringcmdrate_avg_punish // Time in minutes for which the player will be banned (0 - Permanent, use a negative number for a kick). Default: 5 sv_rehlds_stringcmdrate_max_burst // Max burst level of 'string' cmds for ban. Default: 500 sv_rehlds_stringcmdrate_burst_punish // Time in minutes for which the player will be banned (0 - Permanent, use a negative number for a kick). Default: 5 sv_rehlds_userinfo_transmitted_fields // Userinfo fields only with these keys will be transmitted to clients via network. If not set then all fields will be transmitted (except prefixed with underscore). Each key must be prefixed by backslash, for example "\name\model\*sid\*hltv\bottomcolor\topcolor". See [wiki](https://github.com/rehlds/ReHLDS/wiki/Userinfo-keys) to collect sufficient set of keys for your server. Default: "" sv_rehlds_attachedentities_playeranimationspeed_fix // Fixes bug with gait animation speed increase when player has some attached entities (aiments). Can cause animation lags when cl_updaterate is low. Default: 0 sv_rehlds_maxclients_from_single_ip // Limit number of connections at the same time from single IP address, not confuse to already connected players. Default: 5 sv_rehlds_local_gametime //[0/1] A feature of local gametime which decrease "lags" if you run same map for a long time. Default: 0 sv_rehlds_allow_large_sprays //[0/1] Allow larger custom logos than 64x64. Default: 1 sv_use_entity_file // Use custom entity file for a map. Path to an entity file will be "maps/[map name].ent". 0 - use original entities. 1 - use .ent files from maps directory. 2 - use .ent files from maps directory and create new .ent file if not exist. sv_usercmd_custom_random_seed // When enabled server will populate an additional random seed independent of the client. Default: 0 sv_net_incoming_decompression //[0/1] When enabled server will decompress of incoming compressed file transfer payloads. Default: 1 sv_net_incoming_decompression_max_ratio //[0-100] Sets the max allowed ratio between compressed and uncompressed data for file transfer. (A ratio close to 90 indicates large uncompressed data with low entropy) Default: 80.0 sv_net_incoming_decompression_max_size // [16-65536] Sets the max allowed size for decompressed file transfer data. Default: 65536 bytes sv_net_incoming_decompression_min_failures //[0-10] Sets the min number of decompression failures required before a player's connection is flagged for potential punishment. Default: 4 sv_net_incoming_decompression_max_failures //[0-10] Sets the max number of decompression failures allowed within a specified time window before action is taken against the player. Default: 10 sv_net_incoming_decompression_min_failuretime //[0.1-10.0] Sets the min time in secs within which decompression failures are tracked to determine if the player exceeds the failure thresholds. Default: 0.1 sv_net_incoming_decompression_punish // Time in minutes for which the player will be banned for malformed/abnormal bzip2 fragments (0 - Permanent, use a negative number for a kick). Default: -1 sv_tags // [comma-delimited string list of tags] Sets a string defining the "gametags" for this server, this is optional, but if it is set it allows users/scripts to filter in the matchmaking/server-browser interfaces based on the value. Default: "" sv_filterban // [-1/0/1] Set packet filtering by IP mode. -1 - All players will be rejected without any exceptions. 0 - No checks will happen. 1 - All incoming players will be checked if they're IP banned (if they have an IP filter entry), if they are, they will be kicked. Default: 1 sv_rehlds_movecmd_max_ticks // Set maximum amount of movement commands the server is able to process from a single player in a single frame. This includes the commands itself, not packets. Default: 24 sv_rehlds_movecmd_max_null_streak // Defines the maximum allowed consecutive movement commands with zero time duration (empty commands). 0 - disables the check. Default: 0 sv_rehlds_movecmd_clamp_interp // [0/1] Defines whether should the server block movement commands with invalid (out of range) "ex_interp" value. Default: 1 sv_rehlds_movecmdtime_samples // Defines the number of frames the server takes to average the client's movement speed. Higher - more accurate but slower detection, lower - vice versa. Default: 120 sv_rehlds_movecmdtime_max_error // Defines how far a client's internal game clock can go ahead of or behind the server's clock in milliseconds. If this limit is exceeded, the server evaluates the client's game speed. Penalties are ONLY applied if the client also violates the "sv_rehlds_movecmdtime_max_scale" or "sv_rehlds_movecmdtime_min_scale" limits. Default: 300 sv_rehlds_movecmdtime_max_scale // Defines the max client's base game speed ratio. Clients speeding the game up beyond this multiplier will receive warnings. Default: 3.0 sv_rehlds_movecmdtime_min_scale // Defines the min client's base game speed ratio. Clients slowing the game down below this multiplier will receive warnings. Default: 0.5 sv_rehlds_movecmdtime_max_warnings // Maximum allowed speedhack/slowmo warnings before the punishment is applied. -1 - disable detection. Default: -1 sv_rehlds_movecmdtime_punish // Time in minutes for which the player will be banned for speedhacking/slowing (-1 - Kick, 0 - Permanent, use a negative number for a kick). Default: -1 echo The ReHLDS configuration has been loaded! - Save and close the rehlds.cfg file
- In the same place open the file /home/cs16/cs16srv/cstrike/server.cfg and add a line at the end:
exec rehlds.cfg - Save and close the server.cfg file
Add exec rehlds.cfgat the end ofserver.cfgto load the ReHLDS settings
The server.cfg file is a service config file, optional but loaded automatically when the map starts. Now the ReHLDS configuration will run together with it. Restart the server and check for the following line in the console:
The ReHLDS configuration has been loaded!
Metamod-R - the Module Manager
Metamod-R is an intermediate module loader for GoldSrc engine servers. It plugs in between the server engine and the game modification, letting you load extra modules without touching the game's server library.
Installing Metamod-R
Follow the links below and download the latest release. Unpack the /addons/ folder from the archive and upload it into the server's /cstrike/ folder.
- Metamod-R - repository
- Metamod-R - latest release
Copy the addons folder into /home/cs16/cs16srv/cstrike/
Then open /cstrike/addons/metamod/ folder, delete the metamod.dll file, since it is meant for Windows, and create a plugins.ini file. This is where the extra modules loaded through Metamod-R will be listed.
Now Metamod-R needs to be hooked in. Go to the /cstrike/ folder and open the liblist.gam file. Replace the line:
gamedll_linux "dlls/cs.so"
with
gamedll_linux "addons/metamod/metamod_i386.so"
gamedll_linux to the path of the Metamod Linux libraryThat finishes the Metamod-R install. Restart the server and type the command in its console: meta version. After a successful install, you'll see something like this:
Metamod-r v1.3.0.149, API (5:13)
Metamod-r build: 11:31:17 Apr 23 2024
Metamod-r from: https://github.com/theAsmodai/metamod-r/commit/603a257
meta version command to confirm that Metamod-r is runningThe version number and build date may differ depending on the release you installed.
AMX Mod X - the Plugin Manager
AMX Mod X is a platform for creating and running server-side plugins in Counter-Strike 1.6 and other GoldSrc games. The latest version is 1.10.0, but it still carries a Pre-release status, so it is better to install the latest stable version, AMX Mod X 1.9.0 build 5303.
Installing AMX Mod X
Follow the links below and download the two packages you need: Base Package and Counter-Strike.
Then upload the /addons/ folder from each archive into the server's /cstrike/ folder: FIRST from Base Package, then from Counter-Strike, agreeing to replace files. The packages have to be installed in exactly this order, as stated on the AMX Mod X download page.
Now AMX Mod X needs to be hooked into Metamod-R. Open the module list file you created earlier: /cstrike/addons/metamod/plugins.ini. Add the following line to it:
linux addons/amxmodx/dlls/amxmodx_mm_i386.so
Save the file and restart the server.
To make sure AMX Mod X is working, type the meta list command in the server console. Expected output:
[ 1] AMX Mod X RUN - amxmodx_mm_i386.so v1.9.0.5303 ini Start ANY
[ 2] Ham Sandwich RUN - hamsandwich_amxx_i386.so v1.9.0.5303 pl1 ANY ANY
[ 3] CSX RUN - csx_amxx_i386.so v1.9.0.5303 pl1 ANY ANY
meta list to confirm that AMX Mod X and its modules are activeThe sign of a successful install is that the AMX Mod X module has the RUN status. The version number and the list of extra modules may differ.
ReGameDLL_CS - the CS 1.6 Game Library
ReGameDLL_CS is a reworked version of the original Counter-Strike 1.6 game library, which handles the game logic, the mp_* cvars and part of the sv_* ones. It improves server stability, fixes bugs, and adds new settings and options for plugins and modifications.
Installing ReGameDLL_CS
Follow the links below and download the latest release.
Copy the contents of the /cstrike/ folder from the archive into the server's /cstrike/ folder, confirming the file replacement.
A file named game.cfg will appear in the /cstrike/ folder; this is the game server's primary configuration file. It defines the values for console variables (cvars) that affect gameplay, game rules, and server behavior. Each cvar comes with a description, so you can set them up to your own liking.
Be careful with duplicate commands: a command repeated in server.cfg will override the ReGameDLL_CS setting, because game.cfg is loaded earlier. The current config loading order is: game.cfg -> amxx.cfg -> server.cfg -> rehlds.cfg.
Restart the server and type the command in its console: game version. A successful install looks like this:
ReGameDLL version: 5.30.0.814-dev
Build date: 13:48:16 May 18 2026
Build from: https://github.com/rehlds/ReGameDLL_CS/commit/781a68a
game version to confirm that ReGameDLL is installed and activeReAPI - Extended API for AMXX Plugins
ReAPI is a module for AMX Mod X that provides an extended API for interacting with the Counter-Strike 1.6 server. It works together with ReHLDS and ReGameDLL_CS, letting plugins use extra functions, hooks and events that are not available in plain AMX Mod X.
Installing ReAPI
Follow the links below and download the latest release.
Then copy the /addons/ folder from the archive into the server's /cstrike/ folder, merging it with the existing folder.
Open the file: /cstrike/addons/amxmodx/configs/modules.ini and add on a new line: reapi.
reapi to modules.ini to load the ReAPI moduleRestart the server and type the command in its console: amxx modules. On success, you'll see output like this:
ReAPI 5.29.0.358 Asmodai & s1lent running
amxx modules and confirm that ReAPI has the running statusOptional: in the /cstrike/addons/amxmodx/modules/ folder you can delete the reapi_amxx.dll file, since it is meant for Windows.
ReUnion - Connecting non-Steam Clients
ReUnion is a module for Metamod-R that lets non-Steam clients on protocols 47 and 48 connect to a ReHLDS-based server.
Installing ReUnion
Follow the links below and download the release you need.
Then copy the /addons/ folder and the reunion.cfg file from the archive into the server's /cstrike/ folder, merging them with the existing files.
reunion.cfg into the server’s cstrike directory.Open the Metamod-R module list file: addons/metamod/plugins.ini. Add the following line right at the top and save the file:
linux addons/reunion/reunion_mm_i386.so
Mandatory! Open the /cstrike/reunion.cfg file, find the SteamIdHashSalt parameter and set a random string at least 32 characters long, using only latin letters and digits. For example:
SteamIdHashSalt = "7Qm9X25PkL5vN8pR4tY6cD1fH3jS0wB7zA"
If the parameter is not set or the string is too short, ReUnion will not load and will get a fail load status.
Optional: in the /cstrike/addons/reunion/ folder you can delete the reunion_mm.dll file, since it is meant for Windows.
Restart the server and type the command in its console: meta list. The output should look like this:
Reunion RUN reunion_mm_i386.so v0.2.0.34 ini Start Never
meta list and confirm that Reunion has the RUN status.Your version number may differ.
ReVoice - Voice Chat
ReVoice is a module for Metamod-R that provides voice communication between Steam and non-Steam clients.
Installing ReVoice
Follow the links below and download the latest release.
In the server's /cstrike/addons/ folder create a /revoice/ folder and upload the revoice_mm_i386.so and revoice.cfg files from the downloaded archive into it.
cstrike/addons/revoice/.Then open the Metamod-R module list: /cstrike/addons/metamod/plugins.ini. Add ReVoice right after ReUnion, since it needs the ReUnion API to work:
linux addons/revoice/revoice_mm_i386.so
Save the file, restart the server and type the command in its console: meta list.You'll see something like this:
Revoice RUN - revoice_mm_i386.so v0.1.0.34 ini Start Never
meta list and confirm that ReVoice has the RUN status.Your version number may differ.
ReSemiclip - Passing Through Each Other
ReSemiclip is a module for Metamod-R that lets players pass through each other.
Installing ReSemiclip
Follow the links below and download the latest release.
Copy the /addons/ folder from the archive into the server's /cstrike/ folder.
Then open the Metamod-R module list: /cstrike/addons/metamod/plugins.ini and add the following line to the end of the list:
linux addons/resemiclip/resemiclip_mm_i386.so
Save the file, restart the server and type the command in its console: meta list. The result should look like this:
ReSemiclip RUN resemiclip_mm_i386.so v2.4.3 ini Chlvl ANY
meta list and confirm that ReSemiclip has the RUN status.The plugin's settings are in the file: /cstrike/addons/resemiclip/config.ini. The resemiclip_mm.dll file can be deleted, since it is meant for Windows.
Installing AMX Mod X Plugins
I have put the server's main stack in place - the modules. But they are more about the technical side, for players there is almost no visible change in them. All the interesting stuff - the admin menu, the ban system, statistics, sounds, any HUD, any feature, and a lot more - that is AMX Mod X plugins.
For plugins to work, the server must have Metamod-R/P and AMX Mod X installed. Some plugins also need extra modules, libraries and even other plugins.
What Is an AMX Mod X Plugin?
An AMXX plugin is a script written in the Pawn language and compiled into the .amxx format, which is run by the AMX Mod X platform. The plugin's source code is stored in a file with the .sma extension, where you can study or edit it, but the server cannot run those files directly. On top of that, plugins can have extra files for settings and features, for example sounds, sprites, models and so on, which need to be uploaded into the matching server folders. Such files are called dependencies, and the info about them is usually given by the plugin's author in the description or the install instructions.
How to Install an AMX Mod X Plugin?
The spoiler version is three steps: download, upload to the server and add to the load list.
- Download the plugin archive and look at what is inside. At the very least the archive should contain one file, the .sma source, most often it will be two files, the source and the .amxx plugin itself, less often the source with extra files.
- Here is where the main possible plugin files go:
- The compiled .amxx file goes into /cstrike/addons/amxmodx/plugins/ folder
- The .sma source file goes into /cstrike/addons/amxmodx/scripting/ folder
- The .txt language pack goes into /cstrike/addons/amxmodx/data/lang/ folder
- The .ini init file goes into /cstrike/addons/amxmodx/configs/ folder
- The .wav sound file goes into /cstrike/sound/ folder
- The .mdl model file goes into /cstrike/models/ folder
- The third step is to add the plugin to the load list, which is in the file: addons/amxmodx/configs/plugins.ini. Open the file and add at the end the full name of the file you uploaded into the folder: /cstrike/addons/amxmodx/plugins/, for example:
Save the file and restart the server, or you can just change the map, that is enough to activate the plugin. Then in the server console call the list of loaded plugins with the command:test_plugin.amxxamxx plugins. On a successful load the plugin will show up in the list with the running status.Add the plugin filename at the end of plugins.ini to enable it.
If you need to remove a plugin, you do it all in reverse, and if you just need to disable it, it is enough to put a semicolon in front of the name, then the plugin stays on disk but will not load. Handy when something needs to be switched off for a while without deleting it.
Installing the Ping Faker Plugin
Let us go through a real example and install a popular, simple plugin - Ping Faker. It lets you fake the ping value a player shows in the scoreboard. You can set it up so everyone shows the same ping, or so the fake only kicks in for players with a certain flag.
The plugin has three files that go into place:
- The fakepings.ini init file goes into /cstrike/addons/amxmodx/configs/ folder
- The pingfaker.amxx file goes into /cstrike/addons/amxmodx/plugins/ folder
- The pingfaker.sma source file goes into /cstrike/addons/amxmodx/scripting/ folder
Open the file: /cstrike/addons/amxmodx/configs/plugins.ini and add the full plugin file name at the bottom:
pingfaker.amxx
Restart the server and type the command in its console: amx_plugins. The output tells you the plugin is working.
Ping Faker 1.3 MeRcyLeZZ pingfaker.amxx running
amx_plugins to confirm that the installed plugin is running.Every other plugin installs the same way: drop the files into their folders, add one line to plugins.ini, restart the server or map and check the console. At first you will probably get the names mixed up - the plugins folder and the plugins.ini file, the configs folder and the config file, metamod and amxmodx, and so on. That is normal. Poke around for a bit, install a couple of plugins by hand, and it all falls into place.
Why It Is Better to Compile AMX Mod X Plugins Yourself
A ready-made .amxx - you download it, drop it in the folder, nothing to compile, all simple and at the same time it can hurt a lot. Let me tell a story from experience.
Sometimes the server crashes with no logic to it. For a couple of days it holds 32/32 without a single failure, then it starts going down ten times a day. The only clue is that it crashes more often on a full server, but even that is not a rule: sometimes it drops on a full one, sometimes it runs a whole day under the same load. You turn the plugins off one by one and the picture does not change, sometimes it works, sometimes it does not. No statistics, no pattern.
It was solved the hard way: I wiped all the ready-made plugins and rebuilt them from source, with my own compiler. Since then, silence.
The reason, of course, is versions. A ready-made .amxx from the net is built with who-knows-what compiler, for an unknown version or build of AMX Mod X and an unknown ReAPI. A plugin built for one combination may load on another, seem to work, and then drop the server under load or on some specific event. Such crashes are floating and almost impossible to catch - that is exactly why they are so hard to track down by turning plugins off.
Never install ready-made .amxx from the net. Take the .sma source and compile it yourself - with your version of AMX Mod X, your include files. Downloaded an archive and there is a single .amxx file inside - delete it and forget it.
How to Compile SMA to AMXX Plugins
There are two ways to compile a .sma file: online or locally.
Online Compilation
For online compilation you can use the official AMX Mod X service: https://www.amxmodx.org/webcompiler.cgi
For me personally this way does not look like the best one. The page has only a form to upload the source, a compile button and an empty area for the result. Meanwhile there is no information about the compiler itself: you do not know which version of AMX Mod X is used, which libraries are linked in, and for which version the plugin will be built.
For example, if the server runs on AMX Mod X 1.8 while the compiler builds plugins for AMX Mod X 1.9 or some other version, this can lead to the plugin failing to load, working incorrectly or crashing the server outright. Maybe I missed something, but I did not find the needed info on the page.
Local Compilation
To compile plugins locally (.sma -> .amxx) on Windows, the compile.exe script is used; it is included with AMX Mod X alongside associated files (such as amxxpc.exe and the include folder). In classic versions, it is located in the /cstrike/addons/amxmodx/scripting/ directory.
Compilation works by Drag & Drop:
- Take the .sma file.
- Drag and drop it onto compile.exe.
- Wait for the compilation to finish.
After that a command-line window opens with a report on the compilation process, and next to compile.exe a /compiled/ folder appears automatically, with the ready .amxx file inside.
The same can be done by hand through the command line. Copy the source into the folder where compile.exe is, then open CMD in that folder and run the command: compile file.sma. When the compilation finishes, the ready .amxx file appears in the compiled folder.
Possible Compilation Errors
- Cannot read from file. Usually means one or more .inc files needed for compilation are missing.
- Undefined symbol. Most often comes up if a function from a third-party API is used, a needed #include is missing or library versions do not match.
- Symbol already defined. The same variable, constant or function is declared more than once.
- Tag mismatch. A Pawn data-type mismatch error. Usually comes up from wrong handling of Float types, enums or tags used in third-party APIs.
Conclusion
We have a working CS 1.6 server: a rented VPS, the ReHLDS engine instead of the outdated HLDS, a set of modules and a live example with a plugin. The server comes up inside screen and stays online around the clock, you can connect to it by IP and play.
If you went through the guide from start to finish, what you have on your hands is not just a "bare server" but an understanding of how it is put together: what each module does, in what order everything loads, where to put the files and how to check that a component landed.
A lot was left outside the scope of the guide, and two things are worth mentioning separately, because sooner or later you will run into them.
FastDL. The moment you install plugins with custom sounds, models or sprites, players start downloading those files when they join the server - through the game port, slowly, at a few dozen kilobytes per second. On heavy content a person may simply not wait for the download and leave. This is solved with FastDL - a separate http server that files download from many times faster. Remember how at the very start I set aside 2 GB of RAM and mentioned an http server? This is what that was for.
Administration and access rights. In the guide I set up the infrastructure but never touched the question of "how to make yourself an admin and manage the server". The classic route is the users.ini file and the AMX Mod X access flags. It works, but by today's standards it is a manual and clunky way. These days almost everyone goes through web admin panels: the ban system, statistics, managing players and settings - all through a browser instead of editing configs over SSH. This is a big topic with its own install process and its own pitfalls, and it deserves a separate write-up.
CS 1.6 Server FAQ
Do I need a Steam account or a paid license to run a CS 1.6 server?
No. The server files are downloaded through SteamCMD anonymously, with login anonymous. You do not need to own the game or log in with a real account to host a server.
Can players with a non-Steam (pirated) client connect to my server?
Not by default. A clean ReHLDS server only accepts Steam clients. To let non-Steam clients in you install the ReUnion module, and for them to talk by voice with Steam players you also need ReVoice.
Why build 8684 and not the latest one?
Because ReHLDS is only compatible with build 8684 and below. The current build 10211, released after the Anniversary Update, changed the engine internals and is not a valid base for ReHLDS. That is why I pull the older build from the steam_legacy branch.
My plugin does not load or crashes the server. What is the first thing to check?
Two things. First, dependencies: many modern plugins need ReAPI (and through it ReGameDLL_CS) or specific modules - check the plugin's page. Second, and most important, do not use ready-made .amxx files from the net. Compile the .sma source yourself with your own version of AMX Mod X. Version mismatches are the number one cause of random, hard-to-catch crashes.
How many players and how much hardware do I really need?
One CPU core per server, since GoldSrc is single-threaded and only cares about the clock speed of a single core (3+ GHz is comfortable). 1 GB of RAM is enough for a plain server, 2 GB if you add an http server for FastDL and a database. That easily covers a full 32-slot server.



