概述
本模组为 Minecraft 增加 WebSocket 支持。
由于大部分 CDN 提供商(例如 Cloudflare,华为云等)并未提供裸 TCP 的支持、DDoS 防护,或者过于昂贵,Minecraft 服务器抵抗 DDoS 攻击很容易难倒各大服主。
本模组通过为服务端和客户端增加 WebSocket 支持,服务器可以隐藏在 CDN 服务器之后,从而有效避免 DDoS 攻击。
运行环境
本 Mod 可以独立运行,支持 Forge、NeoForge 和 Fabric,无需其他依赖。
服务端
当本 Mod 安装在服务器上时:
服务端可以接受玩家通过 WebSocket 接入;
在没有单独禁止的情况下,玩家仍可通过原版 TCP 直接接入;
服务端在原来 TCP 端口上监听 WebSocket 接入请求,受 server.properties 控制;
未安装本 Mod 的客户端仍可通过原版 TCP 加入安装了本 Mod 的服务端(注意:其他安装的 Mod 可能会阻止客户端的加入);
服务器可以在 WebSocket 握手之后获取客户端相关信息(例如通过 X-Forwarded-For 获取客户端真实 IP 等)。
客户端
当本 Mod 安装在客户端上时:
可以使用“ws://域名.com:端口/WebSocket路径”这种格式加入同样安装了本 Mod 的服务器;
客户端仍可使用原版的“域名.com:端口”方式加入原版服务器。
客户端可以灵活指定 WebSocket 连接的 IP 、端口号、 HTTP 请求的 HOST 和 TLS 的 SNI 这些参数,以应对复杂多变的网络环境和优化连接速度。以下是一些示例,端口号在任何情况下都可指定:
普通非安全的WebSocket连接,指定HTTP请求的HOST为host.com,连接到ip.ip.ip.ip(一般是优选过的IP):
ws://host.com@ip.ip.ip.ip
安全的WebSocket连接,HTTP请求的HOST和TLS的SNI均为sni-host.com,连接到ip.ip.ip.ip(一般是优选过的IP):
wss://sni-host.com@ip.ip.ip.ip
安全的WebSocket连接,分别指定HOST和SNI,使用HOST来解析IP:
wss://sni.com:@host.com[:port]
安全的WebSocket连接,分别指定HOST和SNI,使用SNI来解析IP:
wss://:host.com@sni.com[:port]
分别设置HOST、SNI和IP
wss://sni.com:host.com@ip.ip.ip.ip
注意事项
本 Mod 不增加任何游戏内容;
本 Mod 不修改任何 GUI;
本 Mod 与其他 TCP-WebSocket 转换程序兼容,例如 websocat。
在服务端,本 Mod 不会终结TLS连接,因此需要前置一个 NGINX 之类的来把 HTTPS 转为 HTTP 发送给安装了本模组的服务端。
大部分 CDN(例如 Cloudflare),要求SNI与HOST一致,并且端口限定80/443,否则拒绝连接。因此 wss://sni-host.com@ip.ip.ip.ip 是最常用的客户端连接方式。
配置
本 Mod 的服务端通过 Java 的系统属性(System Properties)进行配置,客户端没有配置。可使用 JVM 命令行的 -D 进行参数传递:
wsmc.disableVanillaTCP:默认 false。设为 true 以禁用原版 TCP 登入;
wsmc.wsmcEndpoint:默认未设置,此时客户端可以使用任意 WebSocket 路径加入服务器。设置该选项将只允许客户端使用指定的 WebSocket 路径加入服务器,大小写敏感;
wsmc.debug:默认 false。是否显示调试信息;
wsmc.dumpBytes:默认 false。是否显示 WebSocket 每一帧。需要“-Dwsmc.debug=true”。
wsmc.maxFramePayloadLength:默认65536,一般不用动,如果Netty报“Max frame length of x has been exceeded”这个错误时可以适当增加帧大小。
API
对于 Mod 开发者,在服务端,可以将“net.minecraft.network.Connection”实例强制类型转换为 IConnectionEx,然后调用其 getWsHandshakeRequest() 获取 WebSocket 握手的详细信息。
例如 X-Forwarded-For 和 CF-IPCountry,分别可获得客户端真实 IP 与地区/国家代码。