A Counter-Strike 1.6 server needs about 256 MB of memory, one CPU core it will only ever use one thread of, and a single UDP port. That has not changed in twenty years. What has changed is that almost nobody runs Valve's original HLDS any more: the servers people actually play on run ReHLDS, a reimplementation of the engine, with Metamod loading AMX Mod X on top of it, and that stack is the difference between a server that feels like 2004 and one that feels like a museum.
This guide covers the whole thing: what ReHLDS and ReGameDLL are and why they replaced the originals, installing from SteamCMD, every server.cfg setting worth changing, Metamod and AMX Mod X, admin flags and the command list, maps and downloads, bots, and the honest situation with cheating and non-Steam clients. RE:NODE's CS 1.6 installs ship with ReHLDS, AMX Mod X and Metamod already in place, so if you are on one of those, read this as the explanation of what is already there.
What a CS 1.6 server runs: HLDS, ReHLDS and ReGameDLL#
The original stack is three pieces. The engine (hlds_linux with engine_i686.so on Linux, hlds.exe with swds.dll on Windows) runs the world and the network. The game library (cstrike/dlls/cs.so on Linux, mp.dll on Windows) implements Counter-Strike itself - buy menus, bomb, money. And the mod folder cstrike/ holds maps, configs and everything you will actually edit.
The community replaced the first two:
| Piece | Original | Replacement | Why |
|---|---|---|---|
| Engine | HLDS | ReHLDS | Crash and exploit fixes, better performance, extra cvars |
| Game library | cs.so / mp.dll | ReGameDLL_CS | Fixed long-standing bugs, exposed hard-coded behaviour as cvars |
| Plugin loader | none | Metamod, or Metamod-r | Lets AMX Mod X and other plugins hook the game |
ReHLDS is a drop-in: you overwrite the engine binary and everything else keeps working. ReGameDLL_CS is the same for the game library, and it is the one that adds most of the new mp_ cvars people quote - free-for-all mode, infinite rounds, weapon behaviour that used to be fixed in code. Neither changes how the game plays by default. Both are maintained on GitHub, and both are worth taking, because plain HLDS has not had a meaningful fix in a very long time and several of its bugs are remotely triggerable.
Installing the base game from SteamCMD is app 90, the Half-Life dedicated server, with the mod selected before the update runs:
$ steamcmd +force_install_dir /home/cs16/server +login anonymous \ +app_set_config 90 mod cstrike +app_update 90 validate +quit$ cd /home/cs16/server$ ./hlds_run -game cstrike +ip 0.0.0.0 +port 27015 \ +maxplayers 24 +map de_dust2App 90 is famously awkward. SteamCMD frequently fails the first attempt with a subscription or manifest error and succeeds on the second or third identical run, and +app_set_config 90 mod cstrike must come before +app_update or you get Half-Life deathmatch instead. GoldSrc is 32-bit, so a 64-bit Linux box needs the 32-bit C library installed before anything starts. On a panel host all of this has already happened and the server you get is the finished tree.
hlds_run is a wrapper script that restarts the server if it exits; hlds_linux is the binary itself. Old guides add -pingboost 1 to 2 or 3, which changes how the engine sleeps between frames. It was a workaround for kernels that no longer exist, and on ReHLDS you should leave it off.
Requirements and resource usage#
| Setup | RAM | CPU | Notes |
|---|---|---|---|
| 12-16 slots, vanilla plus AMXX | 256-512 MB | 1 core | The common public server |
| 24-32 slots, a dozen plugins | 512 MB - 1 GB | 1 core | Plugin count matters more than slots |
| Zombie Plague, CSDM, Jailbreak at 32 slots | 1-2 GB | 1 fast core | Heavy AMXX mods with per-player state |
| Two servers on one box | Double the above | 1 core each | They will not share a thread usefully |
The install is under a gigabyte. Everything that grows is content you add: custom maps, sprites, sounds and models, which is what the disk on a plan is really for.
CPU is where 1.6 is unusual. GoldSrc runs the whole simulation in one thread, so core count does nothing and clock speed does everything. sys_ticrate sets the server's frame rate target, and the community default of 1000 really does spend CPU to get smoother movement and registration. On a plan that buys a fraction of a core, sys_ticrate 500 is a sensible compromise and the difference is hard to feel; sys_ticrate 100 is not, and players will notice.
Network use is tiny by modern standards - a full 32-slot server is a few hundred kilobytes per second. What matters is latency and jitter, because 1.6's lag compensation is good but not magic, and a server two countries away is a server you lose duels on.
server.cfg, line by line#
cstrike/server.cfg is read at startup and on every map change. Here is a complete one for a public server, with nothing decorative:
hostname "Longship 1.6 // Classic maps // EU"rcon_password "a-long-random-string"sv_password ""sv_contact "you@example.com"sv_lan 0sv_region 3// Rounds and rulesmp_timelimit 30mp_maxrounds 0mp_winlimit 0mp_freezetime 6mp_roundtime 2.5mp_buytime 0.25mp_c4timer 35mp_startmoney 800mp_friendlyfire 0mp_tkpunish 0mp_autoteambalance 1mp_limitteams 2mp_autokick 0mp_flashlight 1mp_footsteps 1mp_forcecamera 0mp_fadetoblack 0mp_hostagepenalty 0mp_chattime 10mp_playerid 0// Physicssv_gravity 800sv_maxspeed 320sv_airaccelerate 10sv_cheats 0pausable 0// Networksys_ticrate 1000sv_maxrate 25000sv_minrate 5000sv_maxupdaterate 101sv_minupdaterate 20sv_unlag 1sv_maxunlag 0.5sv_timeout 65// Contentsv_allowupload 1sv_allowdownload 1sv_downloadurl ""mp_consistency 1// Logslog onmp_logmessages 1mp_logdetail 3sv_logbans 1sv_logecho 1exec banned.cfgexec listip.cfg| Setting | Default | What it does |
|---|---|---|
mp_roundtime | 5 | Round length in minutes, between 1 and 9. Competitive uses 1.75 |
mp_freezetime | 6 | Buy freeze at round start, in seconds |
mp_buytime | 1.5 | Buy menu time in minutes. 0.25 is fifteen seconds |
mp_c4timer | 45 | Bomb timer. 35 is the competitive value |
mp_startmoney | 800 | Round-one money, 800 to 16000 |
mp_friendlyfire | 0 | On for competitive, off for a public server that wants to stay populated |
mp_autoteambalance | 1 | Moves players to even the teams at round end |
mp_limitteams | 2 | Maximum team size difference before joins are blocked |
mp_forcecamera | 0 | 1 limits dead players to spectating their own team |
mp_fadetoblack | 0 | 1 blacks out the screen on death. Anti-ghosting for matches |
mp_playerid | 0 | 0 names for everyone, 1 team only, 2 nobody |
sv_maxupdaterate | 60 | Snapshots per second per client. 101 is the community standard |
sv_unlag | 1 | Lag compensation. Never turn this off |
mp_consistency | 1 | Rejects clients whose model and sprite files do not match |
The last two lines of the config matter more than they look. banned.cfg and listip.cfg are where the engine writes bans when you run writeid and writeip, and they are not loaded automatically in every build - execing them from server.cfg makes bans survive a restart. Forgetting this is the classic "I banned him yesterday and he is back" report.
Ports, RCON and connecting#
| Port | Protocol | Purpose |
|---|---|---|
27015 | UDP | Game traffic, and the Steam query the browser uses |
27015 | UDP | RCON. GoldSrc runs RCON over UDP on the game port |
27020 | UDP | HLTV, only if you run a proxy |
That RCON row is the trap for anyone coming from a Source game. CS:GO and CS2 speak RCON over TCP; GoldSrc speaks it over UDP on the same port as the game, in the clear, with the password in every packet. Anyone capturing traffic between you and your server gets the password, and there is no version of the protocol that fixes this. Use the panel console, which is authenticated by your account instead, and keep rcon_password long and rotated. Using RCON safely is the general case and applies double here.
A CS 1.6 plan on RE:NODE comes with one port allocation, which is exactly what a server needs. HLTV is a second process on a second port, added on the Network tab if you want it.
Players connect three ways: the in-game browser under Find Servers, a favourite added by address, or connect 203.0.113.10:27015 typed into the console. Direct connection is the one that works when the master list is being slow, and the one to test with before you believe a problem is real. If you would rather hand out a name than an address, connecting a domain to a game server covers the A record, and it works fine for 1.6 as long as the port stays in the address.
Metamod and AMX Mod X#
Metamod is a shim that sits between the engine and the game library so that several plugins can hook the game at once. AMX Mod X is the plugin platform almost every 1.6 server runs, and it loads as a Metamod plugin. Nothing else in the 1.6 world has a fraction of its plugin catalogue.
Metamod is installed by pointing the mod at it instead of at the game library. In cstrike/liblist.gam:
gamedll "addons\metamod\dlls\metamod.dll"gamedll_linux "addons/metamod/dlls/metamod_i386.so"Metamod then loads whatever is listed in cstrike/addons/metamod/plugins.ini, one plugin per line with the platform first:
linux addons/amxmodx/dlls/amxmodx_mm_i386.sowin32 addons\amxmodx\dlls\amxmodx_mm.dllStart the server and type meta list in the console. If AMX Mod X shows as running, type amxx version. Two commands, thirty seconds, and you know whether the stack is alive. The tree underneath looks like this:
cstrike/addons/amxmodx/ configs/ amxx.cfg core settings users.ini admins plugins.ini which plugins load modules.ini which modules load maps.ini the map vote list cmds.ini commands run at map start plugins/ the .amxx files modules/ engine, fun, cstrike, fakemeta, hamsandwich data/lang/ translations logs/ one file per day scripting/ .sma sources and the compilerPlugins are .amxx files in plugins/, enabled by adding their file name to configs/plugins.ini. Several plugins need a module switched on in modules.ini first - fun, cstrike, fakemeta and hamsandwich are the usual suspects, and a plugin that fails to load with a "module not found" line in logs/ is almost always this. Plugins written in Pawn are compiled from .sma to .amxx with the compiler in scripting/, which is worth knowing because half the useful plugins for 1.6 are posted as source.
configs/amxx.cfg holds the core settings. amx_default_access sets what a player with no entry in users.ini may do, and should stay empty. amx_show_activity 2 announces admin actions with the admin's name, which is the setting that keeps a staff team honest. amx_password_field "_pw" names the client-side variable an admin's password goes in, which is the setinfo _pw "yourpassword" line an admin adds to their own config.
Admins, flags and commands#
Admins live in cstrike/addons/amxmodx/configs/users.ini, one per line, in four fields: identity, password, access flags, account flags.
; identity password access flags account flags"STEAM_0:1:123456" "" "abcdefghijklmnopqrstu" "ce""STEAM_0:0:987654" "" "bcdefijmnu" "ce""Anna" "herring42" "bcdefij" "a"The account flags decide how the admin is recognised. c means the identity is a SteamID, d means it is an IP address, e means no password is required, and a disconnects anyone who gives a wrong password while using that name. SteamID with ce is the right answer for anyone you trust; name-plus-password is for people whose ID you do not have yet, and it is only as good as the password.
The access flags are single letters, and they stack:
| Flag | Grants |
|---|---|
a | Immunity from other admins |
b | Reserved slot |
c | amx_kick |
d | amx_ban, amx_unban, amx_banip |
e | amx_slay, amx_slap |
f | amx_map |
g | amx_cvar for most cvars |
h | amx_cfg |
i | amx_chat, amx_say, amx_psay, amx_tsay |
j | Vote commands |
k | Access to protected cvars such as sv_password |
l | amx_rcon and rcon_password |
m to t | Custom levels that individual plugins define |
u | Access to the admin menu |
z | Ordinary user, no admin rights |
Handing out abcdefghijklmnopqrstu to everybody is how 1.6 servers get destroyed by their own staff. A moderator needs bcdefiju and nothing else; l gives RCON, which is the whole server, and belongs to one person.
| Command | Effect |
|---|---|
amx_kick <name> [reason] | Removes a player |
amx_ban <minutes> <name> [reason] | Bans by SteamID. 0 is permanent |
amx_banip <minutes> <name> | Bans the address |
amx_addban <steamid> <minutes> | Bans somebody who is not connected |
amx_unban <steamid> | Lifts a ban |
amx_slay <name> / amx_slap <name> [damage] | Kills, or hits and shoves |
amx_map <map> | Changes map |
amx_extendmap <minutes> | Adds time to the current map |
amx_votemap <map...> | Starts a map vote |
amx_cvar <cvar> [value] | Reads or sets a cvar |
amx_rcon <command> | Runs a server command |
amx_who | Lists players with their access |
amx_reloadadmins | Re-reads users.ini without a restart |
amx_plugins / amx_modules | What loaded and what failed |
amxmodmenu | Opens the admin menu in game |
amx_reloadadmins is the one to remember: adding a moderator during an evening costs nothing and needs no restart.
Maps, the map cycle and downloads#
Maps are .bsp files in cstrike/maps/, often beside a .res file listing the extra sounds, sprites and models the map needs so clients know what to download. mapcycle.txt in cstrike/ is the rotation, one map name per line, and motd.txt is the panel of text players see when they connect.
AMX Mod X takes over rotation on most servers. configs/maps.ini is the list the vote plugins offer, and the standard mapchooser, nextmap and timeleft plugins between them run an end-of-map vote, announce what is next and answer say timeleft. If you want a fixed rotation instead, remove mapchooser from plugins.ini and let mapcycle.txt do it.
Custom content is where 1.6 servers lose players. A client that does not have your map has two ways to get it:
- In-engine download, with
sv_allowdownload 1. It works and it is painfully slow, and a 20 MB map means a two-minute stare at a progress bar. Some clients give up. sv_downloadurl "http://files.example.com/cstrike", pointing at a web server that mirrors the folder structure -maps/,sound/,sprites/,models/. Files can be stored bzip2-compressed asde_yourmap.bsp.bz2and the client will unpack them. This is tens of times faster and is what every busy server does.
Any static web host works for the second option, including a small web hosting plan - it is a folder of files over HTTP with nothing clever about it. Keep the content identical to what the server has, because a mismatched sprite with mp_consistency 1 gets the player kicked with a message nobody understands.
Bots, cheating and non-Steam clients#
CS 1.6 ships with ZBot, the bot ported from Condition Zero. bot_add, bot_add_t, bot_add_ct, bot_quota <n>, bot_difficulty 0 to 3 and bot_kick are the whole interface. Bots need a navigation file for the map, maps/de_dust2.nav, which official maps have and custom maps almost never do. The alternative is a Metamod bot such as YaPB or POD-Bot, which bring their own waypoints, handle custom maps better and can be configured per map - which is why almost every populated 1.6 server that uses bots uses one of those rather than ZBot.
Cheating is the honest weak point of the game. VAC exists and catches the careless. The server-side defences are sv_cheats 0, mp_consistency 1, and an AMX Mod X anti-cheat plugin that watches for impossible behaviour, plus ReAuthCheck on the ReHLDS side to reject clients presenting SteamIDs that are not theirs. None of this is a solved problem, and a server that grows will need an active admin more than it needs another plugin. Keeping a modded server clean is about mods rather than cheats, but the discipline is the same one.
Then there is the thing every 1.6 guide skips. A large share of the remaining 1.6 population plays non-Steam builds of the client, and servers that want those players install ReUnion, which accepts them and issues generated identities. It is a real fork in the road, not a detail. Accept them and you get a busier server, an unauthenticated population, and SteamID bans and SteamID admin that no longer mean much because a banned player returns with a new identity. Refuse them and you keep sv_lan 0, real Steam authentication, bans that stick, and a smaller pool of players. Both kinds of server exist and both work. Decide deliberately, because retrofitting the decision onto an established server means rebuilding your admin and ban lists.
Troubleshooting#
SteamCMD fails to install app 90. Run it again. And again. It is not you; the app 90 manifest fails intermittently and the same command succeeds on a later attempt. Check +app_set_config 90 mod cstrike comes before +app_update 90.
The server starts but does not appear in the browser. Check sv_lan 0 and sv_region, then test a direct connect by address. If direct works, the server is fine and the master list is slow.
`meta list` says nothing. liblist.gam still points at the original game library. Check both the gamedll and gamedll_linux lines - editing only the one for your platform is fine, editing neither is the usual mistake.
AMX Mod X loads but a plugin does not. Read addons/amxmodx/logs/. It will name the missing module or the compile error. Modules are enabled in modules.ini, plugins in plugins.ini, and the plugin file itself must exist in plugins/.
Admins have no rights. Either the SteamID in users.ini is not exactly the one the player has, or the account flags are missing c. Run amx_who while they are connected to see what the server thinks they are, then amx_reloadadmins.
Players are kicked for inconsistent files. mp_consistency 1 with content on the server that differs from what the download URL serves. Make the two identical.
Everything stutters at 32 players. Look at sys_ticrate against the CPU limit before blaming the plugins. A server at its hard CPU limit is slow rather than broken, and it does not announce itself except in the frame rate.
FAQ#
Is Counter-Strike 1.6 still worth hosting in 2026?
Yes, in the sense that the servers with a community still fill every evening. It is the cheapest game to host by a wide margin, the mod scene has twenty years of depth behind it, and the entire population that remains chose to remain. It is not a game you launch a server for and wait to be found.
What is the difference between HLDS and ReHLDS?
ReHLDS is a reimplementation of the same engine, binary-compatible with existing mods and plugins, with the accumulated crashes and exploits fixed and extra cvars added. It is a drop-in replacement, and there is no practical reason to run original HLDS now.
How much RAM does a CS 1.6 server need?
256 MB for a small server, 512 MB for a full 32-slot server with a normal plugin set, and 1 GB or more for the heavy AMXX game modes like Zombie Plague that hold state for every player. Memory is almost never the limit on 1.6; single-thread CPU is.
How do I make myself admin?
Add a line to cstrike/addons/amxmodx/configs/users.ini with your SteamID, no password, the access flags you want and the account flags ce. Run amx_reloadadmins in the console. Then type amxmodmenu in game.
Why do players have to download maps so slowly?
Because the engine's own file transfer is from 1998. Set sv_downloadurl to a web server holding the same maps/, sound/ and sprites/ folders, ideally with bzip2-compressed copies, and downloads become fast enough that people stay.
Can non-Steam clients join my server?
Only if you install ReUnion, which accepts them and assigns generated identities. The trade-off is that SteamID bans and SteamID-based admin become much weaker. A default server with sv_lan 0 accepts Steam clients only.




Comments
Completely anonymous: no account, no email, no cookie. We store the name you type, the text and the time - nothing else. Links are limited and markup is not rendered.