ioquake3《雷神之锤3》 专用服务器搭建教程:Linux 上运行 Quake III Arena 多人对战

ioquake3《雷神之锤3》 专用服务器搭建教程:Linux 上运行 Quake III Arena 多人对战

Quake III Arena 发布于 1999 年,至今仍是竞技射击游戏的经典之作。2005 年 id Software 将其源码以 GPL 协议开源,ioquake3 项目在此基础上持续维护和改进引擎,修复了大量原版 bug,添加了现代操作系统支持、IPv6、VoIP 等新特性。对于复古游戏爱好者、LAN Party 组织者,或希望搭建私人对战服务器的玩家来说,ioquake3 服务端是完美选择。

ioquake3 专用服务器的资源占用极低,一个 8 人同时在线的服务器通常只需不到 50MB 内存和 1% 的 CPU 占用。服务器支持多种游戏模式,包括 Free For All(全员对战)、Team Deathmatch(团队死斗)、Capture The Flag(夺旗)和 Tournament(锦标赛)等,通过修改配置文件即可灵活切换。此外,ioquake3 完全兼容原版 Quake III Arena 的地图和 MOD,你可以从合法渠道获取的原版游戏文件中提取资源文件来使用。

本教程将介绍如何在 Ubuntu/Debian 上通过 apt 安装 ioquake3,配置专用服务器,以及使用 systemd 实现开机自启和后台运行管理。


服务器配置

Quake III Arena 服务端对资源需求极小,是最省资源的游戏服务器之一。

推荐使用雨云服务器 rainyun-com ,注册填优惠码 2026off 领 5 折优惠券。1 核 2GB 机型完全满足 ioquake3 专用服务器的运行需求,支持同时容纳 16-32 名玩家在线对战而不出现卡顿。操作系统推荐 Ubuntu 22.04 LTS 或 Debian 12。服务器需开放 UDP 27960 端口(Quake3 默认端口)。


安装准备工作

更新系统并安装依赖

bash 复制代码
sudo apt update && sudo apt upgrade -y
sudo apt install -y wget unzip screen

安装 ioquake3

Ubuntu 和 Debian 官方仓库中包含 ioquake3:

bash 复制代码
sudo apt install -y ioquake3-server

安装完成后,服务端二进制文件位于 /usr/lib/ioquake3/ioq3ded(不同发行版路径可能略有差异):

bash 复制代码
which ioq3ded
# 或查找二进制位置
find /usr /lib -name "ioq3ded" 2>/dev/null

获取游戏数据文件(PAK 文件)

ioquake3 服务端需要原版 Quake III Arena 的 .pk3 数据文件。这些文件受版权保护,你需要拥有合法授权的游戏副本(Steam 版本或原版光盘):

bash 复制代码
# 创建游戏数据目录
sudo mkdir -p /var/games/quake3/baseq3

# 将原版游戏的 pak0.pk3 到 pak8.pk3 复制到该目录
# (从 Steam 版游戏目录或光盘提取)
sudo cp /path/to/quake3/baseq3/pak*.pk3 /var/games/quake3/baseq3/

