联合大厅是Minecraft高校联盟维护的一个Minecraft高校联合服务器群。通过接入联合大厅,各高校可以在保留服务器原有进入方式的情况下,通过联合大厅直接访问其他高校服务器,无需手动查找服务器地址。
要想进入联合大厅,你需要先拥有 联合认证 皮肤站账号,即 MUA 皮肤站 或接入 Union 系统的数十余所高校皮肤站账号。
在启动器使用上述皮肤站账号登录后,使用主流 Minecraft Java 版本访问如下服务器地址,选择离您相对较近的一个节点,即可进入联合大厅,并通过 /hub 标签名
命令进入各高校服务器游玩。
部分高校使用自定义域名从而访问联合大厅,您可以在 这里 查看这些地址。
标签名 | 所属高校 | 二层代理 |
---|---|---|
lobby | MUA高校联盟 | 否 |
DUT | 大连理工大学 | 是 |
CSU-MC | 中南大学 | 是 |
ECUSTA | 华东理工大学 | 否 |
FDC | 复旦大学 | 是 |
FJMUA | 福建MUA高联 | 是 |
Gxucraft | 广西大学 | 是 |
HQU | 华侨大学 | 否 |
IMU | 内蒙古大学 | 是 |
LNUMC | 辽宁大学 | 是 |
NCEPU | 华北水利水电大学 | 是 |
NJUPT2 | 南京邮电大学 | 否 |
NPUcraft | 西北工业大学 | 否 |
SDUST | 山东科技大学 | 是 |
SITMC | 上海应用技术大学 | 是 |
SJMC | 上海交通大学 | 是 |
SUESMC | 上海工程技术大学 | 是 |
TaruCraft | 塔里木大学 | 是 |
你可以在你的高校服务器上使用
/hub
指令进行测试。这是联合大厅的服务器切换指令,如果存在此命令则服务器已接入联合大厅。
联系人:@ff98sha 或 @ART1st
尽管我们已经多次优化,但接入联合大厅依然需要您拥有一些计算机技术基础知识,在此基础上,我们会尽可能用简单的语言向您解释如何将您的服务器接入联合大厅。
简单来说,接入联合大厅分为三步:
随后启动游戏服务器和 MUAFrpDaemon,具体的安装操作方法见下。
不同系统安装 Python 的方式并不完全相同,以下仅介绍一些主流的系统,请保证您安装的 Python 版本大于 3.9
Windows 系统推荐使用 .exe
文件进行安装。在 此链接 寻找并下载需要的版本。在安装时推荐勾选 Add python.exe to PATH 选项将 Python 添加至环境变量。
Linux 系统推荐使用包管理器直接安装。以下是一些常见 Linux 发行版上安装 Python 的命令:
sudo apt-get install python3
sudo yum install python3
sudo dnf install python3
sudo pacman -S python3
安装完成后,可以通过运行 python3
来确认 Python 是否正确安装,并且检查其版本。
此章节说明了您需要对 Minecraft 服务器的进行的配置细节。
首先,通过联合大厅加入游戏的客户端版本各不相同,推荐为接入的游戏服务器安装 ViaVersion 与 ViaBackwards 插件/模组。
下载 authlib-injector 1.2.1 及以上版本,并使用 Union 联合验证地址(https://skin.mualliance.ltd/api/union/yggdrasil )。配置教程见 此处。
在 spigot.yml
中设置 Bungeecord = true
在 server.properties
中设置 online-mode = false
,并确保外部无法直接访问该服务器。
需要注意的是,如果通过这种方式将服务器接入大厅,原先的地址将不再安全甚至无法使用,由于需要关闭
Online-mode
,未经验证的账户可以进入服务器。
请阅读如何通过 如何通过自定义域名解析并指定默认登录大厅 一节,将原先的域名解析至联合大厅。
plugins/Fabric-Bungeecord-Proxy
找到配置文件,并且设置 BungeeCord = true
。server.properties
中设置 online-mode = false
,并确保外部无法直接访问该服务器。需要注意的是,如果通过这种方式将服务器接入大厅,原先的地址将不再安全甚至无法使用,由于需要关闭
Online-mode
,未经验证的账户可以进入服务器。
请阅读如何通过 如何通过自定义域名解析并指定默认登录大厅 一节,将原先的域名解析至联合大厅。
联合大厅不支持 Forge 服务端接入,存在技术障碍。
如果你的服务器使用 Velocity 的 modern
转发,或者使用 BungeeCord 进行代理,希望在不修改配置的条件下将整个游戏服务器网络接入联合大厅,则可以以损失部分游戏延迟为代价,将 Velocity / BungeeCord 直接接入联合大厅,形成二层代理。
从理论上来说,即使你的 Velocity 使用 legacy
转发,也可以使用相同的方式接入联合大厅,但在这种情况下,我们更推荐直接接入子服,以减少游戏延迟。
代理端和您的所有下游服务器均需要配置 authlib-injector,但仅需要为代理端开启
online-mode
Plugins
文件夹下,启动并关闭。重命名config-template-proxy.toml
为config.toml
,并且按照如下注释按需修改。配置文件位于:
BungeeCord :/plugins/ProxiedProxy
Velocity :plugins/proxied-proxy
# 服务器角色可用选项:
# - PROXY: 接受来自上游 ENTRY 服务器的连接(作为二级代理应该选择此项)
# - ENTRY: 将客户端连接代理到 PROXY 服务器或 Minecraft 服务器
role = "PROXY"
# 设置为true,开启调试信息
verbose = false
[proxy]
# 允许客户端直接连接(建议关闭)
allow-client-connection = false
# 以下功能为联合大厅黑白名单功能,您可以允许或者禁止指定的皮肤站用户进入或禁止进入您的服务器
[proxy.skin-service-backend]
# 以下两项同时为空则为关闭
# 同时填写以下两项默认为白名单模式
# 例如:禁止 SJMC 和 SITMC,blocked = ["SJMC","SITMC"]
# 仅允许 SJMC 用户进入,allowed = ["SJMC"]
blocked = []
allowed = []
# Union API,勿动
union-query-api = "https://skin.mualliance.ltd/api/union/profile/mapped/byuuid/"
MUAFrpDaemon 现已支持自动下载和更新 ProxiedProxy 插件,但仍然需要手动修改配置
config.toml
。
TrustedEntries.json
文件,将其内容替换为下列链接中的内容:https://skin.mualliance.ltd/api/union/network/entry
。Frp Daemon 是一个 FRPC 自动配置守护程序,定时从服务器获取最新的配置文件并管理 FRPC 进程。
这个程序设计上和 MUA Union API、MUA 联合大厅一同使用,以便 MUA 服务器网络能够添加更多的入口节点。该工具可以自动同步接入点服务器。
以下是安装及配置教程:
直接点击 Code,选择 Download ZIP 即可,或者使用
git clone
下载
pip install -r requirements.txt
。看到形如 "Successfully installed xxxxxx" 的消息即为安装成功,如果安装失败请检查网络环境和 Python/pip 版本
config.py.demo
至 config.py
,使用文本编辑器打开,并按照如下说明修改配置。FRPC_UNION_MEMBER_KEY = ""
中填写您的 Union Member Key该值位于皮肤站 插件配置 > Yggdrasil API 配置 > Union API配置 > Union Member Key 处获取到的值。如果你没有部署皮肤站,请联系管理员 @ff98sha 获取一个Key。
FRPC_CONFIG_PLACEHOLDERS
配置。FRPC_CONFIG_PLACEHOLDERS = {
# 以下为自定义域名配置项,配置后可以通过自定义域名直接访问到联合大厅
# 对应标签的服务器,如果您没有自定义域名需求可以跳过
"metas" : '''
# 自定义二级域名,例如 mua.sjmc.club
metadatas.domain = "domain"
# 域名别名,如果您有多个域名希望可以访问联合大厅可以填写在此处
metadatas.domain_alias = "[\\"alias1\\", \\"alias2\\"]"
# 该域名访问的标签,是下方 servers 配置中 name 的值
metadatas.forced_hosts = "[\\"forced_host\\"]"
''',
"servers" : '''
[[proxies]]
# 输入 /hub 时显示在联合大厅的标签名
name = "SJMC"
# 请勿更改
type = "tcp"
# 服务器本地 IP,一般为 127.0.0.1 或 0.0.0.0
localIp = "127.0.0.1"
# 服务器本地端口,详见 server.properties 中 server-port 的值
localPort = 00000
# 联合大厅端口,请输入 10000-19999 中的任意一个端口
remotePort = 00000
'''
}
特别重要:
remotePort
请使用 10000-19999 之间的端口,随机选择一个未被占用的端口即可,不在这个范围内的端口会导致出现无法断开的情况!!
在填写此部分的时候
"[\\"forced_host\\"]"
,请勿修改格式,修改对应值即可,例如"[\\"SJMC\\"]"
MUAFrpDaemon 提供了一些扩展,可以帮助您自动更新一些需要的插件,您可以按照需要启动,扩展位于 extensions
目录下。删除文件名开头的 #
以启用该扩展。
minecraft.py
如果你使用二级代理接入联合大厅,可以考虑启用 minecraft.py
扩展。
此拓展可以帮助您启动 MUAFrpDaemon 时启动并管理代理端进程。
拷贝 Velocity/BungeeCord 的文件到 MUAFrpDaemon/server
文件夹(即 MUAFrpDaemon 根目录,没有此文件夹请自行创建)。
随后使用文本编辑器打开 minecraft.py
,按照注释修改如下的配置。
self.__config = extension_config.load_config("minecraft.yml", {
# ProxiedProxy 插件重载命令(无需修改)
"reload_config_command" : "prox reload",
# Minecraft代理端路径,一般无需修改
# 即Velocity/BungeeCord 的文件所处的位置
"minecraft_proxy_dir" : "server",
# Bungeecord 应当改为 plugins/ProxiedProxy/TrustedEntries.json
# Velocity 应当改为 plugins/proxied-proxy/TrustedEntries.json
"trusted_entries_file" : "plugins/proxied-proxy/TrustedEntries.json",
# 您的启动命令,可以是 .bat/.sh 等脚本文件
# 也可以是具体的 java 命令
"start_command" : "bash start.sh"
autoupdate_frpc.py
和 download_github_release.py
这两个拓展可以帮助您自动更新和下载 FRPC ,默认开启。(需要可以访问Github的环境)
autoupdate_plugins.py
此拓展可以帮助您更新代理端的插件。
resource id
。如 ViaVersion 的链接为https://www.spigotmc.org/resources/viaversion.19254/
,其resource id
为 19254
。SPIGET_PLUGINS
,形如 (<resource id>, <jar名称>)
GITHUB_PLUGINS
,形如 (<repo>, <jar名称>, [可选,release file的正则表达式])
以下是实际案例,默认添加了 Via 三件套、ProxiedProxy 和 UnionProxyExtension 插件。
"spiget" : [
{"id" : 19254, "file" : "ViaVersion.jar"},
{"id" : 27448, "file" : "ViaBackwards.jar"},
{"id" : 52109, "file" : "ViaRewind.jar"}
],
"github" : [
{"repo" : "CakeDreamer/ProxiedProxy", "file" : "ProxiedProxy.jar"},
{"repo" : "MUAlliance/UnionProxyExtension", "file" : "UnionProxyExtension.jar"}
autoupdate_bungeecord.py
和 autoupdate_velocity.py
这两个拓展可以帮助您自动更新代理端核心。
修改 "file" : "velocity.jar"
为您的核心文件名即可
autoupdate_authlib_injector.py
此拓展可以帮助您自动更新 authlib_injector.jar
修改 "file" : "authlib_injector.jar"
为您的核心文件名即可
恭喜您,此时启动游戏服务器和 MUAFrpDaemon ,您应该可以访问联合大厅,并通过
/hub
切换至您的服务器。
最初 MUA 在 2021 年 6 月尝试开发联合大厅,旨在将各个高校的服务器通过同一个群组服代理连接起来,从而使各个高校的玩家可以在各个成员学校服务器直接自由进出,方便各个高校玩家之间交流。由于最初的技术方案维护成本较高、接入方式较复杂,在完成初步测试后,最终放弃进行更大规模的推广应用。
2023 年 1 月底,在基于 高校联盟联合验证机制 已基本成熟、投入推广使用的背景下,联合大厅建设计划重新启动,并在经过讨论后得到了一个更简单、更易维护的实施方案。各高校可以在保留原有的接入方式的情况下,通过接入联合大厅,使得其他高校的同学能够通过联合大厅访问高校服务器,无需一个个查找服务器地址。
另一方面,服务器可以直接接入联合大厅而不需要拥有公网IP,也无需端口映射。联合大厅支持多个接入点,玩家可以选择延迟最低的接入点接入服务器。
接入点服务器需要具有比较稳定的网络和公网能够访问的端口。考虑到各服务器的峰值在线人数实际上并不多,因此对接入点没有很高的带宽要求。
条件:
docker-compose.yml
,并修改<MUA CODE>
、<UNION API TOKEN>
、<RANDOM STRING>
<MUA CODE>
参考 https://skin.mualliance.ltd/api/union/network/entry
中id,要求由大写字母及下划线构成<UNION API TOKEN>
为皮肤站
-> 管理面板
-> 插件配置
-> Yggdrasil API
-> Union相关配置
-> Union Member Key
(Union Member Key
是一个长度为64的随机字符串)<RANDOM STRING>
为自定义随机字符串services:
entry:
image: <arti5t/>mua-union-lobby-entry:latest
stdin_open: true
tty: true
volumes:
- "/www/wwwroot/mua-lobby:/server"
environment:
- UNION_SYNC_URL=wss://mc.sjtu.cn:22905
- UNION_ENTRY_ID=<MUA CODE>
- UNION_SYNC_AUTH_TOKEN=<UNION API TOKEN>
- FRPS_AUTH_TOKEN=<RANDOM STRING>
- FRPS_WEBSERVER_USER=...
- FRPS_WEBSERVER_PASSWORD=...
ports:
- "7001:7001"
- "7002:7002/udp"
- "7003:7003/udp"
- "7500:7500"
- "25565:25577"
restart: "no"`
docker-compose.yml
是一个严格缩进的文件,在编辑及运行时须注意其缩进
若您已经安装MUAFrpDaemon
,请将image
中的<arti5t/>
删除,若未安装,则删去其两边的尖括号(这是因为docker无法直接通过官方库拉取MUAFrpDaemon
)。
暴露的端口为7001(tcp)、7002(kcp)、7003(quic)和7500(admin panel)。25565为玩家连接端口。通过FRPS_WEBSERVER_USER
和FRPS_WEBSERVER_PASSWORD
设置admin panel的用户名密码。
如要更换GitHub API镜像,请设置GITHUB_API_ROOT
环境变量,如https://api.github.com
。
/etc/sysctl.d/10-network-tcp-buff.conf
:net.core.rmem_max=2500000
net.core.wmem_max=2500000
sysctl "net.core.rmem_max=2500000"
sysctl "net.core.rmem_max=2500000"
编辑start.sh
start.sh
docker compose pull
docker compose up
使用该命令启动:bash start.sh
。首次启动时,会自动设置插件和Velocity的配置,配置完成后会自动关闭。这时,你可以安装别的插件或者按需修改你的设置。
配置完成后,联系Union Lobby管理员,发送你的服务器 ID、公钥、域名、端口、协议、auth token。
<MUA CODE>
docker数据卷目录./union/entry.json
中docker数据卷目录./union/frpc.txt
中<RANDOM STRING>
,若忘记,可以在docker数据卷目录./union/frpc.txt
中找回velocity.toml
并修改以下词条# `docker-compose.yml` 中规定使用主机 25565端口 映射 容器 25577端口,大厅代理服务器运行在docker容器中,所以此处端口设置为25577。
bind = "0.0.0.0:25577"
#应当使得代理端均为true,下游子服均为false
online-mode = true
player-info-forwarding-mode = "legacy" # 此处固定为"legacy"
[servers]
# 设置下游代理服地址,此处地址应为代理服务器或未配置代理的独立服务器而非子服,<lobby>更改为 FRPC_CONFIG_PLACEHOLDERS 配置中"name"的值。
<lobby1> = "mc.egample1.com:14514"
<lobby2> = "mc.egample2.com:30067"
<lobby3> = "mc.egample3.com:30068"
# 设置尝试列表。
try = [
"<lobby1>","<lobby2>","<lobby3>"
]
[forced-hosts]
# 设置默认大厅
"mc.egample1.com:14514" = [
"<lobby1>"
]
#"factions.example.com" = [
# "factions"
#]
#"minigames.example.com" = [
# "minigames"
#]
Velocity
可能存在配置错误,导致无法正确解析域名。[14:21:53 ERROR]: [connected player] Godot (/X.X.X.X:4365): unable to connect to server TaruCraft
java.net.UnknownHostException: mc.tarucraft.club
Velocity
代理端正确且只有一个进程[14:25:37 ERROR]: [connected player] Godot (/X.X.X.X:3100): unable to connect to server TaruCraft
com.velocitypowered.proxy.util.except.QuietRuntimeException: The connection to the remote server was unexpectedly closed.
online-mode
状态不匹配velocity.toml
中player-info-forwarding-mode
为legacy
[14:39:34 ERROR]: [connected player] Godot (/X.X.X.X:10191): unable to connect to server TaruCraft
java.lang.IllegalStateException: Backend server is online-mode!
联合大厅在逻辑上为一个新的游戏服务器网络,即类似于虚拟私有局域网(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 的特制转发方式进行连接,安装了插件的二层代理将处理这一信息,通过非对称密钥确定其来自可信上层代理。这一修改并不影响未装插件的代理端与普通子服的行为。
当然,二层网络带来方便接入优点的同时,也带来了增加游戏延迟的缺点,这将由各服主进行考量决定使用何种接入方案。而无论何种方案下,原有网络中的代理端仍能正常工作,联合大厅不过是利用各子服组建了一个新的游戏服务器。
以下是部分问题的解决方案,仅供参考。
接入点列表 见此,选择合适的接入点可以有效的降低延迟
CNAME
记录,随意命名。例如:any.example2.com
,让其指向 union.example1.com
config.py
,修改 metas
节_minecraft._tcp.mc.example2.com
,记录值为 0 5 <port> any.example2.com
。其中,<port>
需要替换为接入点 Velocity 所使用的端口,请查看接入点域名解析,一般为25565。config.py
,修改 metas
节若你的服务器玩家出现了小地图无法识别直接导致的地图重叠问题,建议安装如下插件:
安装其中一个即可,两个都装也行。
上海交通大学接入点由 上海交通大学 Minecraft 社提供,入口为上海市教育网,带宽为双向千兆。
上海交通大学接入点到各地区教育网主干节点的延迟参考:
地区 | 城市 | 延迟 |
---|---|---|
华北地区 | 北京市 | 26.7ms |
西北地区 | 西安市 | 46.8ms |
西南地区 | 成都市 | 40.7ms |
华南地区 | 广州市 | 31.6ms |
华中地区 | 武汉市 | 16.4ms |
华东南地区 | 上海市 | 0.5ms |
华东北地区 | 南京市 | 7.5ms |
东北地区 | 沈阳市 | 47.7ms |
欢迎查看 MUA 理事会群公告中的『MUA·VPS 云服务器租赁』选购低价 MC 服务器。
浙江接入点由圈圈提供,入口为浙江省宁波市电信,带宽为 60Mbps。
浙江接入点到各地区教育网主干节点的延迟参考:
地区 | 城市 | 延迟 |
---|---|---|
华北地区 | 北京市 | 46.8ms |
西北地区 | 西安市 | 60.0ms |
西南地区 | 成都市 | 58.3ms |
华南地区 | 广州市 | 24.8ms |
华中地区 | 武汉市 | 31.9ms |
华东南地区 | 上海市 | 30.0ms |
华东北地区 | 南京市 | 13.5ms |
东北地区 | 沈阳市 | 63.2ms |
湖北接入点由 内蒙古大学似社非社Minecraft分部 提供,入口为湖北省十堰市电信,带宽为 300Mbps。
湖北接入点到各地区教育网主干节点的延迟参考:
地区 | 城市 | 延迟 |
---|---|---|
华北地区 | 北京市 | 24.8ms |
华北地区 | 呼和浩特市 | 33.2ms |
西北地区 | 西安市 | 33.8ms |
西南地区 | 成都市 | 32.6ms |
华南地区 | 广州市 | 21.6ms |
华中地区 | 武汉市 | 6.9ms |
华东南地区 | 上海市 | 21.9ms |
华东北地区 | 南京市 | 24.7ms |
东北地区 | 沈阳市 | 37.0ms |
四川接入点由 塔里木大学胡杨方块社 提供,入口为四川省成都市电信,带宽为 100Mbps。
四川接入点到各地区教育网主干节点的延迟参考:
地区 | 城市 | 延迟 |
---|---|---|
华北地区 | 北京市 | 46.0ms |
西北地区 | 西安市 | 47.2ms |
西南地区 | 成都市 | 56.4ms |
华南地区 | 广州市 | 26.8ms |
华中地区 | 武汉市 | 35.1ms |
华东南地区 | 上海市 | 49.8ms |
华东北地区 | 南京市 | 28.5ms |
东北地区 | 沈阳市 | 57.5ms |