
状态隐藏
强制执行Minecraft网络隐私,正如它本该一直如此
状态隐藏器
一款面向 Minecraft 服务器的网络安全模组,旨在阻挡服务端爬虫,阻止其获取在线玩家数据、MotD 等信息,同时为您提供一些实用功能。
为什么
作为一名服主,我经常看到连接尝试的日志,或未捕获的网络错误(例如重复出现的连接被对端重置消息),即使批量 IP 封禁也无济于事。
但当我看到一条疑似来自'ServerSeekerV2'用户的连接尝试日志时,终于忍无可忍并决定采取行动。该日志显然关联到 ServerSeekerV2 软件,这彻底向我证明:世界上确实有人闲到用软件扫描 Minecraft 服务器以获取在线状态、在线时间、特定时段的玩家信息,并存储和交叉比对生成的数据,可能用于恶意构建玩家档案。
因此我决定深入研究整个服务器 Ping 和登录网络协议,制作了这个模组,为服主和玩家提供更多隐私保护。
让我安静地获取数据
不。请尊重他人的隐私。
工作原理
文件
模组会存储一些连接尝试和已知玩家的信息。因此服务器主目录下会创建三个额外文件:
player_ip_cache:存储至少正常加入过服务器一次的玩家信息。每行代表一个条目,包含玩家名、UUID 和该玩家已知 IP 的哈希列表。模组通过此文件判断传入连接是否来自已知玩家,并决定大部分行为。您可以按需删除或修改条目,但如果某行无法正确解析为有效条目,模组会在服务器控制台报错。request_metrics:存储模组对来自各 IP 地址的连接尝试、Ping 请求等操作的记忆。每行(条目)包含 IP 哈希、该 IP 的 Ping 尝试次数、登录尝试次数,以及该 IP 被禁后的总请求数(如果已被封禁)。此文件对自动 IP 封禁功能特别有用。ip_whitelist:存储正则表达式列表,白名单内的 IP 无需玩家注册即可 Ping 服务器。这主要针对服务器面板(通常由第三方托管服务提供),这些面板会定期 Ping 服务器以便为服主提供分析数据。注意:这不会影响玩家加入服务器的能力,他们无需被白名单!ip_limit_list:格式与ip_whitelist相同。仅在启用对应游戏规则时生效。用于定义非本地来源必须匹配才能建立连接的模式集合。
为什么要用 IP 哈希
模组尽可能使用 IP 哈希,不仅是为了减少处理的数据量,也是为了降低潜在第三方获取服务器文件时可能泄露的信息。虽然服务器本身可能将 IP 记录在日志中,但至少在服务器被攻破时,直接暴露最少的玩家信息仍是更好的选择。由于哈希能从相同初始值产生一致且不可逆的结果,因此能在一定程度上混淆数据以防范恶意因素。
游戏规则
模组添加了以下自定义游戏规则,用于控制各项功能:
status_hider:reduced_ping_data:设置对哪些来源隐藏 Ping 数据细节(如隐藏在线玩家列表、提供虚假最大在线/最大玩家数、隐藏 MotD)。默认设置为对未知或封禁 IP 隐藏。status_hider:restrict_ping:是否切断来自未知 IP(未关联任何已加入服务器的玩家)的 Ping 请求。默认启用。status_hider:log_restricted_requests:是否记录模组拦截 Ping 请求的行为。status_hider:enable_fancy_motd:启用花式 MotD 功能。默认启用。status_hider:enforce_ip_ban:启用真实 IP 封禁功能。默认启用。status_hider:auto_ban_unknown_ip_after_requests:设置未知 IP 在自动被封禁前可发起多少次请求;设为 0 可禁用此功能。接受 0-100 之间的值,默认设为 10。status_hider:log_banned_ip_requests:设置多久记录一次被封禁 IP 的请求。具体值表示每多少次请求记录一次(使用取模运算);1 表示每次都记录,20 表示每 20 次记录一次;设为 0 禁用。接受 0-100 之间的值,默认设为 10。status_hider:limit_allowed_ip:是否将连接限制为仅允许匹配 IP 白名单模式的来源(默认为false)
真实 IP 封禁
在原生代码中,IP 封禁仅在玩家登录序列的后期才被检查,且完全忽略 Ping 请求。总体而言,这是一个相当薄弱的机制。
因此,本模组将其提升到全新高度:来自被封禁、非白名单(不匹配任何 ip-whitelist 条目)IP 的任何请求,将纯粹不被响应。
这意味着被封禁 IP 发起请求时将始终处于挂起状态,仿佛服务器未运行。此外,每 10 次来自被封禁 IP 的请求,服务器将在控制台提示,以便服主了解 IP 封禁的有效性。
花式 MOTD
既然模组已将玩家与其 IP 地址关联,我认为这也是通过 MotD 创建欢迎玩家花式方式的契机。
因此,服务器 MotD 中的任何{username}都将自动替换为匹配的已知玩家名(如果有)。
此外,基于对 IP 地址全球分配的基本了解,我决定在模组内包含一个按国家分配 IP 范围的文件①,使模组能猜测并替换 MotD 中的{country}为可能的国家名,或unknown(如果未找到匹配)。
ip ranges 文件
该文件虽然精简但体积较大,占据了模组 jar 文件的大部分空间。
采用内置文件是为了避免使用第三方 API,这违背了本模组的两个目标:
- 不向第三方提供超出必要的数据。使用第三方 API 意味着允许对方了解哪些 IP 正在加入服务器,从而间接暴露玩家 IP。
- 不处理或暴露超出必要的数据。大多数 IP 地理位置的第三方 API 远超本模组需求,会获取其他潜在恶意模组可能截获的数据。虽然其他模组本身也能获取这些信息,但不再进一步暴露始终是良好实践。
该文件基于 ayra.ch 免费提供的数据,经过简化处理(删除无用值、优化国家名可读性)生成。
命令
本模组添加了自定义命令,提供比手动编辑文件更实用的替代方案,同时支持运行时重新加载缓存或指标文件。(IP 白名单文件仅在服务器启动时加载,因其性质不需要频繁编辑)。命令权限等级要求为 4(默认原版 OP 等级,可在server.properties文件中修改,各玩家值可在原版ops.json文件中修改)
/status_hider forget <profileOrIP:服主可在运行时从玩家 IP 缓存中移除条目。profileOrIP 可以是 IP 地址或玩家名。匹配的条目将从 IP 缓存中完全删除。
/status_hider registerIP <ip> [<name>]:服主可注册特定 IP 到指定或自动生成的名字。如果 IP 已存在于现有条目,命令将无响应。如果该名字已有条目,则 IP 将被添加进该条目;否则将创建包含该 IP 的新条目(附带随机 UUID)。
/status_hider reload [cache|metrics|whitelist|limit_list]:服主可重新加载 IP 缓存文件、请求指标文件、白名单文件、限制列表文件,或全部重新加载(如果未指定参数)。(注意:根据服务器活动情况,建议在修改文件后尽快执行命令,因为运行时缓存或指标的任何更改都会完整覆盖文件)
/status_hider whitelist <pattern>:服主可向 IP 白名单添加正则表达式条目,无需重启服务器。
/status_hider unwhitelist <pattern>:服主可从 IP 白名单移除正则表达式条目,无需重启服务器。(现有条目将作为模式自动补全建议)
/status_hider test <ip>:服主可查询 IP 的哈希值(该值将存储在缓存或指标文件中)。这对于手动修改玩家条目中的特定 IP 等细微操作特别有用。
① ip ranges 文件
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。