# 设置正确权限
sudo chmod 644 /var/games/quake3/baseq3/*.pk3

注意: 如果你只想运行服务器测试,部分地图(如 q3dm17.bsp)可以从社区自由分发的免费包中获取。

防火墙配置

bash 复制代码
# 开放 Quake3 默认 UDP 端口
sudo ufw allow 27960/udp

# 如果需要多个游戏实例,开放端口范围
sudo ufw allow 27960:27970/udp

sudo ufw status

详细配置

创建服务器配置文件

创建专用配置目录和主配置文件:

bash 复制代码
sudo mkdir -p /etc/quake3
sudo nano /etc/quake3/server.cfg
cfg 复制代码
// =============================================
// ioquake3 专用服务器配置文件
// =============================================

// 服务器基本信息
sv_hostname "My ioquake3 Server"     // 服务器名称(显示在服务器列表)
sv_maxclients 16                      // 最大玩家数量
sv_pure 1                             // 纯净模式(防止客户端 MOD 作弊)
sv_password ""                        // 服务器密码(留空=公开)
rconpassword "your_rcon_password"     // 远程控制密码(请修改!)

// 游戏模式设置
g_gametype 0                          // 0=FFA, 1=竞技, 3=TDM, 4=夺旗
fraglimit 50                          // 击杀上限(达到后自动换图)
timelimit 20                          // 时间上限(分钟,0=无限制)
capturelimit 8                        // 旗帜上限(仅夺旗模式)

// 网络设置
net_port 27960                        // 游戏端口
sv_lanForceRate 0                     // 不强制局域网速率限制
sv_maxRate 25000                      // 每个客户端最大带宽(字节/秒)
sv_minRate 0
sv_fps 20                             // 服务器帧率(通常 20 足够)

// 机器人配置(可选,在玩家不足时补充 AI)
bot_enable 1                          // 启用机器人
bot_minplayers 4                      // 最少保持的玩家数(不足时加入机器人)
g_spskill 2                           // 机器人难度(1-5)

// 地图轮换配置
// 使用 map 命令加载初始地图,配合 nextmap 实现地图轮换
map q3dm17
// 注意:地图轮换通过 mapcycle 文件实现(见下方)

// 日志
g_log "server.log"                    // 日志文件名
g_logSync 0                           // 异步写入日志(性能更好)

// 服务器规则显示
sets ".location" "CN"
sets ".admin" "admin@example.com"
sets ".URL" "https://example.com"

创建地图轮换文件

bash 复制代码
sudo nano /var/games/quake3/baseq3/mapcycle.cfg
cfg 复制代码
// 地图轮换配置
// 格式:map <地图名> <可选参数>

map q3dm17
{
    fraglimit 50
    timelimit 20
    g_gametype 0
}
map q3dm7
{
    fraglimit 50
    timelimit 20
}
map q3dm1
{
    fraglimit 50
    timelimit 20
}
map q3tourney2
{
    fraglimit 30
    timelimit 15
    g_gametype 0
}

将地图轮换引用加入主配置:

bash 复制代码
# 在 server.cfg 中添加:
echo "g_mapcycle mapcycle.cfg" | sudo tee -a /etc/quake3/server.cfg

创建启动脚本

bash 复制代码
sudo nano /usr/local/bin/quake3-server.sh
bash 复制代码
#!/bin/bash

IOQ3_BIN="/usr/lib/ioquake3/ioq3ded"
BASEDIR="/var/games/quake3"
CONFIG="/etc/quake3/server.cfg"
LOGDIR="/var/log/quake3"

mkdir -p "$LOGDIR"

exec "$IOQ3_BIN" \
    +set fs_game baseq3 \
    +set fs_basepath "$BASEDIR" \
    +set dedicated 2 \
    +exec server.cfg \
    +set g_log "$LOGDIR/game.log" \
    "$@"
bash 复制代码
sudo chmod +x /usr/local/bin/quake3-server.sh

systemd 服务配置

使用 systemd 管理 ioquake3 服务,实现自动启动和故障恢复:

bash 复制代码
sudo nano /etc/systemd/system/quake3.service
ini 复制代码
[Unit]
Description=ioquake3 Dedicated Game Server
After=network.target
Documentation=https://ioquake3.org/

[Service]
Type=simple
User=nobody
Group=nogroup

# 执行命令
ExecStart=/usr/local/bin/quake3-server.sh

# 故障自动重启
Restart=on-failure
RestartSec=5s

# 资源限制
LimitNOFILE=65536

# 标准输出日志
StandardOutput=journal
StandardError=journal
SyslogIdentifier=quake3

# 安全加固
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/log/quake3 /var/games/quake3

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable quake3
sudo systemctl start quake3
sudo systemctl status quake3

查看实时日志:

bash 复制代码
sudo journalctl -u quake3 -f

进阶用法

使用 RCON 远程管理

RCON(Remote Console)允许你通过网络远程管理服务器,无需 SSH 登录:

从服务器命令行连接:

bash 复制代码
# 安装客户端工具(quake3 也可充当 rcon 客户端)
# 在游戏客户端控制台中:
/rconpassword your_rcon_password
/rcon status
/rcon map q3dm17
/rcon kick playerName

使用 qstat 查询服务器状态:

bash 复制代码
sudo apt install -y qstat
qstat -q3s your_server_ip:27960

运行多个游戏实例

在同一服务器上运行多个模式(FFA + CTF):

bash 复制代码
# 复制配置文件
sudo cp /etc/quake3/server.cfg /etc/quake3/ctf-server.cfg
sudo nano /etc/quake3/ctf-server.cfg

修改 CTF 配置:

cfg 复制代码
sv_hostname "My CTF Server"
g_gametype 4          // 4 = 夺旗模式
capturelimit 8
net_port 27961        // 使用不同端口
map q3ctf1

复制 systemd 服务文件:

bash 复制代码
sudo cp /etc/systemd/system/quake3.service \
       /etc/systemd/system/quake3-ctf.service

sudo nano /etc/systemd/system/quake3-ctf.service
# 修改 ExecStart 指向 ctf-server.cfg

安装自定义地图和 MOD

bash 复制代码
# 将自定义地图 .pk3 文件放入 baseq3 目录
sudo cp custom_map.pk3 /var/games/quake3/baseq3/

# 安装 MOD(以 Rocket Arena 3 为例)
sudo mkdir -p /var/games/quake3/ra3
sudo cp ra3_*.pk3 /var/games/quake3/ra3/

# 启动时指定 MOD
exec "$IOQ3_BIN" +set fs_game ra3 +exec server.cfg

实战示例

快速查看服务器信息

bash 复制代码
# 检查服务状态
sudo systemctl status quake3

# 查看当前在线玩家(通过日志)
sudo journalctl -u quake3 --since "1 hour ago" | grep "ClientConnect"

# 查看端口监听
sudo ss -ulnp | grep 27960

设置定时换图脚本

bash 复制代码
sudo nano /usr/local/bin/quake3-map-rotate.sh
bash 复制代码
#!/bin/bash
# 每小时随机换一张地图
MAPS=("q3dm17" "q3dm7" "q3dm1" "q3tourney2" "q3dm14")
RANDOM_MAP=${MAPS[$RANDOM % ${#MAPS[@]}]}
RCON_PASS="your_rcon_password"
SERVER="127.0.0.1:27960"

# 通过 UDP 发送 RCON 命令(需要 hping3 或自定义脚本)
echo "Rotating map to: $RANDOM_MAP"

常见问题

Q:服务器无法启动,提示 "Unable to load pk3 files"

A:确认 .pk3 文件已正确放置在 /var/games/quake3/baseq3/ 目录,且 ioquake3 进程对该目录有读取权限。检查 fs_basepath 配置是否与实际路径匹配。

Q:玩家连接后立即断线

A:检查 sv_pure 1 模式下客户端的 pk3 文件是否与服务端一致。临时将 sv_pure 改为 0 测试,如问题消失则说明是文件不匹配问题。

Q:服务器不出现在公共服务器列表中

A:确认 +set dedicated 2 参数(2=向主服务器注册,1=仅局域网)。检查服务器 UDP 27960 端口是否对外可达:nmap -sU -p 27960 your_server_ip

Q:机器人不加入游戏

A:确认 bot_enable 1bot_minplayers 已正确设置,且 pak0.pk3 中包含机器人数据。部分免费地图包不含机器人 AI 文件。

Q:如何修改欢迎信息(MOTD)

A:在 server.cfg 中添加:

cfg 复制代码
sv_motd "Welcome to my server! Rules: no cheating."

搭建一台自己的 ioquake3 服务器不仅能重温经典,还能为朋友提供低延迟的私人对战环境。得益于 ioquake3 极低的资源消耗,一台入门级 VPS 就能轻松胜任。推荐选用雨云服务器 rainyun-com1 核 2GB 机型 ,注册时填入优惠码 2026off 可领取 5 折优惠券,以最低的成本搭建属于自己的 Quake III 专属服务器,随时召集老友开战,找回那个电竞黄金时代的热血感觉。