在自己电脑上开 Minecraft 服:EasyTier 联机实战,把 P2P、打洞和中继讲明白

想和几个朋友玩 Minecraft 整合包,我最初的想法很简单:找台云服务器,把服务端放上去。真正折腾之后才发现,小机器的内存和 CPU 扛不住整合包;我的 Windows 电脑性能更好,却没有一个朋友能直接访问的公网入口。

最后落地的方案是:我的电脑运行独立 Minecraft 服务端,朋友通过 EasyTier 连接;云服务器继续提供 HTTPS 控制台,不必替每个游戏数据包绕路。下面记录这套方案,也顺便回答我自己最开始的问题:P2P 到底是什么?“打洞”是在路由器上打了什么洞?公益节点是不是另一种 FRP?

实测环境:Windows 房主电脑、Minecraft Java 1.20.1 / Forge 47.4.0,EasyTier 2.6.4。本文的配置字段按这个版本验证;其他版本请以该版本的帮助信息为准。示例中的网络名称、密钥和公网节点地址都是占位内容。

一、先分清楚:游戏在哪台机器上运行?

Minecraft 客户端负责画面和玩家操作;独立服务端负责存档、区块、实体和游戏规则。服务端可以单独运行,房主不必打开游戏、进入单人世界再“对局域网开放”。房主自己也要玩时,再启动客户端连接它即可。

这会省去“为了给朋友开房,必须让游戏画面一直开着”的开销,但不会消除服务端本身的资源消耗。整合包里大量实体、机器和区块照样需要 CPU、内存;电脑关机或休眠,朋友也就没法继续玩。

部件 我们这里负责什么
房主 Windows 电脑 运行独立服务端,保存世界;EasyTier 在后台运行。
朋友电脑 运行相匹配的客户端和 EasyTier 联机工具。
云服务器 提供域名、HTTPS 网页和受登录保护的控制台入口。
EasyTier 公共节点 协助节点发现和连接协调;允许且有可用路径时,也可参与中继。

我们把服务端及相关程序交给 NSSM 作为 Windows 服务管理,设置开机自启。它们不会因为我关闭聊天窗口或终端而一起退出。停服仍然走正常保存流程,不能用强杀 Java 代替保存存档。

二、P2P 是什么?为什么家里的电脑不能直接被访问?

P2P 是 Peer-to-Peer,中文通常叫“点对点”。在这次联机里,可以把它理解为:朋友电脑上的 EasyTier,尽量直接和房主电脑上的 EasyTier 通信。它描述的是连接方式,不代表游戏没有服务端。Minecraft 的世界仍然由房主的独立服务端统一管理。

家用电脑常见的地址是 192.168.x.x、10.x.x.x。它们属于私有地址,朋友不能在自己家里输入你的这个地址就找到你。IPv4 网络里,家用路由器通常会做 NAT:家里的多台设备共用一个对外地址,路由器用端口和连接记录区分各自的流量。

可以把路由器想成小区门卫:你主动向外发消息时,门卫记下“谁联系了谁”,后续回复可以按记录送回来;外面突然来一个没有对应记录的请求,通常会被挡住。运营商还可能在你家路由器外面再做一层 NAT。

所以问题不是“我的电脑没有联网”,而是“对方能不能从外面建立到我的连接”。NAT 的映射方式、防火墙过滤规则和运营商网络都会影响答案。IPv6 可能提供更直接的路径,但仍然需要考虑防火墙,并不等于自动对公网开放。

三、打洞:让两边先向外联系,再尝试接上彼此

先用一个便于理解的 UDP 打洞例子来说明:

  1. 双方先联系一个可访问的公网节点。这样两边有机会发现同一组网里的伙伴,并协调尝试连接的地址。
  2. 双方尝试向对方的公网端点发送数据。各自的路由器因此可能建立或更新出站映射、过滤状态。
  3. 如果两侧网络行为允许,数据就能互相到达。连接建立后,游戏数据可以走两台电脑之间的路径。

