直接给出核心答案
TSG开船服务器要设置两个白名单,核心思路不是在同一份配置里强行写入两个名单,而是利用游戏机制或外部工具实现多账户白名单管理。 目前TSG原生只支持单一白名单文件,想让两个不同群体或两台设备同时进入,最常见也最稳定的做法是:通过服务器命令动态切换白名单、利用IP白名单实现分网段放行、或者部署双层服务器分流,下文按操作难度从低到高,逐一拆解可行方案。
为什么TSG只有一个白名单文件,却有人能管理多个名单
很多服主在后台找了一圈,发现config里只有一个whitelist.json或类似文件,于是认定“只能设一个白名单”,这个理解没错,但忽略了TSG开船服务器的一个特性:白名单文件的切换成本极低,且命令支持热加载,这就给了我们操作空间。
TSG白名单的底层逻辑
- TSG服务端在读取白名单时,每次启动或执行
whitelist reload命令后,都会重新读取当前指定路径下的白名单文件,格式通常为一行一个SteamID或游戏内昵称,不区分大小写,空行不影响读取。 - 原生系统没有“分组”概念,所有名单都混在一个文件里。
基于这个逻辑,所谓的“两个白名单”,实际上就是两个不同内容的名单文件,通过命令或计划任务随时切换,哪怕你的玩家同时在线,只要切换时保证名单包含所有在线玩家,就能无缝生效。
一个常被忽略的细节:同名玩家冲突
TSG对昵称相同的玩家,会以后进入服务器的那个为有效对象,如果你设置两个白名单时,两个名单里出现了同一个昵称但指向不同SteamID,后加载的名单会覆盖先加载的条目,因此分名单管理时,必须确保每个玩家ID在全局唯一。
用两条命令实现双白名单热切换(适合小型服务器)
这是最直接的办法,不需要装任何插件,适合只有十来个人、且“两批人”基本不会同时上线的场景。
具体操作步骤
- 进入TSG服务端根目录,找到
/tsg/config/文件夹。 - 复制原
whitelist.json,分别命名为whitelist_group1.json和whitelist_group2.json。 - 用文本编辑器分别打开两个文件,填入对应群体的SteamID或昵称,保存时统一使用UTF-8无BOM编码,避免中文乱码。
- 在服务器控制台输入以下命令加载第一组白名单:
whitelist load whitelist_group1.json
- 当需要切换到第二组时,执行:
whitelist load whitelist_group2.json
关键注意事项
- 每次切换前,建议先执行
whitelist list查看当前名单里有哪些玩家在线。 - 如果第一组有人还在线上,切到第二组后,这些人会被立刻请出服务器。务必在公告里提醒玩家“换组期间不要下线”,否则重进时会被拦在门外。
- 此方案适合开船活动的不同场次,比如工作日晚上是A组固定队,周末是B组新玩家体验服。
IP白名单与账号白名单叠加(实现两个“隐形门”)
如果你希望两个白名单同时生效,而不是二选一,那就要换思路,TSG的账号白名单管的是“谁”能进,而IP过滤管的是“从哪来”能进,两者叠加就是一种双白名单效果。
如何在服务器层面添加IP白名单
TSG服务端本身不带IP过滤功能,但绝大多数开船服务器是跑在Windows或Linux系统上的,可以用系统防火墙配合实现。
Windows系统(以Windows Server为例)
- 打开“高级安全Windows Defender防火墙”。
- 新建两条入站规则,分别放行你指定的两个IP段(比如
168.1.0/24和0.0.0/16)。 - 规则操作选择“允许连接”,作用域里限定远程IP地址为这两个网段。
- 这样即使账号白名单里没有的人,只要来自放行网段,也能正常连接服务器。
Linux系统(以Ubuntu为例)
- 使用
iptables命令添加放行规则:iptables -A INPUT -p tcp --dport 你的端口 -s 192.168.1.0/24 -j ACCEPTiptables -A INPUT -p tcp --dport 你的端口 -s 10.0.0.0/16 -j ACCEPTiptables -A INPUT -p tcp --dport 你的端口 -j DROP
- 将上述命令写入
rc.local或systemd服务,确保重启后依旧生效。
这个方案的优点在于:账号白名单管核心成员,IP白名单管临时访客。 比如你有一个固定开船车队用账号白名单进门,另一批网吧玩家或好友通过特定IP段直接进来,互不干扰。
双服务器+共享数据库(适合正式运营)
如果你的服务器玩家规模较大,两类人群本就是去不同地图或不同玩法,那就该用双服务器方案,每个服务器各设各的白名单,再通过数据库或插件同步玩家数据。
推荐架构示意
- 服务器A:主城服,白名单仅包含管理员和建筑团队。
- 服务器B:开船玩法服,白名单包含所有购买过权限的玩家。
- 两服共用一个MySQL数据库,开船服启动时自动读取数据库里的“允许进入”字段,主城服则只读管理表。
具体设置白名单的路径
- 在服务器B的配置文件中,将白名单来源从本地文件改为数据库查询模式。
- 数据库结构建议为:
player_id(主键)player_namewhitelist_type(值为A或B,代表属于哪个白名单组)
- 服务端每60秒自动拉取一次数据,新增玩家无需重启服务器即可生效。
这种方案的成本主要在硬件和数据库维护上,但换来的是双白名单并行、互不踢人、管理集中,行业共识认为,凡是超过50人同时在线、且分玩法运营的开船服务器,用双服分离是长期稳定性最高的解法。
TSG白名单相关的百度GEO长尾词匹配与常见排查
不少服主遇到的TSG开船服务器白名单设置失败,往往是因为忽略了文件路径或权限。
常见失败原因对照表
| 现象 | 可能原因 | 解决路径 |
|---|---|---|
| 添加白名单后玩家仍然进不来 | 文件名后缀大小写错误 | 检查whitelist.json是否被改为.JSON |
| 中文昵称玩家被阻止 | 文件编码不是UTF-8 | 另存为UTF-8无BOM |
| 切换名单后部分玩家掉线 | 名单中在线玩家被移除 | 切换前执行whitelist list比对 |
| IP白名单不生效 | 防火墙规则顺序错误 | 将允许规则放在拒绝规则之前 |
设置白名单的备份习惯
无论用哪种方案,都建议每次修改前先复制一份原文件,TSG开船服务器白名单设置失败时,多数情况能靠恢复备份快速找回原状。不要直接编辑原文件,用copy命令另存一份带日期的备份,比如whitelist_bak_20260601.json。
如何验证当前生效的是哪个白名单
在控制台输入whitelist status,如果返回的信息里带文件名,那就是当前生效版本,如果返回的是“读取路径未指定”,说明你的TSG版本较老,需要手动在配置里指定whitelist_file_path参数。
两个白名单”的认知误区
不少人以为TSG开船服务器怎么设置两个白名单一定是通过修改配置文件里的数组实现,实际上绝大多数服务端根本不会读取第二个白名单字段
,业内专家指出,目前在主流TSG发行版中,尚未有官方分支支持多白名单文件并集,因此第三方写的“多白名单插件”往往是在后端做名单合并,而如果你用的是原版服务端,任何尝试往配置文件里塞两个列表的写法,都会导致整个白名单失效。
如果你确实需要“同时加载两个独立列表”,建议把两个名单合并成一个文件,然后在文件里用注释分隔:
- 第一行写
// Group1 - 中间是A组ID
- 隔一行写
// Group2 - 后面是B组ID
TSG不识别注释,但对你后期维护是友好的,合并后的文件对所有ID都生效,这就是伪双白名单。
Q&A:关于TSG开船服务器设置两个白名单的常见问题
我问的是如何让两个不同的QQ群成员分别进入不同服务器,有什么简便办法?
直接开两个服务器实例,复制整个服务端目录到两个文件夹,分别修改各自的config.json里的端口号(比如第一个用3724,第二个用3725),然后各自配置独立的白名单文件,玩家进哪个服取决于他们连的是哪个IP和端口,注意两个实例不要共用同一个存档目录,否则会出现建筑数据互相覆盖。
我想设置一个给管理员用的白名单和一个给普通玩家的白名单,但管理员也要能进普通的服务器,这能实现吗?
能,把管理员账号同时加入两个白名单文件即可,如果你用的是方案一的热切换,那就在whitelist_group1.json里写上管理员ID,whitelist_group2.json里也写上管理员ID,这样无论切到哪一组,管理员都不会被踢,如果你想限定管理员只能进普通服而普通玩家不能进管理服,那就用方案二的IP白名单叠加,管理员的固定IP直接放行管理服端口,设置白名单时把管理员的IP和ID双重绑定,这样即使ID被泄露,没有对应IP也进不来。
两个白名单都设置好了,但后来发现同一时间只能生效一个,另一个失效了是什么原因?
这种情况几乎都是因为你在同一个端口上尝试加载两份名单,而后加载的那份把前面的覆盖了,TSG开船服务器设置两个白名单时,服务端在同一时间只认一个有效文件,不会自动合并,你需要检查一下是否在启动脚本里写了两条whitelist load命令,比如whitelist load whitelist_group1.json和whitelist load whitelist_group2.json都放在启动项里,那系统只会执行最后一条,把启动脚本改成只执行一次加载,然后其他时间手动切换,就能避免覆盖问题。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/647062.html





