# BungeeViaProxy
## TL;DR
**BungeeViaProxy** 是一个 [BungeeCord](https://github.com/SpigotMC/BungeeCord) 插件,它修复了与 [ViaProxy](https://github.com/ViaVersion/ViaProxy) 兼容性问题,使您可以使用单个 ViaProxy 实例管理运行不同 Minecraft 版本的多个后端服务器。
- **为什么?**
[ViaBungee](https://github.com/ViaVersion/ViaBungee) 在 Minecraft 1.20.2 中已停止支持。为了继续使用 BungeeCord 与最新版本的 Minecraft,您需要 ViaProxy。
然而,将 ViaProxy 与 BungeeCord 结合使用会引入挑战,例如不正确的主机名转发和重复服务器错误。
- **它如何提供帮助?**
BungeeViaProxy 通过确保正确的 hostname 转发并避免重复服务器错误来解决这些问题,从而实现 ViaProxy 和 BungeeCord 的无缝集成。
- **谁应该使用它?**
运行 BungeeCord 网络并具有多个后端服务器的 Minecraft 服务器管理员,这些服务器需要支持 Minecraft 版本,包括 1.20.2 及更高版本,但希望避免在每个后端服务器上管理 [ViaVersion](https://github.com/ViaVersion/ViaVersion) 的复杂性。

## 目录
- [概述](#overview)
- [用例](#use-case)
- [工作原理](#how-it-works)
- [特性](#features)
- [安装](#installation)
- [注意](#note)
- [配置](#configuration)
- [示例配置](#example-configuration)
## 概述
**BungeeViaProxy** 是一个 BungeeCord 插件,旨在解决在使用 [ViaProxy](https://github.com/ViaVersion/ViaProxy) 与 [BungeeCord](https://github.com/SpigotMC/BungeeCord) 时出现的兼容性问题。
此插件特别适用于具有多个运行不同 Minecraft 版本的后端服务器的网络,您希望在每个后端服务器上维护 ViaVersion 插件的开销最小化的情况下,支持最新版本的 Minecraft。
[ViaBungee](https://github.com/ViaVersion/ViaBungee) 的支持已于 Minecraft 1.20.2 停止,这使得迁移到 ViaProxy 以实现与游戏较新版本的兼容性成为必要。
本指南对于那些希望在继续使用 BungeeCord 与最新版本的 Minecraft 的同时避免在每个后端服务器上单独更新 [ViaVersion](https://github.com/ViaVersion/ViaVersion) 的负担的人有价值。
通过利用具有 wildcard-domain-handling 的 ViaProxy,单个 ViaProxy 实例可以支持多个后端服务器,从而简化更新并减少资源使用。
## 用例
BungeeViaProxy 适用于:
- 使用 BungeeCord 管理多个运行不同 Minecraft 版本的后端服务器的网络。
- 希望使用 ViaProxy 和 Bungeecord 维护与最新 Minecraft 版本的兼容性的管理员。
- 通过 ViaProxy 集中版本转换来减少在单个后端服务器上更新 ViaVersion 插件的操作开销。
**重要提示:** 在这种设置中使用 ViaProxy 时,必须将其置于 BungeeCord 和后端服务器之间。此外,在 ViaProxy 的配置中:
- `proxy-online-mode` 必须禁用。
- `auth-method` 必须设置为 `NONE`。
- `wildcard-domain-handling` 必须设置为 `PUBLIC`。
- `target-address` 在使用 `wildcard-domain-handling` 时会被忽略 (任何内容都可以)。
## 工作原理
通常,每个后端服务器都需要单独的 ViaProxy 实例。
然而,这可能会导致内存消耗增加和额外的更新工作。
为了解决这个问题,ViaProxy 支持 `wildcard-domain-handling` 功能,允许单个 ViaProxy 实例处理连接到多个后端服务器。
这通过使用特定地址格式来实现每个后端服务器:
```
address.<后端 IP>.port.<后端端口>.version.<后端版本>.f2.viaproxy..nip.io:
```
这些地址然后可以列在 BungeeCord 的 `config.yml` 中,从而实现通过单个 ViaProxy 实例进行无缝连接管理。
然而,这种设置会引入某些挑战,BungeeViaProxy 解决了这些挑战。
## 特性
1. **正确的 hostname 转发:**
当 ViaProxy 中启用 `wildcard-domain-handling: PUBLIC` 时,它可能无法检索 BungeeCord 配置中指定的 hostname,从而阻止了正确的服务器路由。BungeeViaProxy 确保任何包含 `.viaproxy.` 的地址都正确转发到后端服务器。
2. **避免重复服务器错误:**
BungeeCord 将解析为同一 IP 地址的不同 hostname 的服务器视为同一服务器,从而导致错误:“您已经连接到此服务器了!”。 BungeeViaProxy 通过使用未解析的 `InetSocketAddress` 对象来解决此问题,确保了具有不同 hostname 的服务器的唯一标识。
## 安装
1. 下载 BungeeViaProxy 的最新版本。
2. 将插件 `.jar` 文件放入您的 BungeeCord `plugins` 目录中。
3. 重新启动您的 BungeeCord 服务器。
## 注意
注意:您需要从 Jenkins 下载并使用 ViaProxy 的最新版本,目前尚未发布 (2025/1/16,将在 ViaProxy 3.3.8 发布版中包含)。
https://ci.viaversion.com/view/All/job/ViaProxy/
这允许使用 BungeeCord 配置中可以使用的 f2 格式。
`address..port.<端口>.version.<版本>.f2.viaproxy.<主机名>`
## 配置
不需要额外的配置。BungeeViaProxy 自动处理 `.f2.viaproxy.` 地址并确保正确的服务器路由。
## 示例配置
这是一个示例,说明如何配置 BungeeCord 与 wildcard-domain-handling 使用 ViaProxy

假设以下设置:
| 服务器 | IP:端口 | Minecraft 版本 |
|------------------|---------------------|-------------------|
| BungeeCord | 127.0.0.1:25565 | N/A |
| ViaProxy | 127.0.0.1:25566 | N/A |
| 后端服务器 1 | 127.0.0.1:3001 | 1.20.4 |
| 后端服务器 2 | 127.0.0.1:3002 | 1.16.5 |
| 后端服务器 3 | 127.0.0.1:3003 | 1.21 |
BungeeCord `config.yml` (仅显示相关选项):
```yaml
online_mode: true
servers:
server1:
# ViaProxy 地址格式:address.<后端 IP>.port.<后端端口>.version.<后端版本>.f2.viaproxy..nip.io:
address: address.127.0.0.1.port.3001.version.1.20.4.f2.viaproxy.127.0.0.1.nip.io:25566
motd: '&1Example Server 1'
restricted: false
server2:
# 在此示例中,
# 后端服务器 IP:127.0.0.1:25566
# ViaProxy IP:127.0.0.1:3002
address: address.127.0.0.1.port.3002.version.1.16.5.f2.viaproxy.127.0.0.1.nip.io:25566
motd: '&1Example Server 1'
restricted: false
server3:
# 如果不需要,可以省略版本 (ViaProxy 会自动检测版本)
address: address.127.0.0.1.port.3003.f2.viaproxy.127.0.0.1.nip.io:25566
motd: '&1Example Server 3 (".version.1.20.4" 可以省略)'
restricted: false
listeners:
- host: 0.0.0.0:25565
prevent_proxy_connections: false
ip_forward: true
```
ViaProxy `config.yml` (仅显示相关选项):
```yaml
# ViaProxy 配置文件的
# ViaProxy 应该侦听连接的地址。
# 此选项不可重新加载。
bind-address: 0.0.0.0:25566
# ViaProxy 应该连接到的服务器地址。
target-address: AnythingIsOK.ThisFieldIsIgnored.example.com
# Proxy Online Mode 允许您在 online mode 服务器上看到皮肤并使用签名聊天功能。
# 启用 Proxy Online Mode 需要您的客户端具有有效的 minecraft 帐户。
proxy-online-mode: false
# 用于连接到目标服务器的身份验证方法。
# none: 无身份验证 (离线模式)
# openauthmod: 需要 OpenAuthMod 客户端模组 (https://modrinth.com/mod/openauthmod)
# account: 要连接到目标服务器使用帐户。 (必须在 ViaProxy GUI 中配置)
auth-method: NONE
# 允许客户端使用 wildcard 域名指定目标服务器和版本。
# none: 不使用 wildcard 域名处理。
# public: 公共 wildcard 域名处理。 适用于外部客户端使用。 (例如:address..port..version..f2.viaproxy.127.0.0.1.nip.io (版本是可选的))
# internal: 内部 wildcard 域名处理。 适用于本地客户端使用。 (例如:original-handshake-address\7address:port\7version\7classic-mppass)
wildcard-domain-handling: PUBLIC
```
后端服务器 `server.properties` (仅显示相关选项):
```properties
server-port=3001
online-mode=false
```
后端服务器 `spigot.yml` (仅显示相关选项):
```yaml
settings:
bungeecord: true
```
注意:
- 后端服务器不需要 ViaVersion 插件。 (因为版本转换由 ViaProxy 处理)
- 不要使用 [ViaProxyAuthHook](https://github.com/ViaVersionAddons/ViaProxyAuthHook),因为 ViaProxy 位于 BungeeCord 和后端服务器之间。
## bStats
BungeeViaPower 使用 [bStats](https://bstats.org/plugin/bungeecord/BungeeViaProxy/24459) 收集匿名统计数据。
您可以在 [这里](https://bstats.org/plugin/bungeecord/BungeeViaProxy/24459) 找到统计数据。
bStats 用于了解插件的使用情况并帮助改进它。
要禁用统计数据收集,请将 `plugins/bStats/config.yml` 中的 `enabled` 设置为 `false`。