这里的“洞”是对临时网络映射和过滤状态的比喻,不是破解路由器,也不是把家里所有端口永久开放。上面是概念说明,不是 EasyTier 每种网络情况下的逐包流程。EasyTier 会尝试可用的连接方式;直接建立连接也未必一定经过打洞,例如本来就有可达的公网地址。

打洞不是百分之百成功。某些 NAT 会针对不同目的地改变映射端口,或者严格限制来源;多层 NAT、UDP 被限制等情况也会让连接更困难。想进一步理解这些机制,可以读 RFC 5128 关于 NAT 下 P2P 通信的说明。

两种游戏数据路径:P2P 直连时朋友与房主直接通信;中继时流量经过中间节点。公共节点还可帮助双方发现彼此。
公共节点可以帮忙牵线;只有游戏数据实际走两端之间的路径时,才是我们想要的直连。

四、公益节点、P2P 和 FRP:差别在数据走哪条路

公共节点有点像介绍人:先让两个人认识,之后他们可能直接聊天;如果直接聊不通,也可能需要有人代传。提供节点发现与协调,不等于一定提供游戏流量中继。能否中继,要看节点配置、可用路径、带宽和服务规则。EasyTier 官方也允许公共节点只协助建立连接而不转发业务数据,见共享节点文档。

方式 游戏数据的典型路径 实际影响
我们原来的 FRP TCP 转发 朋友 → 云服务器 → 房主电脑 云服务器的地域、带宽和晚高峰线路会影响体验。
EasyTier P2P 直连 朋友 → 房主电脑 不必经过原来的海外游戏转发入口,但仍受双方网络影响。
EasyTier 中继 朋友 → 可用中继节点 → 房主电脑 连通性多一条机会,体验取决于中继和两段网络。

这里说的是我们部署过的 FRP TCP 转发方式,并不是说 FRP 这个项目只能做普通转发。我们实际使用了什么配置,比工具名称更重要。

我们曾经给公共节点同时配置域名和对应的 IPv4 地址,解决域名入口不可用的问题。但要记住:一个域名和它对应的 IP,仍然是同一个节点,不是两台独立备用服务器。如果那台节点本身离线,两个入口都救不了。公共节点地址也可能变化,不应把某个公益 IP 当成永久服务承诺。

直连成功后,游戏业务流量不再经那个中间节点转发,但工具仍可能保持发现、探测等连接。因此“能看到公共节点在线”和“游戏一定在走中继”不能画等号。

五、我们实际怎么连?先把三个地址记清楚

我们的部署采用 无 TUN 模式 + 本地端口转发。朋友不必把整个电脑的网络切到虚拟网卡上,而是把 Minecraft 要连接的本地端口交给 EasyTier。这和接管全部上网流量的代理不是一回事。端口转发的用途见 EasyTier 官方说明。

地址 含义 谁使用
127.0.0.1:25565 房主电脑自己的 Minecraft 服务端 房主在开服电脑上玩时直接填它。
10.77.0.1:25565 EasyTier 虚拟网络中的房主服务地址 配置在朋友工具的转发目的地里。
127.0.0.1:25566 朋友电脑上 EasyTier 提供的本地入口 朋友在 Minecraft 里填它。

127.0.0.1 永远表示“正在使用这条地址的电脑自己”。朋友填它,并不是直接访问我电脑的回环地址,而是先访问他自己电脑的 EasyTier 入口,再由工具把数据送到我这里。

朋友的 Minecraft
  → 朋友自己的 127.0.0.1:25566
  → EasyTier 虚拟网络(直连或中继)
  → 房主虚拟地址 10.77.0.1:25565
  → 房主电脑上的 Minecraft 服务端

我们没有要求朋友在游戏里输入公益节点地址。那是 EasyTier 用来组网的地址,不是 Minecraft 服务端地址。HTTPS 网页域名同样属于另一条入口,网页打开正常也不代表游戏链路正常。

六、照着搭一套:房主和朋友分别做什么

1. 房主先确保服务端在本机能玩

安装整合包要求的 Minecraft、Forge 和 Java 版本,准备好服务端文件,接受 Minecraft EULA,启动后等待日志出现 Done。然后用匹配的客户端连接 127.0.0.1:25565。本机都进不去时,先处理模组或服务端问题,不要先怀疑 P2P。

