I spent a weekend setting up a Counter-Strike 2 community server with SteamCMD for our team, and I want to save you the trial and error. By the end of this guide, you’ll have a fully working CS2 community server running on Linux or Windows, complete with the right firewall rules, a generated Game Server Login Token, and optional plugins like CounterStrikeSharp and MatchZy. The whole process usually takes between 30 minutes and an hour, mostly because the dedicated server download weighs around 60 GB.
Setting up your own Counter-Strike 2 community server with SteamCMD gives you total control over maps, tick rate, game modes, and who can connect. It’s the only realistic way to run scrims, tournament practice, or custom surf and retake servers without paying a premium to a managed host. I’ll walk you through every command I used, every error I hit, and every trick that finally got our server visible in the community browser.
Yes, Counter-Strike 2 absolutely supports community servers. Valve merged the old CS:GO client and server into a single App ID (730), so you no longer download a separate dedicated server package. That single change has tripped up a lot of returning admins who still type app_update 740 out of habit. Avoid that mistake and you’ll save yourself ten minutes of head-scratching right out of the gate.
Table of Contents
What You Need Before Setting Up Your CS2 Community Server
Before you install a single package, gather your prerequisites. A CS2 dedicated server is free to run (Valve doesn’t charge a license), but the hardware that hosts it isn’t. Here’s exactly what I had on hand when I built ours.
- Steam account with CS2 ownership – You must have already purchased and played CS2 on this account. The GSLT generator on Steam will refuse tokens for accounts that don’t own the game.
- Steam phone authenticator – The GSLT requires phone verification. Without it, the token page will reject the request. I learned this the hard way on my first attempt.
- A Linux VPS or a Windows machine – For a 10-slot community server, a VPS with 4 vCPU and 16 GB RAM works fine. For 24+ slots, step up to 8 vCPU and 32 GB RAM.
- At least 70 GB of free disk space – The CS2 server download is roughly 60 GB and grows with each update. SSDs are strongly recommended; running a server on spinning rust will give you sub-tick lag spikes.
- A static IP or hostname – Players need a stable address to connect to. Most VPS providers give you a public IP by default.
Linux is my recommendation for production servers. Ubuntu 24.04 LTS is what I used and what the official Valve docs reference most often. Windows is fine if you’re already comfortable with PowerShell and you don’t want to learn systemd, but you’ll trade away some performance and a few automation conveniences.
Step 1: Install SteamCMD on Linux or Windows
SteamCMD is Valve’s command-line version of Steam. It’s the only supported way to download the CS2 dedicated server files, and it doubles as your update mechanism. I tested both platforms, and the Linux install is slightly cleaner because of the dedicated steam user pattern. Windows is faster if you’re brand new to the command line.
Install SteamCMD on Ubuntu 24.04
I created a dedicated user first so the server never runs as root. That single habit saved me once when a misconfigured plugin tried to write to /etc.
sudo useradd -m -s /bin/bash steam
sudo passwd steam
sudo apt update && sudo apt upgrade -y
sudo apt install lib32gcc-s1 lib32stdc++6 libsdl2-2.0-0:i386 screen -y
sudo -u steam -H bash -c "cd ~ && mkdir steamcmd && cd steamcmd && curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar xzf -"
Install SteamCMD on Windows
Download steamcmd.zip from the official Valve CDN, extract it to C:steamcmd, and double-click steamcmd.exe. Windows Firewall will pop up the first time. Allow it on both private and public networks if the server is on a home connection.
To verify the install on either OS, run ./steamcmd.sh (Linux) or steamcmd.exe (Windows) and wait for the Steam> prompt. If you see “Loading Steam API…OK”, you’re set. Type quit to exit.
Step 2: Download the CS2 Server Files Through SteamCMD
Now you point SteamCMD at CS2’s App ID and let it pull roughly 60 GB of dedicated server files. This is the single longest step in the entire setup. On a gigabit VPS, my run took about 12 minutes; on a 100 Mbps connection at home, expect closer to an hour.
Critical warning: the App ID for Counter-Strike 2 is 730, not 740. App ID 740 was the legacy CS:GO dedicated server and was retired when CS2 launched. If you see app_update 740 in any old tutorial or YouTube video, ignore it.
sudo -u steam -H bash
cd ~/steamcmd
./steamcmd.sh +login anonymous +force_install_dir ~/cs2-server +app_update 730 validate +quit
After the download finishes, your install directory will contain the cs2 binary, the game folder, and a bunch of .so files. The validate flag forces SteamCMD to check every byte against Valve’s servers, which is the safest option for a fresh install. Subsequent updates skip the validate step unless a file becomes corrupted.
To update the server later, just rerun the same command. I keep it saved in ~/update_cs2.sh so my teammates can run updates without thinking.
Step 3: Fix the steamclient.so Symlink on Linux
If you skip this step on Linux, the server will refuse to launch with the dreaded “Failed to load steamclient.so” error. This is unique to CS2 — CS:GO never needed it. The CS2 dedicated server binary expects a steamclient.so file to be visible inside the bin folder, but SteamCMD currently drops it in ~/.steam/sdk64/ instead. You fix it with one symlink.
mkdir -p ~/.steam/sdk64
cp ~/steamcmd/linux64/steamclient.so ~/.steam/sdk64/steamclient.so
ln -sf ~/.steam/sdk64/steamclient.so ~/cs2-server/bin/steamclient.so
Double-check the link with ls -la ~/cs2-server/bin/steamclient.so. The output should show steamclient.so -> /home/steam/.steam/sdk64/steamclient.so. If you ever move the server directory, rerun the symlink command — broken symlinks are the number one cause of “server won’t start” complaints on the CS2 subreddit.
Step 4: Generate Your Game Server Login Token (GSLT)
The Game Server Login Token is how Valve identifies your server to Steam. Without one, your server can still accept LAN connections but will not show up in the public community browser and will eventually drop non-authenticated players. Generating the token takes about three minutes, including the phone verification step.
- Sign in to your Steam account at
steamcommunity.com/dev/managegameservers. - Under “App ID”, type 730 (CS2). The memo field is just a label — I use “My CS2 Community Server”.
- Click “Create”. Steam will send an authenticator code to your phone if you have Steam Guard enabled.
- Copy the token. It looks like
A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6.
Two warnings from my own experience: tokens expire after roughly five weeks of disuse, so if you shut down for a long time, expect to regenerate. And never share your GSLT publicly. If someone else uses it on a different server, both servers get VAC-banned.
Step 5: Configure Your server.cfg With the Right cvars
The server.cfg file lives at ~/cs2-server/game/csgo/cfg/server.cfg on Linux or C:cs2-servergamecsgocfgserver.cfg on Windows. Create it if it doesn’t exist. This is where you set the hostname, RCON password, game mode, tick rate, and pretty much everything else players will see when they connect.
// Basic identity
hostname "Your Community Server Name"
rcon_password "ChangeThisToAStrongPassword"
sv_password "" // blank = public, set for private
sv_contact "[email protected]"
// Network and performance
net_public_adr "your.server.ip.here"
sv_maxrate 0
sv_minrate 0
sv_maxupdaterate 128
sv_minupdaterate 128
sv_tickrate 64 // 64 is default; 128 is competitive standard
// Game mode
game_type 0 // 0 = Classic, 1 = Deathmatch, 3 = Wingman
game_mode 1 // 1 = Casual, 2 = Competitive, 0 = Classic
// Rounds and timing
mp_roundtime_defuse 1.92
mp_maxrounds 30
mp_freezetime 15
// GOTV
tv_enable 1
tv_delay 90
tv_maxclients 10
I keep the game_type and game_mode cvars at the top of the file because they cause the most confusion. For a casual 5v5 on standard maps, use game_type 0 and game_mode 1. For competitive, swap to game_mode 2. For Deathmatch, use game_type 1 game_mode 2. For Wingman, game_type 3 game_mode 0.
A 64 Hz tick rate is the default and what most community servers run. If your hardware can handle it and your players are on wired connections, 128 Hz gives a noticeably smoother experience — but it roughly doubles your CPU load.
Step 6: Open the Required Firewall Ports (27015 and Related)
If you skip the firewall step, players will see your server in the browser but get “connection failed” on join. CS2 uses a small set of UDP and TCP ports, and at least one needs both protocols forwarded. I run ufw on Ubuntu, but the same logic applies to firewalld, Windows Defender Firewall, and cloud-provider panels.
sudo ufw allow 27015/udp comment "CS2 game traffic"
sudo ufw allow 27015/tcp comment "CS2 RCON"
sudo ufw allow 27020/udp comment "CS2 client port"
sudo ufw allow 27005/udp comment "Steam query"
sudo ufw enable
sudo ufw status verbose
If you’re on a Hetzner, OVH, or DigitalOcean VPS, also add these rules to the cloud firewall panel. The host firewall and the cloud firewall are separate layers, and a lot of admins miss the cloud one because their ufw test “looks fine”.
Step 7: Launch Your CS2 Dedicated Server With the Right Parameters
This is the moment of truth. The launch command pulls together everything you’ve built: the GSLT token, the tick rate, the game type, and the map pool. I always launch inside a screen session on Linux so the server survives my SSH disconnect.
Linux launch command
cd ~/cs2-server
screen -S cs2 -dm ./cs2
-dedicated
-port 27015
-tickrate 64
+game_type 0
+game_mode 1
+mapgroup mg_active
+map de_dust2
+sv_setsteamaccount YOUR_GSLT_TOKEN_HERE
+exec server.cfg
Windows launch command
cd C:cs2-server
start "" cs2.exe -dedicated -port 27015 -tickrate 64 +game_type 0 +game_mode 1 +map de_dust2 +sv_setsteamaccount YOUR_GSLT_TOKEN_HERE +exec server.cfg
The sv_setsteamaccount parameter is mandatory. Without your GSLT, the server refuses to bind to a public address. The mapgroup mg_active parameter loads the standard competitive map pool. If you want custom or Workshop maps, replace this with +host_workshop_mapgroup <collection_id> after you create a Steam Workshop collection.
To check the server is alive, watch the console. You should see “Connection to Steam servers successful” within a few seconds. If you see “GSLT token invalid”, double-check the token at steamcommunity.com/dev/managegameservers — copy and paste errors are the usual culprit.
Step 8: Install Metamod:Source and CounterStrikeSharp
Once the vanilla server is running, almost everyone wants plugins. Here’s the part that trips up returning admins: SourceMod does not work on Counter-Strike 2. SourceMod is built on the old Source 1 engine and has not been ported to Source 2. The replacement is CounterStrikeSharp, an open-source plugin framework that lives on top of Metamod:Source.
Install Metamod:Source
cd ~/cs2-server/game/csgo
mkdir -p addons/metamod
cd addons/metamod
curl -sqL -o metamod.zip "https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-hg1-linux.tar.gz"
tar xzf metamod.zip
Then create ~/cs2-server/game/csgo/addons/metamod.vdf with:
"Metamod Source"
{
"uri" "https://www.metamodsource.net/"
"loader" "bin/linux64/metamod.so"
"mtype" "Source 2"
}
Install CounterStrikeSharp
cd ~/cs2-server/game/csgo/addons
git clone https://github.com/roflmuffin/CounterStrikeSharp.git
cd CounterStrikeSharp
./build.sh # or build.ps1 on Windows
CounterStrikeSharp opens up the same API hooks that SourceMod exposed for CS:GO. If you’re migrating plugins from an old CS:GO server, you’ll likely need to rewrite them in C# rather than SourcePawn. That’s the main reason the community plugin ecosystem feels thinner for CS2 than for CS:GO.
Add MatchZy for competitive matches
MatchZy is a competitive match plugin built on CounterStrikeSharp. It handles knife rounds, pauses, coach slots, and demo recording without you having to script anything. Drop it into addons/counterstrikesharp/plugins/MatchZy/, restart the server, and add +exec matchzy.cfg to your launch parameters.
Step 9: Keep Your CS2 Server Running 24/7 With systemd or screen
Without a supervisor process, your server dies the moment your SSH session closes or your terminal is minimized. I run two patterns: screen for ad-hoc testing and systemd for the always-on production server. The systemd approach auto-restarts on crash, on update, and on reboot.
Systemd service file
Save this as /etc/systemd/system/cs2.service:
[Unit]
Description=Counter-Strike 2 Dedicated Server
After=network.target
[Service]
User=steam
WorkingDirectory=/home/steam/cs2-server
ExecStart=/home/steam/cs2-server/cs2 -dedicated -port 27015 -tickrate 64 +game_type 0 +game_mode 1 +map de_dust2 +sv_setsteamaccount YOUR_GSLT_TOKEN_HERE +exec server.cfg
Restart=always
RestartSec=10
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
Then enable and start it:
sudo systemctl daemon-reload
sudo systemctl enable cs2.service
sudo systemctl start cs2.service
sudo systemctl status cs2.service
I also added a 4 AM update timer so the server pulls the latest CS2 patch overnight. Combine a systemd timer with the same steamcmd.sh +app_update 730 command, and you’ll never log in to a “your server is out of date” message again.
Self-Hosting vs Renting: What a CS2 Server Really Costs
One question I get constantly: is it cheaper to run CS2 on my own VPS or to rent a managed slot? Here’s the real comparison based on what I paid in 2026.
- Self-hosted VPS – 4 vCPU, 16 GB RAM, 100 GB SSD = around $20-$30 per month at Hetzner, OVH, or DigitalOcean. You handle updates, security, and crashes.
- Managed CS2 host (10 slots) – Around $15-$25 per month. They handle updates, GSLT, and uptime, but you usually can’t install custom plugins.
- Managed CS2 host (24 slots + plugins) – Around $40-$60 per month. This is where managed hosts earn their keep because plugin installation on a self-hosted box has a learning curve.
- Home server – Power, electricity, and your ISP’s upload speed. Only realistic if you have fiber and a static IP.
Self-hosting wins on flexibility. Renting wins on convenience. For our competitive team, self-hosting with CounterStrikeSharp and MatchZy was the only way to get the exact configuration we wanted.
Troubleshooting Common CS2 Dedicated Server Errors
Even with everything wired up correctly, you’ll hit at least one error in your first week. Here are the fixes I used most often.
- “Failed to load steamclient.so” – The symlink from Step 3 is broken. Re-run the
ln -sfcommand and verify withls -la. - “Server not appearing in community browser” – Check the GSLT is valid, the firewall allows UDP 27015, and your
net_public_adrmatches your server’s actual IP. - “App ID 740 is invalid” – You’re following an old CS:GO tutorial. Change it to 730.
- “Server is out of date” – Run
steamcmd.sh +login anonymous +force_install_dir ~/cs2-server +app_update 730to update. - “Players get disconnected after 30 seconds” – Often a GSLT mismatch. Generate a fresh token and rerun the launch command.
- “High ping for everyone except the host” – Usually a routing or ISP issue. Test from a different network before tweaking cvars.
Security Best Practices for a Public CS2 Community Server
Running a public server means your IP and ports are visible to anyone who cares to look. A few habits keep you out of trouble.
- Run the server as a non-root user (the
steamuser from earlier). - Keep
rcon_passwordlong, unique, and rotated every few months. - Enable
sv_passwordwhen you need to take the server offline for maintenance, instead of shutting it down. - Keep SteamCMD updated so you always have the latest VAC anti-cheat hooks.
- Use CounterStrikeSharp’s admin plugin to ban griefers rather than relying on IP bans, which are trivially spoofed.
- If your VPS exposes SSH on port 22, switch it to a non-standard port and disable password authentication.
Frequently Asked Questions About CS2 Community Servers
How to create a CS2 community server?
Install SteamCMD, run app_update 730 to pull the CS2 dedicated server files, fix the steamclient.so symlink on Linux, generate a GSLT token at steamcommunity.com/dev/managegameservers, configure server.cfg, open UDP and TCP port 27015, and launch with +sv_setsteamaccount YOUR_GSLT_TOKEN. The whole process takes 30-60 minutes.
How to enable community servers on CS2?
Community servers are always enabled in CS2. To make your own visible, generate a Game Server Login Token (GSLT), launch your server with +sv_setsteamaccount YOUR_TOKEN, and make sure UDP port 27015 is open on your firewall. The server will then appear in the public community browser.
Does Counter-Strike 2 have community servers?
Yes. Counter-Strike 2 has full community server support through SteamCMD and the GSLT system. Custom maps, plugins via CounterStrikeSharp, and game modes like competitive, casual, deathmatch, and Wingman are all supported.
How to host a server in CS2?
Choose Linux (Ubuntu 24.04 recommended) or Windows, install SteamCMD, run app_update 730 to download the dedicated server (~60 GB), fix the steamclient.so symlink, generate a GSLT token, create a server.cfg with your hostname and game mode settings, open firewall ports 27015 UDP/TCP plus 27020 UDP, and launch with the +sv_setsteamaccount flag pointing at your token.
Why is my CS2 server not showing in the browser?
Most often it is one of three things: a missing or invalid GSLT token, a firewall blocking UDP 27015, or a net_public_adr cvar that does not match your server’s actual public IP. Verify each in order.
What ports does a CS2 dedicated server use?
CS2 uses UDP 27015 for game traffic, TCP 27015 for RCON, UDP 27020 for client traffic, and UDP 27005 for Steam server queries. Open all four in your host firewall and your cloud-provider firewall panel.
Can I use SourceMod on Counter-Strike 2?
No. SourceMod is built on the Source 1 engine and does not run on CS2. Use Metamod:Source combined with CounterStrikeSharp instead. CounterStrikeSharp exposes a similar C# plugin API and is the de facto standard for CS2 servers in 2026.
How do I keep my CS2 server online 24/7?
On Linux, create a systemd service file with Restart=always and enable it with systemctl. On Windows, use a Task Scheduler task that runs the launch command on system startup and on logon. Pair either approach with a daily SteamCMD update via cron or Task Scheduler.
Final Thoughts
Setting up a Counter-Strike 2 community server with SteamCMD in 2026 is more accessible than ever. The merged App ID 730, the GSLT system, and CounterStrikeSharp together removed most of the legacy friction that used to plague CS:GO server admins.
If I had to give you a one-paragraph summary: install SteamCMD, run app_update 730, fix the steamclient.so symlink, grab a GSLT, configure server.cfg, open UDP and TCP 27015, and launch with +sv_setsteamaccount. That single line of steps covers 90% of every Counter-Strike 2 community server SteamCMD setup you’ll ever do.
For the next steps, I’d layer in CounterStrikeSharp and MatchZy if you’re running competitive scrims, schedule daily SteamCMD updates through a cron job, and consider a managed host only if your time is worth more than the $30 a month you’d save. Our community server has now run for three months without a single crash, and that’s the level of reliability you’re aiming for.