Steam 挂卡服务搭建

Steam 挂卡的核心原理是通过模拟游戏运行状态向 Steam 服务器发送 “游戏正在运行” 的心跳请求从而高效获取集换式卡牌.

注意: Steam 服务条款禁止第三方工具模拟游戏运行, 可能导致账号警告、限制市场功能或封禁, 所以本质上这种行为是带有风险

这部分功能目前已经有第三方实现并开源, 具体可以查看 ArchiSteamFarm

以下部分也是基于 ArchiSteamFarm 项目来搭建处理, 注意这里是基于 Debian 发行版搭建处理, 官方也提供更加方便的 Docker.

建议需要挂卡的账号配置 Steam 所有安全登陆配置(官方2FA), 避免挂载过程之后泄漏登陆密码或者 Token 相关

安装部署

按照官方安装指南来部署环境配置, 内部采用命令行模式而无需运行游戏界面来节约大量资源处理, 需要执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 参照文档: https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Setting-up-zh-CN

# 注意: ArchiSteamFarm 是基于 .NET 开发, 也就代表需要安装对应的 .NET 依赖
# .NET: https://dotnet.microsoft.com/zh-cn/download
# 有长期支持版和和热更新版本, 建议直接采用长期支持版即可, 还需要确认 ArchiSteamFarm 是否带有版本支持
# 所以这里目前的版本是 .NET10 版本, 我这边是 Debian13
wget https://packages.microsoft.com/config/debian/13/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
# 如果采用 Ubuntu24.04 则需要注意: 202512 的时候, Ubuntu 还没出稳定发布版本, 所以目前还不可用源配置
# Ubuntu 不要混用 debian 源, 会直接破坏内部依赖
# 官方说明: https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu-install?tabs=dotnet10&pivots=os-linux-ubuntu-2404


# 以下是针对目前没有构建源管理的包的手动脚本安装
wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh # 下载安装脚本
chmod +x ./dotnet-install.sh # 对脚本赋予执行权限
./dotnet-install.sh --channel LTS # 默认安装的就是长期支持版本
# 默认安装的 SDK 都是放置于 /home/{执行系统用户}/.dotnet 之中, 因为不是源安装, 所以只能被指定系统用户才能执行
# 安装之后需要激活环境变量, 执行以下命令:
echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools' >> ~/.bashrc
source ~/.bashrc # 激活生效


# 按照配置
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-10.0


# 这里需要按照 ArchiSteamFarm 来安装依赖, 这里按照 redhat|debian 发行版不同, 包的名称也有不同
# 这里有些库是 libxxxx{版本号}{-dev} 这样命名, 所以需要依赖最新版本的编写
# 比如 libicu 这个库其实最新版本是 libicu74, libssl 最新版本包是 libssl-dev
sudo apt install -y ca-certificates libc6 libgcc-s1 libicu74 libgssapi-krb5-2 libssl-dev libstdc++6 zlib1g unzip

# 最后确认版本信息
dotnet --version # 这里有输出代表已经安装完成: 10.0.101

# 之后就是拉取官方的代码包, 一般拉取 latest(最新) 即可
# 下载页面: https://github.com/JustArchiNET/ArchiSteamFarm/releases/latest
# 因为这里采用 linux 服务器, 所以默认是 x64 平台, 如果是 arm64 的 cpu 就需要采用 arm64 的版本
# 我这边采用官方目前最新版本 6.3.0.2, 并下载到 /tmp 临时目录备用
wget https://github.com/JustArchiNET/ArchiSteamFarm/releases/download/6.3.0.2/ASF-linux-x64.zip -O /tmp/ASF.zip

# 这里我是专门在服务器创建 /data/ArchiSteamFarm 目录来管理
mkdir -p /data/ArchiSteamFarm && cd /data/ArchiSteamFarm # 创建目录并进入
unzip /tmp/ASF.zip # 解压文件到内部

# 解压之后的目录结构如下:
# ArchiSteamFarm (放置您自己与 ASF 相关的东西)
# ├── ArchiSteamFarm(.exe)
# ├── config (核心配置目录在此, 也是后续需要启用监控机器人 Steam 帐号/密码/登陆Pin 的地方)
# ├── logs
# ├── plugins
# ├── www
# └── (...)
#
# 如果有对应开发经验, 这里面大部分文件都可以知道是做什么的, 后续就是创建属于我们的挂卡机器人, 让其运行监控

# 默认直接写入 /data/ArchiSteamFarm/config/meteorcat-reboot.json
vim /data/ArchiSteamFarm/config/meteorcat-reboot.json # 创建首个监控机器人配置
# 之后就是编写配置文件内容, 这里面的文件名可以随便声明, 程序会自动检测内部的 *.json 文件

/data/ArchiSteamFarm/config/meteorcat-reboot.json 这里面的基础内容:

lines
1
2
3
4
5
6
7
8
9
10
11
12
13
// 这几行内容不要放入配置文件 ------------------------------ 
// 参考文档: https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Configuration-zh-CN
// SteamLogin: Steam 账号名
// SteamPassword: Steam 密码
// SteamParentalCode: Steam 手机令牌 PIN 码
// Enabled: 是否启用该机器人, true(启用), false(禁用)
// 这几行内容不要放入配置文件 ------------------------------
{
"SteamLogin": "meteorcat",
"SteamPassword": "meteorcat-password",
"SteamParentalCode": "4321",
"Enabled": true
}

官方有提供在线生成器 WebConfigGenerator,
但是这种私密化的东西(账号|密码|授权码)最好能尽量少暴露就少点暴露.

官方也有 ASF-UI 可以在线配置, 但是我还是保持私有信息尽可能多的去手动配置, 而非选择对外暴露生成器这种东西

