联合大厅是高校联盟的一项技术性工作,通过接入联合大厅,各高校可以在保留原有的接入方式的情况下,通过联合大厅直接访问其他高校服务器,无需手动查找服务器地址。
最初MUA在2021年6月尝试开发联合大厅,旨在将各个高校的服务器通过同一个群组服代理连接起来,从而使各个高校的玩家可以在各个成员学校服务器直接自由进出,方便各个高校玩家之间交流。由于最初的技术方案维护成本较高、接入方式较复杂,在完成初步测试后,最终放弃进行更大规模的推广应用。
2023年1月底,在基于高校联盟联合验证机制已基本成熟、投入推广使用的背景下,联合大厅建设计划重新启动,并在经过讨论后得到了一个更简单、更易维护的实施方案。各高校可以在保留原有的接入方式的情况下,通过接入联合大厅,使得其他高校的同学能够通过联合大厅访问高校服务器,无需一个个查找服务器地址。
另一方面,服务器可以直接接入联合大厅而不需要拥有公网IP,也无需端口映射。联合大厅支持多个接入点,玩家可以选择延迟最低的接入点接入服务器。在后面的描述中,ENTRY指接入点,PROXY指后端服务器。
如果你只希望得知如何接入联合大厅,请直接阅读如何接入联合大厅一节。
要想进入联合大厅,你需要先拥有联合认证皮肤站账号,即 MUA 皮肤站或接入 Union 系统的十余所高校皮肤站账号。
在启动器使用上述皮肤站账号登录后,使用主流 Minecraft Java 版本访问如下服务器地址,即可进入联合大厅,并通过 /hub 标签名 命令进入各高校服务器游玩:
标签名 | 所属高校 | 二层代理 |
---|---|---|
lobby | MUA | |
BITNP-MC | 北京理工大学 | |
CSU-MC | 中南大学 | ✔ |
DUT | 大连理工大学 | |
FDC | 复旦大学 | ✔ |
FZU | 福州大学 | |
GXUCraft | 广西大学 | |
HQU | 华侨大学 | |
IMUcraft | 内蒙古大学 | ✔ |
LNUMC | 辽宁大学 | ✔ |
NPUcraft | 西北工业大学 | ✔ |
NWAFU | 西北农林科技大学 | |
NWU | 西北大学 | |
NWUsur | 西北大学 | |
NuistCraft | 南京信息工程大学 | ✔ |
SDUST | 山东科技大学 | |
SEU | 东南大学 | ✔ |
SITMC | 上海应用技术大学 | ✔ |
SJMC | 上海交通大学 | ✔ |
SUESMC | 上海工程技术大学 | ✔ |
SWUSTMC | 西南科技大学 | |
TJUarch | 同济大学 | |
TJUsurv | 同济大学 | ✔ |
TaruCraft | 塔里木大学 | ✔ |
UAS | MUA联合服 | ✔ |
XAUAT | 西安建筑科技大学 | |
XDMC | 西安电子科技大学 | ✔ |
XJTUMC_Survival | 西安交通大学 | |
YSUMC | 燕山大学 | ✔ |
你可以在你的高校服务器上使用 /hub 指令进行测试,这是联合大厅的切换服务器指令,如果存在此命令则服务器已接入联合大厅。
部分使用自定义域名解析联合大厅的服务器地址:见联合大厅服务器列表。
联系人:@JianMoOvO (随叫随到,只会摸鱼)或 @ART1st(不定时出没,技术过硬)
无论使用何种方式接入,首先需要下载 frp 客户端,它将帮助你接入联合大厅所在的虚拟局域网络中。无论你是否开启了游戏服务器,你都将是虚拟局域网络中的一份子。
将 frp Releases 页中下载的文件解压后,需要用到 frpc(Windows为frpc.exe) 与 frpc.ini 文件。
更新:现已支持自动下载frp
Frp Daemon是一个FRPC自动配置守护程序,定时从服务器获取最新的配置文件并管理FRPC进程。
这个程序设计上和MUA Union API、MUA联合大厅一同使用,以便MUA服务器网络能够添加更多的入口节点。该工具可以自动同步接入点服务器。
Add python.exe to PATH
选项,将其添加至环境变量中以方便调用pip install -r requirements.txt
config.py
FRPC_CONFIG_PLACEHOLDERS
配置项。metas
:是可选配置项,对应以 metadatas
开头的一组配置项。可以在开头加 #
或设置为空字符串以禁用这项配置。servers
:服务器配置项。以 [your_server_name]
开头的一系列配置。可以有不止一组。# frpc二进制文件名(Windows为frpc.exe,Linux为frpc)
#FRPC_BIN = "frpc.exe" 此项在更新后已不再需要
# frpc所在目录
# 你可以在Frp Faemon主文件夹中创建frpc文件夹,将frpc(Linux)或frpc.exe(Windows)放到frpc目录下
# 或者使用绝对路径指向frp所在文件夹
FRPC_DIR = "frpc"
# 此项请勿更改
FRPC_SYNC_SCHEDULE = schedule.every().hour
# API地址(默认使用MUA即可)
FRPC_UNION_API_NETWORK = "https://skin.mualliance.ltd/api/union/network"
# 填写皮肤站 插件配置 > Yggdrasil API 配置 > Union API配置 > Union Member Key 处获取到的值。
# 如果你没有自行部署皮肤站,可以联系管理员获取一个KEY。
FRPC_UNION_MEMBER_KEY = ""
# 填写在frpc config中需要替换的部分,字典的键是要替换占位符
# 目前只需替换metas和servers
FRPC_CONFIG_PLACEHOLDERS = {
"metas" : '''
# (可选)通过添加以下两条配置,在连接联合网络时,热更新联合代理端的 forced_hosts
# 简而言之,如果你将自己的域名解析至接入点地址,
# 则可以通过添加这两条配置,改变通过该域名加入联合大厅时进入的第一个服务器
# 如果你不添加该选项,通过你自己的域名加入服务器将会进入lobby
# 例如此处,通过test1.example.com进入联合大厅将会进入server1
# server1即下方配置中服务器在联合大厅的标签名
metadatas.domain = "test1.example.com"
metadatas.forced_hosts = "[\\"server1\\"]"
# (可选)如果你有多个域名,可以使用以下配置将它们设置为 meta_domain 的别名
# 这些域名将添加与 meta_domain 一样的 forced_hosts 列表
# 如果你使用 SRV 解析至联合大厅,这个配置将使得 PING 穿透成功工作
meta_domain_alias = "[\\"test2.example.com\\", \\"test3.example.com\\"]"
''',
"servers" : '''
[[proxies]]
# 显示在联合大厅中的标签名,切换服务器时使用“/hub <标签名>”
name = "server1"
# 使用的协议(TCP/KCP/QUIC)只能由接入点提供者指定
type = "tcp"
# 本地游戏服务器地址
localIp = "127.0.0.1"
# 本地游戏服务器端口,外部无法访问;或者填 Velocity/Bungeecord 代理端口
localPort = 25565
# 随意填写一个端口号,未与其他接入的服务器重复即可(重复时 frpc 将提示)
# 接入点可能具有端口范围限制,这也将在连接时通过 frpc 的错误信息告知你
remotePort = 25565
# 如果您有多个子服需要被代理,参照相同格式进行配置即可
[[proxies]]
name = "server2"
type = "tcp"
localIp = "127.0.0.1"
localPort = 25565
remotePort = 25565
'''
}
# 是否开启调试输出
DEBUG_ENABLED = False
MUAFrpDaemon附带了一些扩展:
autoupdate_frpc.py
和download_github_release.py
。minecraft.py
MINECRAFT_PROXY_DIR = “server”
:服务器目录START_COMMAND = "bash start.sh"
:启动命令TRUSTED_ENTRIES_FILE = "plugins/ProxiedProxy/TrustedEntries.json"
autoupdate_velocity.py
或autoupdate_bungeecord.py
。需要minecraft.py
也被启用。autoupdate_plugins.py
和download_github_release.py
。https://www.spigotmc.org/resources/viaversion.19254/
,其resource id为19254。(<resource id>, <jar名称>)
(<repo>, <jar名称>, [可选,release file的正则表达式])
此时您已经完成了Frp Deamon的配置工作,使用python3 daemon.py
(Windows为python daemon.py
)启动守护进程,无论您是否启动游戏服务器,此时您都已经接入了虚拟局域网,你可以通过联合大厅登录游戏,使用 /hub 指令看到你所添加的服务器标签名。
当 frpc 程序退出时,你的服务器也将自动从联合大厅中移除。如果遇到错误,请查看 frpc 的错误信息,也许只是端口或标签名已使用这样的简单问题。如果确实遇到无法解决的问题,请先查看Q&A,如果仍然无法解决,请向MUA的技术人员寻求帮助。
按照下图示例在 frpc.ini 中填写你的端口信息,然后在控制台中使用 ./frpc -c frpc.ini 指令运行即可。
(Windows是frpc.exe -c frpc.ini 命令,需要使用批处理或者终端运行,直接点击exe会提示无法运行)
值得一提的是,如果你希望以二层代理的方式接入联合大厅,则 local_port 中应当填写你的 Velocity / Bungeecord 所监听的端口,否则是你的 Minecraft 服务器端口。
需要注意的是,一个 frpc 只能接入一个接入点,你需要配置多个不同的frpc以接入所有的接入点
配置完毕后,启动即可,此时你已经接入了虚拟局域网,你可以通过联合大厅登录游戏,使用 /hub 指令看到你所添加的服务器标签名。
[common]
# 上交接入点
server_addr = mc.sjtu.cn
# tcp 端口 22901,kcp 端口 22902,quic 端口 22903
server_port = 22901
token = 见MUA理事会群2023年2月18日的公告
# 其他接入点,请复制一份frpc至其他文件夹进行配置
# 以下内容请参考自动接入章节
meta_domain = test1.example.com
meta_forced_hosts = ["server1"]
meta_domain_alias = ["test2.example.com", "test3.example.com"]
[server1]
type = tcp
# 启用传输数据加密,可选
use_encryption = true
# 启用传输数据压缩,可选
use_compression = true
local_ip = 127.0.0.1
local_port = 25565
remote_port = 10188
[server2]
type = tcp
use_encryption = true
use_compression = true
local_ip = 127.0.0.1
local_port = 25566
remote_port = 10123
# 另一个服务器
通过联合大厅加入游戏的客户端版本各不相同,推荐为接入的游戏服务器安装 ViaVersion 与 ViaBackwards 插件/模组。
需要注意的是,如果通过这种方式将服务器接入大厅,原先的地址将不再安全甚至无法使用(由于需要关闭Online-mode
,未经验证的账户可以进入服务器)。请阅读如何通过 SRV 解析指定默认登录大厅一节,将原先的域名解析至联合大厅。
BungeeCord
一项设置为true
联合大厅不支持 Forge 服务端接入,存在技术障碍。
如果你的服务器使用 Velocity 的 modern 转发,或者使用 BungeeCord 进行代理,希望在不修改配置的条件下将整个游戏服务器网络接入联合大厅,则可以以损失部分游戏延迟为代价,将 Velocity / BungeeCord 直接接入联合大厅,形成二层代理。
从理论上来说,即使你的 Velocity 使用 legacy 转发,也可以使用相同的方式接入联合大厅,但在这种情况下,我们更推荐直接接入子服,获得更好的游戏延迟。
首先请安装 authlib-injector 1.2.1 及以上版本,并使用Union 联合验证地址。
无论您使用Frp Daemon自动接入还是手动接入,您都需要先下载 ProxiedProxy 插件,将其放入代理端的 plugins 文件中,重新启动代理端。
更正:Frp Daemon现已支持自动下载和更新ProxiedProxy插件,但仍需要进行手动配置。
配置文件生成后,关闭代理端。重命名/plugins/ProxiedProxy/config-template-proxy.toml
为config.toml
,并且按照如下注释按需修改。
# 服务器角色可用选项:
# - PROXY: 接受来自上游ENTRY服务器的连接(作为二级代理应该选择此项)
# - ENTRY: 将客户端连接代理到PROXY服务器或Minecraft服务器
role = "PROXY"
# 此选项控制是否开启调试输出
verbose = false
[proxy]
# 允许客户端直接连接(建议关闭)
allow-client-connection = false
重新启动代理端并关闭,此时/plugins/ProxiedProxy/
路径下应生成 TrustedEntries.json 文件,将其内容替换为下列文本
[{"id":"SJMC","publicKey":"-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEArXdtfcFZEJdWHuNMQ/JD\nLUh0LHQh2cE16YR85w41N8+oq9AR4+HxnuOlHFR7P2ueKAicv4ACaoHQZ0UM6Wpq\nvT70X5OoHNkXdlg+lAta0o5GCO4UrxM5K014rA4A8behabQNpHuYTtiKWiNlS8LK\n9QEeU0Ewr3bxdBzcpNdLNsFfx2fh74HRAWvciOzOdS1prKn+hAx5WpwGimzqVy5A\n2okTacmwFNMWvHuc2BPS3x+Gd3EVjN2+DuSgd2eErP+KHR3k/F96gyN+Y1X3hDbu\nqHwtWiL5Uw/h3BqHWwbDOtk1OKVmIQG47qm++mOPyGOUfeZi4ZBm051fCbfWBWIO\niLVvFfcNyuPgIgt0iuMlSOentJ/ROpKfr7Qmr0SPrDYV4S0COPxj07OHRnvRbefG\noArw77d1wDGfI8J+GPQj1kqZWQnRfcM1v5q0byCmXKWVSwy00lQ79nw5lbBB2OsL\nUZ8Ro3POKaUfFEBrN8eilt/ON7LJLoP7yioo6WYRLMeBAgMBAAE\u003d\n-----END PUBLIC KEY-----\n"}]
config.py
START_COMMAND
修改为你的启动命令。TRUSTED_ENTRIES_FILE
都以 MINECRAFT_DIR
作为工作目录,如果您的文件夹命名为bungeecord,MINECRAFT_DIR
也应相应指向bungeecord文件夹配置完毕后,运行daemon.py,守护进程将为您启动代理端和frpc并接入联合大厅,你可以通过联合大厅登录游戏,使用 /hub 指令看到你所添加的服务器标签名,并且切换至你的服务器。
参考手动接入章节,配置多个frpc接入所有接入点,将local_port
改为代理端端口,然后启动frpc和代理端,此时你已经接入了虚拟局域网,你可以通过联合大厅登录游戏,使用 /hub 指令看到你所添加的服务器标签名,并且切换至你的服务器。
建议使用 CNAME/SRV 记录 + forced_host 方案,把域名解析到连接服务器延迟最小的接入点。
联合大厅在逻辑上为一个新的游戏服务器网络,即类似于虚拟私有局域网(VPN)。但在组网方式上,我们选择了使用 frp 而非 WireGuard 等 VPN 技术,这是基于简便性考虑。处于网络中央的 frps 与对外提供游戏入口的 Velocity 代理端位于一个隔离子网中,具体实现上,他们处于同一台主机的同一 Docker 用户桥接网络。通过这样的映射关系,整个逻辑网络形成了星型结构,对外仅暴露 frps 与 Velocity 的连接端口,从而保护接入子服的网络安全。
Velocity 不会通过外部网络与代理服务器进行连接,而始终只会与本地网络上的 frps 进行通信。每当一个新的端口映射加入 frps 或从 frps 中移除后,将触发 Velocity 热更新自身的代理服务器列表,同步添加或移除其代理服务器地址。这一过程通过 Velocity 插件进行实现,并利用了 frp 服务端的扩展机制。
在网络中可以引入多个接入点。Union API 提供了接入点列表,MUA Union Daemon 可以从 Union API 获取列表并自动进行更新。由 Union API 服务器对 UNION_MEMBER_KEY
进行验证,确保安全性。
在基本框架下,联合大厅服务器为经典的二层网络,即 1 代理端 + n 子服。这样的结构好处在于可以得到官方的技术支持,且拥有原生转发的游戏延迟。基于使用 BungeeCord 作为代理端的成员服务器占绝大多数的现实考量,联合大厅的 Velocity 使用 legacy 转发方式,这意味着如果一个原有服务器网络使用 modern 转发方式,则需要将其所有子服调整为接受 BungeeCord 的转发协议,并且此时其原有代理端也将无法按 modern 转发方式正常工作。
技术上无法做到让同一 Velocity 代理端同时支持不同的转发协议,因此,我们引入二层网络来间接解决这一问题。
在二层网络中,一层代理端为联合大厅所使用的 Velocity,二层代理端则为待接入联合大厅的原有游戏网络中的 Velocity 端(其使用 modern 转发方式与后端通信)。通过在一层与二层代理端中安装特制插件,一层代理向二层代理以兼容 BungeeCord 的特制转发方式进行连接,安装了插件的二层代理将处理这一信息,通过非对称密钥确定其来自可信上层代理。这一修改并不影响未装插件的代理端与普通子服的行为。
当然,二层网络带来方便接入优点的同时,也带来了增加游戏延迟的缺点,这将由各服主进行考量决定使用何种接入方案。-而无论何种方案下,原有网络中的代理端仍能正常工作,联合大厅不过是利用各子服组建了一个新的游戏服务器。
玩家感受到的延迟大约是
玩家--接入点
与接入点--子服
的延迟之和。如果使用代理端接入,则接入点--子服
的延迟等于接入点--代理端
与代理端--子服
之和。一般而言,代理与子服在同一台机器上,代理端--子服
的延迟可以忽略不计。
相关 Velocity 插件已开源:
这里的操作比较复杂,建议让具有较强动手能力和信息检索能力的同学部署。
接入点服务器需要具有比较稳定的网络和公网能够访问的端口。考虑到各服务器的峰值在线人数实际上并不多,因此对接入点没有很高的带宽要求。
verification-type
选 RSA
,启动后会生成一对密钥文件。注意确保密钥安全!lobby
,IP: mc.sjtu.cn:20270
。(大厅的端口是公开的,可以从非信任的 BungeeCord 加入,可能日后会弃用这种配置。)%metas%
和 %servers%
作为占位符。我们假定接入点的游戏地址为 union.example1.com,你的域名为 example2.com,你希望使用 mc.example2.com 进入联合大厅,并且指定默认登录大厅为 mylobby。
上海交通大学接入点由上海交通大学Minecraft社提供,入口为上海市教育网,带宽为双向千兆。
上海交通大学接入点到各地区教育网主干节点的延迟参考:
地区 | 城市 | 延迟 |
---|---|---|
华北地区 | 北京市 | 26.7ms |
西北地区 | 西安市 | 46.8ms |
西南地区 | 成都市 | 40.7ms |
华南地区 | 广州市 | 31.6ms |
华中地区 | 武汉市 | 16.4ms |
华东南地区 | 上海市 | 0.5ms |
华东北地区 | 南京市 | 7.4ms |
东北地区 | 沈阳市 | 47.7ms |