我们保留正版验证与玩家白名单,并把服务端绑定到本机回环地址。EasyTier 的服务访问白名单只允许游戏所需的 TCP 25565,避免组网伙伴顺带访问控制台等其他服务。这些是本次部署选择,不是使用 EasyTier 必须照抄的唯一做法。

2. 双方加入同一个 EasyTier 网络

从 官方 Releases 获取适合自己系统的版本。双方使用相同的网络名称与密钥,配置双方均可访问的公共节点。房主使用固定虚拟地址,朋友可以使用 DHCP 自动分配地址。官方的 无公网 IP 组网示例可以帮助理解这一步。

下面仅展示我们这套 2.6.4 配置里最关键的部分,不是完整可直接运行的配置。公共节点、监听端口、RPC 地址和其他访问限制也需要按实际环境设置。不要把占位密钥原样用于正式组网。

# 房主配置的关键字段(节选)
ipv4 = "10.77.0.1/24"
dhcp = false
tcp_whitelist = ["25565"]
udp_whitelist = []

[network_identity]
network_name = "mc-friends-example"
network_secret = "REPLACE_WITH_YOUR_OWN_LONG_RANDOM_SECRET"

[flags]
no_tun = true
enable_encryption = true
# 朋友配置的关键字段(节选)
dhcp = true

[network_identity]
network_name = "mc-friends-example"
network_secret = "REPLACE_WITH_THE_SAME_SECRET_AS_HOST"

# 注意:这是本次 EasyTier 2.6.4 使用的字段名。
[[port_forward]]
proto = "tcp"
bind_addr = "127.0.0.1:25566"
dst_addr = "10.77.0.1:25565"

[flags]
no_tun = true
enable_encryption = true

网络密钥相同才是关键,上面两处不同的英文只是提醒,实际必须换成完全一致的值。只修改 TOML 而不重启对应进程,不会让正在运行的工具自动采用新配置。Windows 防火墙如果拦截 EasyTier,还需按实际程序与监听端口配置规则,无 TUN 不代表所有权限和防火墙问题都消失了。

3. 朋友启动工具,再打开游戏

我们把经过核对的程序、配置和脚本打成一个私下分发的 ZIP。朋友完整解压到普通文件夹,运行 Start-Connect.cmd,保持工具运行,然后在 Minecraft 多人游戏里连接 127.0.0.1:25566。不玩时通过 Stop-Connect.cmd 停止工具。

这些 CMD/PowerShell 文件是我们自己的封装,不是所有 EasyTier 下载包自带的通用入口。不要在压缩包预览窗口里直接运行,也不要只发一个 EXE 就当完整安装包。我们后来补齐了官方包里的相关 DLL/驱动文件并添加缺文件检查;无 TUN 模式并不意味着每个官方附带文件都会被实际使用。

这个联机工具 ZIP 包含加入私人网络的配置,应只发给可信朋友。公开博客不附上实际网络密钥或可直接加入我们网络的工具包。

七、怎么知道连上了?按三层检查,比盯着红色报错有效

第一层:工具能不能启动

在工具目录打开 PowerShell,先运行:

.\easytier-core.exe --version

能输出版本,说明主程序至少可以执行。如果只有 CMD 的“拒绝访问”,而服务器没有新节点或游戏连接记录,问题更可能在朋友电脑本地,例如文件读取/执行权限、安全软件拦截、脚本启动失败等。此时换公益节点通常帮不上忙。

需要直接调用我们的脚本时,可以运行下面这一行。最前面的 & 不能漏:它让 PowerShell 执行引号包住的程序路径,漏掉后可能出现“意外的标记 -NoProfile”。

& "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -File ".\Connect.ps1"

第二层:EasyTier 是否发现房主

我们给朋友端的管理 RPC 绑定在本机 127.0.0.1:15890,房主端是 127.0.0.1:15889。朋友在工具目录执行:

