想和朋友练枪、跑 5v5、办小型比赛或搭建长期社区服,自建 Counter-Strike 2(CS2)专用服务器通常比临时房间更可控:地图、模式、密码、封禁、日志、CSTV 和更新时间都掌握在自己手里。真正容易踩坑的不是下载游戏,而是把旧 CS:GO 的 App ID、二进制路径和参数原样照搬,漏配 GSLT,把端口协议开错,或在更新前没有备份配置。
本文以 Ubuntu 24.04 LTS、SteamCMD、Valve 官方 CS2 服务端文件和 systemd 为例,从零完成安装、GSLT、27015 端口、防火墙、竞技模式、server.cfg、自动更新、配置备份和故障排查。正文中的命令面向单台 Linux VPS,不使用来历不明的游戏镜像,也不会把 GSLT 或管理员密码写进公开文件。
CS2 服务端不需要独立显卡,但对 CPU 单核性能、持续睿频、网络抖动和磁盘更新速度比较敏感。Valve 没有给普通社区服发布一套能保证并发量的 VPS 最低配置,因此下面是便于购买和压测的实战起点,不是官方性能承诺:
| 使用规模 | 建议 VPS 起点 | 磁盘 | 适用场景 |
|---|---|---|---|
| 5v5 私人服 | 4 个高性能 vCPU、8GB 内存 | 80GB NVMe | 原版竞技、训练、朋友开黑 |
| 12-20 人社区服 | 6 个高性能 vCPU、12-16GB 内存 | 100GB NVMe | 公开服、日志、少量扩展 |
| 多实例或比赛服 | 8 核以上、16-32GB 内存 | 160GB+ NVMe | 多个端口、CSTV、录像与赛务 |
App ID 730 包含完整 CS2 游戏内容,下载与更新会占用较多磁盘和临时空间。不要按旧 CS:GO 独立服务端的体积购买小硬盘;至少给系统、服务端、更新余量、日志和备份分别留出空间。
机房应靠近主要玩家。对射击游戏来说,低延迟只是第一步,晚高峰丢包、抖动、CPU 超售和 UDP 防护同样重要。购买前确认服务商允许游戏服务器,并了解流量、DDoS 清洗、被攻击后的封禁策略和换 IP 成本。可先参考游戏服务器 VPS 推荐与配置指南。
| 方案 | 优点 | 代价 | 适合谁 |
|---|---|---|---|
| SteamCMD + systemd | 与 Valve 官方命令最接近,目录透明,方便排障 | 主要通过 SSH 管理 | 单台 VPS、单个 CS2 实例 |
| LinuxGSM | 封装安装、更新、监控和备份命令 | 需要理解 LinuxGSM 的配置层 | 同时维护多种 Linux 游戏服 |
| Pterodactyl | Web 面板、用户、配额和多实例管理 | 额外维护 Panel、Wings、数据库和网络 | 托管多个实例或多人运维 |
本文选择 SteamCMD + systemd,便于清楚看到 App ID、二进制路径、启动参数和配置文件。若你计划同时运行 Minecraft、Rust、Palworld 和 CS2,可使用VPS 搭建 Pterodactyl 游戏服务器面板;想对比另一种游戏服管理方式,可查看Rust 专用服务器 LinuxGSM 教程。
这是部署前最重要的区别:
- Valve 当前赛事技术文档使用
app_update 730 validate获取 CS 游戏服务端。 - Linux 启动的是 Source 2 的
cs2二进制,并添加-dedicated。 - App ID
740属于旧 CS:GO Dedicated Server 教程,不应用于当前 CS2 部署。 - 公开服务器使用的 GSLT 也应按 CS AppID
730创建。
看到教程仍要求下载 740、运行 srcds_run 或进入旧版 csgo 服务端目录时,应先确认它讲的是 CS2 还是已被替代的 CS:GO 流程。
单个普通实例先按最小端口集部署:
| 端口 | 协议 | 用途 | 是否公开 |
|---|---|---|---|
| 27015 | UDP + TCP | 玩家连接、查询与服务端通信 | 是 |
| 27020 | UDP | CSTV 观看端口 | 仅启用 CSTV 时开放 |
| 22 | TCP | SSH 管理 | 仅管理员 IP,或改为实际 SSH 端口 |
Valve 的比赛服务器示例让玩家连接 IP:27015,CSTV 观看者连接 IP:27020。普通私人服不需要 CSTV,就不要开放 27020。多实例部署应给每个实例分配独立游戏端口、CSTV 端口和 GSLT,不能让多个实例复用同一监听端口或令牌。
如果使用域名,例如 cs2.example.com,添加 A 记录指向 VPS 公网 IPv4 即可。普通 Cloudflare 橙云代理不转发 CS2 游戏流量,应使用 DNS only,或让玩家直接连接公网 IP。
先用有 sudo 权限的管理员账号更新系统并安装基础依赖:
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl ca-certificates tar lib32gcc-s1 ufw
创建不用于日常登录的 cs2 服务账号,并准备安装目录:
sudo adduser --disabled-password --gecos "" cs2
sudo install -d -o cs2 -g cs2 /opt/steamcmd
sudo install -d -o cs2 -g cs2 /opt/cs2
sudo -iu cs2
不要以 root 身份运行游戏服务端。独立用户能缩小服务进程被利用后的权限范围,也能避免更新脚本把文件写成 root 所有,导致后续 SteamCMD 无法覆盖。
以下命令以 cs2 用户执行。从 Valve 的 Steam CDN 下载 Linux 版 SteamCMD:
cd /opt/steamcmd
curl -fsSL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz -o steamcmd_linux.tar.gz
tar -xzf steamcmd_linux.tar.gz
./steamcmd.sh +quit
首次运行会自更新。确认入口文件存在:
test -x /opt/steamcmd/steamcmd.sh
先尝试匿名登录下载 App ID 730:
/opt/steamcmd/steamcmd.sh \
+force_install_dir /opt/cs2 \
+login anonymous \
+app_update 730 validate \
+quit
force_install_dir 应放在 login 前,避免 SteamCMD 发出路径顺序警告。validate 适合首次安装或修复损坏文件;日常更新通常不必每次校验全部文件。
如果当前 Steam 后端要求登录,不要把账号密码直接写进脚本。为服务器准备一个拥有 CS2 的独立 Steam 账号,交互式执行 SteamCMD,再输入用户名、密码和 Steam Guard 验证。不要使用个人主账号,也不要把凭据保存在 shell 历史或公开仓库。
安装完成后检查 Source 2 Linux 二进制:
test -x /opt/cs2/game/bin/linuxsteamrt64/cs2
ls -lh /opt/cs2/game/bin/linuxsteamrt64/cs2
du -sh /opt/cs2
公开 CS2 服务器需要 Game Server Login Token。登录 Steam 的游戏服务器账户管理页面,使用 App ID 730 创建令牌。
Steam 官方页面要求账号:
- 没有社区封禁或锁定;
- 不是受限账户;
- 绑定符合要求的手机;
- 拥有对应游戏;
- 不把 GSLT 分发给第三方。
每个实例使用不同的 GSLT。令牌泄露后应立即在 Steam 页面删除并重新创建;Steam 密码被支持渠道重置时,现有令牌也可能被重新生成。长期从未登录的令牌可能过期。
退出 cs2 用户并建立只允许 root 读取的环境文件:
exit
sudo install -d -m 700 -o root -g root /etc/cs2
sudo nano /etc/cs2/cs2.env
写入一行,把示例替换为真实 GSLT:
CS2_GSLT=REPLACE_WITH_YOUR_APP_730_GSLT
限制权限:
sudo chown root:root /etc/cs2/cs2.env
sudo chmod 600 /etc/cs2/cs2.env
不要把令牌直接写在 systemd unit、server.cfg、截图、日志工单或本文命令中。
CS2 的自定义服务端配置放在:
/opt/cs2/game/csgo/cfg/server.cfg
创建文件并确保服务账号拥有配置目录:
sudo install -d -o cs2 -g cs2 /opt/cs2/game/csgo/cfg
sudo -u cs2 nano /opt/cs2/game/csgo/cfg/server.cfg
写入一个保守的私人竞技服起点:
hostname "My Private CS2 Server"
sv_password "REPLACE_WITH_PLAYER_PASSWORD"
sv_lan 0
sv_cheats 0
sv_hibernate_when_empty 0
log on
mp_autoteambalance 1
mp_limitteams 1
exec banned_user.cfg
exec banned_ip.cfg
writeid
writeip
生成玩家密码:
openssl rand -base64 24
把结果写入 sv_password 后限制文件读取权限:
sudo chown cs2:cs2 /opt/cs2/game/csgo/cfg/server.cfg
sudo chmod 600 /opt/cs2/game/csgo/cfg/server.cfg
公开服可以把 sv_password 设为空字符串。不要开启 sv_cheats 1 运行生产服,也不要直接修改 Valve 随更新分发的默认游戏模式文件;自定义内容应放进 server.cfg 或相应的 gamemode_*_server.cfg。
创建 unit:
sudo nano /etc/systemd/system/cs2.service
写入:
[Unit]
Description=Counter-Strike 2 Dedicated Server
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=cs2
Group=cs2
WorkingDirectory=/opt/cs2/game/bin/linuxsteamrt64
EnvironmentFile=/etc/cs2/cs2.env
ExecStart=/opt/cs2/game/bin/linuxsteamrt64/cs2 -dedicated -console -usercon -port 27015 +game_type 0 +game_mode 1 +mapgroup mg_active +map de_dust2 +sv_setsteamaccount ${CS2_GSLT} +exec server.cfg
Restart=on-failure
RestartSec=10
KillSignal=SIGINT
TimeoutStopSec=90
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
这组模式参数表示经典竞技模式:game_type 0、game_mode 1。Valve 当前比赛服务器示例同样使用这组值。想运行休闲模式可改成 game_type 0、game_mode 0,然后重启并核对日志。
加载、启动并检查状态:
sudo systemctl daemon-reload
sudo systemctl enable --now cs2
sudo systemctl status cs2 --no-pager
sudo journalctl -u cs2 -n 150 --no-pager
日志中应能看到地图加载、Steam 游戏服务器登录和监听端口信息。若出现 GSLT 登录失败,不要反复生成令牌掩盖问题,应检查 App ID、令牌是否被删、环境文件权限和 Steam 账号状态。
保持当前 SSH 会话不要关闭,先放行 SSH:
sudo ufw allow OpenSSH
sudo ufw allow 27015/udp
sudo ufw allow 27015/tcp
sudo ufw status numbered
sudo ufw enable
启用 CSTV 时再添加:
sudo ufw allow 27020/udp
云厂商安全组要配置相同协议。随后检查实际监听:
sudo ss -lntup | grep -E ':27015|:27020'
最常见错误是只开放 TCP 27015、只改 UFW 却漏掉云安全组,或一次性开放一大段无关端口。普通单实例先只开确定需要的端口;如果日志显示实例使用了不同端口,再追查启动参数和冲突进程。
在 CS2 设置中启用开发者控制台,按 ~ 打开控制台并输入:
connect 203.0.113.20:27015
把示例 IP 换成 VPS 真实公网 IPv4。使用域名时:
connect cs2.example.com:27015
服务器设置了密码后,客户端会提示输入。连接失败时先使用公网 IP 排除 DNS 问题,再检查 systemd、监听端口、UFW、云安全组和服务端版本。
只有确实需要观战、解说或录像时才启用 CSTV。在 systemd 的 ExecStart 末尾增加:
+tv_enable 1 +tv_port 27020
重新加载并重启:
sudo systemctl daemon-reload
sudo systemctl restart cs2
sudo journalctl -u cs2 -n 150 --no-pager
sudo ss -lunp | grep ':27020'
观众连接:
connect 203.0.113.20:27020
Valve 的官方比赛测试流程也使用玩家端口 27015 与 CSTV 端口 27020。私人 5v5 不需要 CSTV时应保持关闭,减少额外带宽、存储和暴露面。
标准地图本身可由 SteamCMD 重新下载,真正需要保护的是自定义配置、封禁列表、比赛配置、日志、录像和插件数据。先创建备份目录:
sudo install -d -m 750 -o root -g cs2 /var/backups/cs2
在维护窗口停服并打包配置目录:
sudo systemctl stop cs2
sudo tar -C /opt/cs2 -czf \
"/var/backups/cs2/cs2-config-$(date -u +%Y%m%dT%H%M%SZ).tar.gz" \
game/csgo/cfg
sudo systemctl start cs2
sudo systemctl is-active cs2
检查压缩包:
sudo ls -lh /var/backups/cs2
sudo tar -tzf /var/backups/cs2/cs2-config-YYYYMMDDTHHMMSSZ.tar.gz | head -n 50
把示例文件名换成实际生成的文件。比赛录像、插件和 Workshop 内容位于其他目录时,应按实际路径加入备份清单。至少同步一份到另一台机器或对象存储,并定期做恢复演练。完整的异机备份方案可参考VPS 备份与恢复演练指南。
恢复前先停止服务并保留当前配置:
sudo systemctl stop cs2
sudo tar -tzf /var/backups/cs2/cs2-config-YYYYMMDDTHHMMSSZ.tar.gz | head -n 50
sudo mv /opt/cs2/game/csgo/cfg \
"/opt/cs2/game/csgo/cfg.before-restore-$(date -u +%Y%m%dT%H%M%SZ)"
sudo tar -C /opt/cs2 -xzf \
/var/backups/cs2/cs2-config-YYYYMMDDTHHMMSSZ.tar.gz
sudo chown -R cs2:cs2 /opt/cs2/game/csgo/cfg
sudo systemctl start cs2
核对状态、配置加载和玩家连接:
sudo systemctl status cs2 --no-pager
sudo journalctl -u cs2 -n 200 --no-pager
sudo ss -lntup | grep ':27015'
确认服务器名称、密码、模式、封禁列表和连接都正常后,恢复才算完成。在验收前保留 cfg.before-restore-*,不要立即删除唯一的回退副本。
客户端与服务端版本不一致时,玩家会遇到版本过旧或无法连接。创建 root 执行的维护脚本:
sudo nano /usr/local/sbin/update-cs2-server
写入:
#!/usr/bin/env bash
set -euo pipefail
backup_dir=/var/backups/cs2
stamp=$(date -u +%Y%m%dT%H%M%SZ)
was_active=0
install -d -m 750 -o root -g cs2 "$backup_dir"
if systemctl is-active --quiet cs2; then
was_active=1
systemctl stop cs2
fi
restart_service() {
if [ "$was_active" -eq 1 ]; then
systemctl start cs2
fi
}
trap restart_service EXIT
tar -C /opt/cs2 -czf \
"$backup_dir/cs2-before-update-$stamp.tar.gz" \
game/csgo/cfg
sudo -u cs2 /opt/steamcmd/steamcmd.sh \
+force_install_dir /opt/cs2 \
+login anonymous \
+app_update 730 \
+quit
保存后设置权限并手动测试:
sudo chown root:root /usr/local/sbin/update-cs2-server
sudo chmod 750 /usr/local/sbin/update-cs2-server
sudo /usr/local/sbin/update-cs2-server
sudo systemctl is-active cs2
sudo journalctl -u cs2 -n 150 --no-pager
脚本会在更新前停服并备份配置;即使 SteamCMD 失败,退出处理也会尝试恢复原服务状态。若你的 SteamCMD 必须交互登录,不要启用无人值守更新,应在维护窗口手动执行。
自动更新会中断在线比赛,因此只适合有固定低峰维护窗口、并且已经验证匿名 SteamCMD 可用的服务器。创建 service:
sudo nano /etc/systemd/system/cs2-update.service
[Unit]
Description=Update Counter-Strike 2 Dedicated Server
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/update-cs2-server
创建 timer:
sudo nano /etc/systemd/system/cs2-update.timer
[Unit]
Description=Daily CS2 update maintenance window
[Timer]
OnCalendar=*-*-* 05:30:00
RandomizedDelaySec=10m
Persistent=true
[Install]
WantedBy=timers.target
加载并查看下一次执行时间:
sudo systemctl daemon-reload
sudo systemctl enable --now cs2-update.timer
systemctl list-timers cs2-update.timer
公开社区服更适合先监控 Valve 更新,再提前通知玩家后手动触发。不要在比赛中途让 timer 强制停服。
先记录一周真实高峰数据:
free -h
df -h /opt/cs2 /var/backups/cs2
uptime
ps -C cs2 -o pid,%cpu,%mem,rss,etime,cmd
sudo journalctl -u cs2 --since "30 minutes ago" --no-pager
重点关注:
- 单核长期满载、多人交火时延迟突增:迁移到单核更强、超售更低的节点。
- 内存不断增长或出现 OOM:先停用未经验证的插件,再升级内存。
- 更新经常因磁盘不足失败:扩大 NVMe,并给新版本下载和备份保留额外空间。
- 晚高峰丢包、jitter 明显:更换更靠近玩家且 UDP 质量稳定的线路。
- CSTV 录像和日志快速增长:单独设置保留周期,不要让根分区写满。
不要迷信“更多 vCPU”。对单个 5v5 实例,稳定单核和网络质量通常比一堆慢核更重要。扩容前先通过真实比赛复现问题,并排除插件、日志和磁盘空间因素。
检查安装命令是否为 App ID 730,以及二进制是否存在:
test -x /opt/cs2/game/bin/linuxsteamrt64/cs2
grep -n '"appid"' /opt/cs2/steamapps/appmanifest_730.acf | head
如果教程要求 App ID 740 和 srcds_run,它描述的不是当前 CS2 服务端流程。
查看 unit 与完整日志:
sudo systemctl status cs2 --no-pager
sudo journalctl -u cs2 -n 250 --no-pager
sudo systemctl cat cs2
重点检查二进制路径、运行用户、工作目录、缺失的 32 位运行库和环境文件。不要在 unit 里包一层不必要的 bash -c 掩盖真实退出码。
确认令牌按 App ID 730 创建,未被删除或过期,而且每个实例使用独立 GSLT:
sudo test -s /etc/cs2/cs2.env
sudo stat -c '%a %U:%G %n' /etc/cs2/cs2.env
sudo journalctl -u cs2 -n 250 --no-pager | grep -iE 'steam|token|login|auth'
不要把真实令牌复制到终端输出、聊天或工单。若怀疑泄露,直接在 Steam 管理页面删除并重建。
依次检查进程、端口、本机防火墙和云安全组:
sudo systemctl is-active cs2
sudo ss -lntup | grep ':27015'
sudo ufw status numbered
sudo journalctl -u cs2 -n 200 --no-pager
使用公网 IP 直连排除 DNS 问题。确认 UDP 和 TCP 规则都存在,并核对 systemd 实际启动参数没有改到其他端口。
先通知玩家并执行维护更新:
sudo /usr/local/sbin/update-cs2-server
sudo systemctl is-active cs2
sudo journalctl -u cs2 -n 200 --no-pager
仍失败时再用 app_update 730 validate 校验,不要删除整个安装目录,更不要删除配置备份。
确认文件位于:
/opt/cs2/game/csgo/cfg/server.cfg
并检查启动命令显式包含 +exec server.cfg。如果某个参数在 systemd ExecStart 中也有定义,命令行值可能覆盖配置文件。修改 unit 后要执行 systemctl daemon-reload,修改配置后至少重启服务并回看日志。
- SteamCMD 使用 App ID 730,服务端二进制为
linuxsteamrt64/cs2。 - 服务以独立
cs2用户运行,不使用 root。 - GSLT 按 CS AppID 730 创建,每个实例独立且未公开。
-
/etc/cs2/cs2.env权限为 600、所有者为 root。 -
systemctl is-active cs2返回active。 - 27015 TCP/UDP 在 UFW 和云安全组中均正确放行。
- 未使用 CSTV 时没有开放 27020;启用后已验证观众连接。
- Steam 客户端能通过公网 IP 或 DNS-only 域名加入。
-
server.cfg生效,sv_cheats保持关闭。 - 更新前会备份配置,异机至少保留一份。
- 已实际做过配置恢复,并验证服务器名称、模式和封禁列表。
- 定时更新只运行在明确维护窗口,不会中断比赛。
在 VPS 上稳定运行 CS2 专用服务器,核心不是复制一条启动命令,而是使用当前 App ID 730 和 Source 2 cs2 二进制,安全保存每实例独立的 GSLT,正确开放 27015 TCP/UDP,并把配置备份、systemd 守护和更新维护窗口一起做好。
私人 5v5 可以从 4 个高性能 vCPU、8GB 内存和 80GB NVMe 起步,公开服则应根据实际 CPU 峰值、网络抖动、日志与 CSTV 空间逐步扩容。上线前做一次真实连接、版本更新和恢复演练,比盲目增加端口、插件或自动化更能减少比赛中断。
