WSMC

WSMC

为Minecraft Java版启用Websocket支持。

杂项

WSMC

为 Minecraft Java 版启用 WebSocket 支持。由于大多数 CDN 提供商(至少在其免费套餐中)不支持原始 TCP 代理,借助此模组,服务器所有者现在可以将服务器隐藏在 CDN 之后,并让玩家通过 WebSocket 连接,从而防止 DDoS 攻击。

适用于 Minecraft 1.20.1 至 1.20.4 版本,支持 Forge 和 Fabric。

如果您想在当前不支持的 Minecraft 版本上运行此模组,请在 GitHub 上提交 issue 或在此处留言。

此模组独立运行,没有任何依赖项。

当此模组安装在服务器端时:

  • 服务器将允许玩家通过 WebSocket 连接。
  • 玩家仍然可以使用原版 TCP 加入。
  • 服务器在同一监听端口上接受和处理 TCP 与 WebSocket 连接。
  • 即使玩家未在客户端安装此模组,仍可使用原版 TCP 加入安装了此模组的服务器。
  • 服务器可以从 WebSocket 握手中获取客户端统计信息(如真实 IP)。

当此模组安装在客户端时:

  • 客户端可以使用类似 ws://hostname.com:port/path_to_minecraft_endpoint 的 URI 加入支持 WebSocket 的服务器。
  • 客户端可以使用旧语法(如 hostname_or_ip:port)通过原版 TCP 加入任何服务器。

注意事项

  • 此模组不会影响任何游戏玩法。
  • 此模组不会修改任何图形界面。
  • 即使您安装此模组,原版客户端仍可加入您的服务器,但请注意您安装的其他模组可能会阻止原版客户端加入。
  • 在客户端安装此模组不会阻止您加入其他原版或模组服务器。
  • 服务器仍然可以获取通过 CDN 代理的 WebSocket 加入的玩家的真实 IP。
  • 此模组与其他 TCP-WebSocket 代理兼容,例如 websocat。

客户端选项

有时 DNS 会为 HTTP 主机名(ws)或 SNI(wss)返回较慢的 IP 地址。客户端可能希望控制 IP 地址的解析方式。

客户端可以选择性地控制 WebSocket 握手期间使用的 HTTP 主机名和 SNI:

指定 HTTP 主机名的非安全 WebSocket 连接:
ws://host.com@ip.ip.ip.ip

将 SNI 和 HTTP 主机名设置为相同值(sni-host.com),从 ip.ip.ip.ip 解析服务器 IP:
wss://sni-host.com@ip.ip.ip.ip

分别设置 SNI 和 HTTP 主机名,从 host.com 解析服务器 IP:
wss://sni.com:@host.com[:port]

分别设置 SNI 和 HTTP 主机名,从 sni.com 解析服务器 IP:
wss://:host.com@sni.com[:port]

分别设置 SNI、HTTP 主机名和服务器地址:
wss://sni.com:host.com@ip.ip.ip.ip

端口和路径规格可以同时附加。

配置

此模组的配置通过"系统属性"传递。您可以在 JVM 命令行中使用 -D 来传递这些选项。

属性键 类型 用途 作用端 默认值 示例
wsmc.disableVanillaTCP 布尔值 禁用原版 TCP 登录和服务器状态。 服务器端 false true
wsmc.wsmcEndpoint 字符串 设置 Minecraft 登录和服务器状态的 WebSocket 端点。如果此属性不存在,客户端可以通过任何 WebSocket 端点加入游戏。必须以 / 开头,区分大小写。 服务器端 未设置 /mc
wsmc.debug 布尔值 显示调试日志。 服务器端、客户端 false true
wsmc.dumpBytes 布尔值 转储原始 WebSocket 二进制帧。仅在 wsmc.debug 设置为 true 时生效。 服务器端、客户端 false true
wsmc.maxFramePayloadLength 字符串 允许的最大帧负载长度。将此值设置为您整合包的需求值,否则 Netty 会抛出错误"Max frame length of x has been exceeded"。 服务器端、客户端 65536 65536

面向开发者

在服务器端,如果客户端通过 WebSocket 加入,其握手请求可以通过原版的 net.minecraft.network.Connection 类访问。要获取此类信息,请将 Connection 实例强制转换为 IConnectionEx,然后调用 IConnectionEx.getWsHandshakeRequest()。

当 Minecraft 服务器位于反向代理(如 CDN)之后时,这对于获取原始请求信息非常有用。例如,X-Forwarded-For 和 CF-IPCountry 标头分别表示客户端 IP 地址和客户端所在国家/地区代码。