.\easytier-cli.exe -p 127.0.0.1:15890 peer
.\easytier-cli.exe -p 127.0.0.1:15890 route
  • 如果只有 Local 那一行,说明此刻没有看到远端节点;先查公共节点是否能连接、名称和密钥是否一致。
  • 看到公共节点,仅说明这一段连接建立了;还要找房主的虚拟地址 10.77.0.1。
  • 在朋友端查看房主那一行及对应路由。不要把公共节点那一行的 p2p 当成和房主直连的证据。
  • 在这个版本中,peer 的 p2p 表示与该节点直接相连;结合 route 判断到目标的路径。显示 tcp 或 udp 是隧道传输协议,不能只靠它判断是否中继。

我们曾用命令临时补加可用节点,让工具重新找到房主;之后把备用入口写回启动配置,才避免“这次好了,重启又坏了”。临时添加成功,不等于配置已经持久化。

第三层:Minecraft 登录是否通过

看到了房主节点,仍要检查本地转发入口和 Minecraft 登录。我们用过状态握手测试确认端口能返回服务器信息;但能看到服务器列表、能测到延迟,都不等于已经通过正版验证、白名单和模组握手。

实际排查时,我们遇到朋友自行卸载模组,导致客户端与服务端网络通道不匹配。调整的是模组包,不是 P2P。Minecraft 不会因为你加入服务器就自动把整合包所有 Mod 安装好,朋友仍需提前准备匹配版本。

另一次,房主自己的 127.0.0.1:25566 转发入口超时,但直接连 127.0.0.1:25565 正常。房主就在开服电脑上,直接走本机服务端即可,朋友继续使用各自的 25566 入口;这个处理没有证明所有人的 P2P 链路都存在同一种故障。

日志还出现过 Quark 获取赞助者信息超时。这种后台外部信息请求失败,不能直接当作进服失败原因。应该对照同一时间的连接、身份验证和断开日志,而不是看到一个 ERROR 就删除模组。

另外,/tp 被拒绝通常属于游戏权限问题,不是网络不通。给 OP 会同时开放更多管理能力;如果只希望朋友互相传送,可以另行设计受限传送或请求同意机制,不能把“能连上”和“有管理权限”混为一谈。

八、直连之后还卡,要看的是哪种“卡”

这次我们观察到过朋友与房主直接相连,也有过十几毫秒的链路测量值。但这是当时那对设备与网络的结果,不能承诺任何人都能复现相同延迟。

  • 网络卡:延迟、丢包、抖动、房主上传带宽,以及是否绕经中继,都值得看。房主同时上传大文件,也可能影响所有玩家。
  • 服务端卡:新区块生成、模组机器或大量实体让主线程忙不过来。即使直连,TPS 下降时游戏依然会卡。
  • 客户端卡:帧率低、显卡压力大或本地内存不足。换一条网络路径不会自动提高 FPS。

“服务器有 4 GB 内存,能不能开?”只能结合具体整合包和负载评估。把服务端搬到自己的电脑,只是换用了更合适的资源;P2P 本身不负责节省游戏计算。我们同时在受登录保护的控制台里展示 EasyTier 当前节点、线路和延迟,排查时更容易分清人是没入网,还是入网后进不了游戏。

九、给朋友的一张联机检查清单

  1. 安装和服务端匹配的 Minecraft、Forge 与模组包。
  2. 完整解压私人联机工具,先停止旧版本,再启动新版。
  3. 确认 EasyTier 能看到房主,而不只是公共节点。
  4. 在 Minecraft 填 127.0.0.1:25566;房主在开服电脑上填 127.0.0.1:25565。
  5. 失败时先记下时间和完整断开提示,再对照工具节点、路由与服务端日志。
  6. 只分享必要诊断结果,不公开带密钥的配置和未经检查的原始日志。

这套方案最有价值的地方,是把职责分开了:电脑负责跑世界,网页负责管理,EasyTier 尽量找到两台电脑之间可用的路径。公益节点帮助连接,直连成功时不必让所有游戏数据绕到远处;直连失败时,也要接受中继受节点规则和网络条件限制的现实。

参考与延伸阅读

Leave a Reply 0

Your email address will not be published. Required fields are marked *