- 版权类型
- 原创
- 语言支持
- 多语言
- 前置组件
- 无
- 适配版本(基岩)
- 最新版本
[MD]
<div align="center">
<img src="assets/icon.png" width="144" height="144" alt="YvLink project icon / YvLink 项目图标">
<h1>YvLink · mc-proxy</h1>
<p>
Minecraft Java 协议感知转发器与 Web 管理控制台<br>
Protocol-aware Minecraft Java proxy with a web control panel
</p>
<p>
<a href="#中文">中文</a> ·
<a href="#english">English</a> ·
<a href="[URL]https://baiyun1123.github.io/YvLink/[/URL]">API Docs</a> ·
<a href="MODDED_COMPATIBILITY.md">Modded Compatibility</a> ·
<a href="CROSSPLAY.md">Crossplay</a>
</p>
</div>

---
<a id="中文"></a>
# 中文
## 项目简介
YvLink(程序包名 `mc-proxy`)是一款使用 Rust 与 Tokio 构建的高性能 Minecraft Java TCP 转发器。它会解析连接初期的 Handshake、Status 和 Login Start,根据客户端访问的域名选择后端,并在选路完成后透明转发后续游戏与模组协议。
项目同时提供内置 Web 管理控制台,可在线管理路由、后端池、状态响应、白名单、健康检查和跨平台互通配置,无需手工修改 TOML 后重启服务。
当前开发版本:**v0.12.0**
## 下载
正式安装包请从 [GitHub Releases](https://github.com/baiyun1123/YvLink/releases/latest) 下载,不要使用 GitHub 自动生成的 `Source code (zip)` 作为安装包。
| 文件 | 适用环境 |
| --- | --- |
| `YvLink-ubuntu-22.04-x86_64.tar.gz` | Ubuntu 22.04 或兼容的 x86_64 glibc Linux |
| `YvLink-ubuntu-24.04-x86_64.tar.gz` | Ubuntu 24.04 或更新的 x86_64 glibc Linux |
| `YvLink-linux-musl-x86_64.tar.gz` | Alpine 及多数 x86_64 Linux 发行版的便携版本 |
| `YvLink-linux-musl-aarch64.tar.gz` | ARM64 Linux、ARM 服务器和树莓派 64 位系统 |
| `YvLink-windows-2022-x86_64.zip` | 64 位 Windows |
## 主要功能
- 单端口多域名路由,支持精确 Host、`*`/`?` 通配符和默认兜底规则。
- 单路由最多 128 个后端,支持顺序、随机、轮询、最少连接和最低延迟策略。
- 后端连接失败自动故障转移;可选 TCP 或 Minecraft Status 协议级主动健康检查。
- 支持自定义服务器列表状态,或透传后端状态并按需覆盖字段。
- 保留 Forge、NeoForge 状态扩展、favicon、玩家 sample 和未知 JSON 字段。
- 支持登录前玩家名白名单和自定义拒绝消息。
- 支持 PROXY Protocol v1/v2,将真实连接地址传给明确兼容的受信任后端。
- 对原版、Fabric、Forge 与 NeoForge 后续协议执行双向透明转发。
- Web 控制台提供配置管理、运行指标、后端健康状态和 60 秒实时吞吐曲线。
- 管理 API 使用 Bearer Token;配置变更通过临时文件和原子重命名持久化。
- 可配合外部 Geyser Standalone 提供 Bedrock 接入,并通过 RakNet Pong 检查其状态。
- 支持 Ctrl+C/SIGTERM 优雅退出、连接数限制、超时控制和 Linux/Android `SO_REUSEPORT`。
## 工作方式
```text
Java 客户端
│ TCP :25565(Handshake 中携带访问域名)
▼
YvLink
├─ 按规则顺序匹配 Host
├─ 按策略选择健康后端
├─ 可处理 Status / 白名单
└─ 透明转发后续协议
├─ 后端 A
├─ 后端 B
└─ 后端 C
浏览器 ── HTTP :18080 / HTTPS 反代 ── Web 控制台与管理 API
```
同一入口可承载多个域名。客户端连接时,代理读取 Minecraft Handshake 中的 virtual host,选择首个匹配规则,再从该规则的后端池中选择节点。若首选节点连接失败,会继续尝试池内其他节点。
## 所需环境
### 开发与本地运行
| 项目 | 要求 |
| --- | --- |
| Rust | 1.85 或更高版本 |
| Cargo | 随 Rust toolchain 安装 |
| 操作系统 | Linux 推荐;其他支持 Rust/Tokio 的平台可自行构建 |
| 管理令牌 | 环境变量 `MC_PROXY_ADMIN_TOKEN`,至少 32 个字符 |
| Node.js | 仅在执行前端 JavaScript 语法检查时需要 |
安装 Rust:
```sh
curl --proto '=https' --tlsv1.2 -sSf [URL]https://sh.rustup.rs[/URL] | sh
rustc --version
cargo --version
```
### 可选生产组件
| 组件 | 用途 |
| --- | --- |
| Nginx | 为仅监听回环地址的管理端提供 HTTPS 反向代理 |
| systemd | 服务守护、自动重启和开机启动 |
| Certbot | 申请与续期 Let’s Encrypt 证书 |
| Java 21 + Geyser Standalone | 需要 Bedrock → Java 互通时使用 |
## 快速启动
### 1. 获取并编译
```sh
git clone <你的仓库地址>
cd mc-proxy
cargo build --release
```
如果你已经位于项目目录,只需执行:
```sh
cargo build --release
```
### 2. 创建配置
```sh
cp config.example.toml config.toml
```
至少修改一条 `[[rules]]` 的 `host` 和 `backend`。如果还没准备好真实后端,可先设置:
```toml
[settings]
proxy_enabled = false
```
这样可以只启动管理控制台,避免开放一个无可用后端的 Minecraft 入口。
### 3. 设置管理令牌
生成随机令牌:
```sh
openssl rand -hex 32
```
仅为当前终端设置:
```sh
export MC_PROXY_ADMIN_TOKEN='替换为至少32个字符的高强度随机令牌'
export RUST_LOG='mc_proxy=info'
```
不要把令牌提交到 Git、写入公开 README 或放进前端源码。
### 4. 启动
使用已编译的二进制:
```sh
./target/release/mc-proxy --config config.toml
```
也可以直接通过 Cargo 编译并运行:
```sh
MC_PROXY_ADMIN_TOKEN='替换为至少32个字符的高强度随机令牌' \
RUST_LOG='mc_proxy=info' \
cargo run --release -- --config config.toml
```
默认地址:
- Minecraft Java 入口:`0.0.0.0:25565`
- Web 管理端:`[URL]http://127.0.0.1:18080[/URL]`
- 健康检查:`[URL]http://127.0.0.1:18080/healthz[/URL]`
- API 文档:`[URL]http://127.0.0.1:18080/docs/api[/URL]`
停止服务时按 `Ctrl+C`,程序会等待现有连接在宽限期内结束。
## 配置说明
完整、带注释的配置见 [`config.example.toml`](config.example.toml)。最小示例:
```toml
[admin]
listen = "127.0.0.1:18080"
[crossplay]
enabled = false
bedrock_listen = "0.0.0.0:19132"
java_address = "bedrock.example.com"
java_port = 25565
auth_type = "online"
[settings]
listen = "0.0.0.0:25565"
proxy_enabled = true
max_connections = 10000
connect_timeout_ms = 5000
handshake_timeout_ms = 5000
shutdown_grace_secs = 30
copy_buffer_bytes = 32768
socket_buffer_bytes = 1048576
listen_backlog = 4096
tcp_nodelay = true
reuse_port = false
stats_interval_secs = 10
[[rules]]
id = "survival"
name = "生存服"
host = ["play.example.com", "*.play.example.com"]
backend = ["10.0.0.2:25565", "10.0.0.3:25565"]
strategy = "least-connections"
proxy_protocol = "off"
modify_virtual_host = false
whitelist_enabled = false
whitelist = []
enabled = true
[rules.health_check]
enabled = true
mode = "minecraft-status"
interval_secs = 30
timeout_ms = 2000
unhealthy_threshold = 3
healthy_threshold = 2
minecraft_protocol = 769
[rules.status]
mode = "backend"
cache_ttl_secs = 30
[rules.status.fallback]
motd = "§c服务器暂时离线"
version_name = "后端不可用"
protocol = -1
online = 0
max = 100
```
### 关键配置
| 配置 | 说明 |
| --- | --- |
| `admin.listen` | Web 管理端监听地址;生产环境建议保持回环地址 |
| `settings.listen` | 所有 Java 域名共用的 TCP 入口 |
| `settings.proxy_enabled` | 是否启用 Minecraft 转发入口 |
| `rules.host` | 单个 Host 或 Host 数组,按规则出现顺序匹配 |
| `rules.backend` | 单个后端或后端数组,格式为 `host:port` |
| `rules.strategy` | `sequential`、`random`、`round-robin`、`least-connections` 或 `lowest-latency` |
| `rules.modify_virtual_host` | 是否将握手 Host 改写为后端主机名 |
| `rules.proxy_protocol` | `off`、`v1` 或 `v2`;普通服务端通常必须保持 `off` |
| `rules.health_check.mode` | `tcp` 只检查端口;`minecraft-status` 验证 Status JSON 与 Ping/Pong |
| `rules.status.mode` | `custom` 由代理生成状态;`backend` 保留后端状态并覆盖指定字段 |
规则按文件中的先后顺序匹配,因此 `host = "*"` 的兜底规则必须放在最后。
## Web 控制台与 API
管理端默认只监听 `127.0.0.1:18080`。浏览器首次访问时输入与 `MC_PROXY_ADMIN_TOKEN` 相同的令牌,令牌仅保存在当前标签页的 `sessionStorage` 中。
生产环境建议通过 Nginx 暴露 HTTPS,不要直接将管理端绑定到公网地址。仓库已提供:
- [`deploy/nginx-mc.lic6.top.conf`](deploy/nginx-mc.lic6.top.conf):Nginx 反向代理示例。
- [`deploy/nginx-rate-limit.conf`](deploy/nginx-rate-limit.conf):API 限速示例。
- [`docs/api.html`](docs/api.html):响应式、可搜索的 API 文档。
- <[URL]https://baiyun1123.github.io/YvLink/[/URL]>:由 GitHub Actions 自动部署的在线 API 文档。
公开演示管理地址:<[URL]https://mc.lic6.top[/URL]>
## 生产部署
Ubuntu 24.04 的详细构建与验收流程见 [`BUILD_UBUNTU24.md`](BUILD_UBUNTU24.md)。推荐布局:
```text
/opt/mc-proxy/mc-proxy
/etc/mc-proxy/config.toml
/etc/mc-proxy/admin.env
/etc/systemd/system/mc-proxy.service
```
创建令牌文件:
```sh
sudo install -d -m 0750 /etc/mc-proxy
sudo sh -c "umask 077; printf '%s\n' 'MC_PROXY_ADMIN_TOKEN=替换为高强度随机令牌' > /etc/mc-proxy/admin.env"
```
安装并启动 systemd 服务前,请检查 [`deploy/mc-proxy.service`](deploy/mc-proxy.service) 中的用户、路径和权限是否符合你的服务器:
```sh
sudo cp deploy/mc-proxy.service /etc/systemd/system/mc-proxy.service
sudo systemctl daemon-reload
sudo systemctl enable --now mc-proxy
sudo systemctl status mc-proxy
```
常用运维命令:
```sh
journalctl -u mc-proxy -f
systemctl restart mc-proxy
nginx -t
certbot certificates
```
需要放行的端口取决于部署方式:
- `25565/tcp`:Minecraft Java 公网入口。
- `80/tcp`、`443/tcp`:Nginx HTTP/HTTPS。
- `19132/udp`:仅在配置并启用 Geyser Bedrock 入口时需要。
- `18080/tcp`:建议只监听回环地址,不在防火墙中对公网开放。
## 验证与测试
```sh
cargo fmt --check
cargo clippy --all-targets -- -D warnings
cargo test --all-targets
node --check web/app.js
```
检查运行状态:
```sh
curl -fsS [URL]http://127.0.0.1:18080/healthz[/URL]
```
## 模组与跨平台兼容边界
- 代理会保留 Forge/FML Handshake Host 中的 NUL 扩展,并透明传递后续 Fabric、Forge 和 NeoForge 数据。
- 当前能力是“薄代理”:不会终止在线模式认证,也不会生成 Velocity modern forwarding 或 BungeeCord 玩家信息。
- 白名单只是后端认证前的快速筛选,不能代替 Minecraft 在线模式身份认证。
- PROXY Protocol 只传递源/目标地址,不转换 Java 协议版本,也不代替 Velocity/Bungee 转发协议。
- Minecraft Status 健康检查只证明列表协议可用,不代表玩家可以完成认证、模组协商或进入游戏。
- Bedrock 客户端需要外部 Geyser Standalone;YvLink 本身不实现 UDP → Java 协议翻译。
详细说明:
- [`MODDED_COMPATIBILITY.md`](MODDED_COMPATIBILITY.md):原版、Fabric、Forge、NeoForge 兼容矩阵与限制。
- [`CROSSPLAY.md`](CROSSPLAY.md):Geyser/Floodgate 架构、认证方式与部署建议。
- [`tests/MODDED_MATRIX_RUNBOOK.md`](tests/MODDED_MATRIX_RUNBOOK.md):真实加载器服务端矩阵复现手册。
## 性能调优
默认每个连接的每个方向使用 32 KiB 用户态缓冲区。流量指标在数据成功写入另一端后按块累加,不必等待长连接断开。
生产调优应使用真实 Minecraft 协议客户端逐步测试 16、32、64 和 128 KiB 缓冲区,不要使用 HTTP 压测工具代替游戏协议负载。提高 `max_connections` 前,也要同步检查系统文件描述符限制、内存和后端容量。
## 许可证
YvLink 使用 [GNU Affero General Public License v3.0 only](LICENSE)(`AGPL-3.0-only`)。
- 允许个人和企业使用、修改、分发及商业化。
- 分发修改版本时,必须按照 AGPL v3 提供对应源代码并保留许可证声明。
- 如果修改后的版本通过网络与用户交互,必须向这些用户免费提供该版本的对应源代码。
- `YvLink` 项目名称和图标不因本软件许可证而授予商标使用权。
---
[/MD]