编写好机器人配置之后, 就可以准备启动挂卡机器人, 需要执行以下命令:

1
2
3
# 启动命令, 需要确保执行管理员能够检索到 dotnet 和 Steam 信息正确
/data/ArchiSteamFarm/ArchiSteamFarm
# 这里会默认启动 WebGUI, 地址为: http://localhost:1242

在浏览器访问对应的 http://localhost:1242 确认是否能能够查看到页面, 如果可以就代表服务启动完成.

虽然目前已经启动正常, 但是距离正确安全配置 ArchiSteamFarm 还有很多事情要做.

安全实践

上面的部署虽然正常, 但是对于服务器安全性极差, 一旦 ArchiSteamFarm 服务被攻破那么整个服务器就会被瞬间被攻破.

除了安全问题之外其实还有很多问题需要用到单独管理:

  • 版本依赖: 如果将 dotnet 安装到全局, 可能因为用到比较新的 LTS 版本导致必须升级, 而升级可能会干扰到全局 dotnet

  • 环境隔离: 有时候部分 dotnet 会做定制配置处理, 可能会导致干扰到全局的 dotnet 依赖

所以我们要多整个系统服务做好安全加固, 确保不会因为 ArchiSteamFarm 服务被攻破的时候顺带服务器一起沦陷, 需要配置命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 一般来说这种应用级的软件最好安装在 /var/lib 之中, 所以按照这方面规范安装
# 我们需要单独创建个系统账号, 用于专门管理挂载机器人这个服务, 这个系统账号权限不能太高
# 这个系统用户不需要密码也不需要登陆, 并且锁定默认构建家目录为 /var/lib/asf
# 如果需要其他目录可以手动修改下, 这部分主要这个目录空间比较大
sudo useradd -r -m -d /var/lib/asf -s /sbin/nologin asf

# 当然如果数据不重要可以直接干脆删除 /data/ArchiSteamFarm 目录, 之后将 /tmp/ASF.zip 重新解压到内部
sudo -u asf mkdir -p /var/lib/asf/bin
sudo -u asf unzip /tmp/ASF.zip -d /var/lib/asf/bin


# 指定目录授权给 asf 用户
sudo chown -R asf:asf /var/lib/asf
sudo chmod -R 755 /var/lib/asf

# 切换系统用户
sudo su -s /bin/bash asf # 给无登录权限的asf用户, 临时分配bash环境并登录

# 给指定的系统用户安装 dotnet
wget https://dot.net/v1/dotnet-install.sh -O /var/lib/asf/dotnet-install.sh
chmod +x /var/lib/asf/dotnet-install.sh
/var/lib/asf/dotnet-install.sh --channel LTS

echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools' >> ~/.bashrc
source ~/.bashrc # 激活生效

# 最后确认以 asf 系统用户是否能够启动完成, 之后就可以退出当前账户
dotnet --version # 确保激活环境配置

# 完成之后就能退出当前系统用户, 目前系统的配置已经准备完成
exit

# 在此之前可以测试下以 asf 系统用户运行, 没问题就中断该进程
sudo -u asf /var/lib/asf/bin/ArchiSteamFarm --no-restart --service --system-required


# 创建系统单元
sudo touch /etc/systemd/system/archi-steam-farm.service

之后就是准备编写系统测试单元了, 其实 /var/lib/asf/bin 目录下有个 ArchiSteamFarm@.service 就是官方提供的多用户系统单元;
但是这个针对多用户的 systemd 模板其实没什么必要, 一般只需要单独系统用户即可, 具体 archi-steam-farm.service 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[Unit]
Description=ArchiSteamFarm Service
Documentation=https://github.com/JustArchiNET/ArchiSteamFarm/wiki
After=network.target

[Service]
Type=simple
User=asf
Group=asf
WorkingDirectory=/var/lib/asf
ExecStart=/var/lib/asf/bin/ArchiSteamFarm --no-restart --service --system-required
Restart=on-success
RestartSec=1s

# 限制资源
LimitNOFILE=65536
PrivateTmp=true
CapabilityBoundingSet=
DevicePolicy=closed
LockPersonality=yes
NoNewPrivileges=yes
PrivateDevices=yes
PrivateIPC=yes
PrivateMounts=yes
PrivateUsers=yes
ProcSubset=pid
ProtectClock=yes
ProtectControlGroups=yes
ProtectHome=read-only
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectProc=invisible
ProtectSystem=strict
RemoveIPC=yes
RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
RestrictNamespaces=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
SecureBits=noroot-locked
SystemCallArchitectures=native
UMask=0077

[Install]
WantedBy=multi-user.target

最后更新系统单元并且启动服务单元:

1
2
3
4
5
sudo systemctl daemon-reload # 更新服务
sudo systemctl start archi-steam-farm.service # 启动服务
sudo systemctl status archi-steam-farm.service # 查看状态
sudo systemctl enable archi-steam-farm.service # 开机自动启动
# 后续访问 http://localhost:1242 就能进挂卡界面, 在这个界面也能手动配置新建机器人

不得不说这个 WebGUI 基本上都把该说明的配置都提供了, 所以只需要参照官方文档来配置即可.

现在的 ArchiSteamFarm 就是运行在 asf 系统最低权限下的进程, 并且拥有独立 dotnet 执行库不会对全局系统产生过多影响.

剩下的就是其他细碎的配置, 比如 WebGUI 访问最好是中间加个 NGINX 代理转发来过滤和监控非法IP(如果强行要暴露公网).

风险再次提醒: 本教程仅为技术交流, Steam 挂卡属于违规行为, 所有账号损失与技术风险均由使用者自行承担