想在自己电脑上开 Minecraft 服务器,最烦的不是开服,是让朋友连进来。

没有公网 IP,端口映射不会配,运营商还可能封端口。折腾半天,最后朋友还是连不上,挺抽象。

我这里用 WireGuard + 一台 VPS 解决。核心思路是:让家里的电脑和 VPS 先进同一个虚拟局域网,再让玩家通过 VPS 或虚拟 IP 连进来。

适用场景

这篇适合自己在家里或宿舍开 Minecraft 服务端,但朋友从外网连不进来的情况。

  • 没有公网 IP,或者公网 IP 不稳定。
  • 不想在路由器上手动做复杂端口映射。
  • 有一台能访问公网的 VPS。
  • 能接受 Minecraft 流量经过 VPS 中转。

如果你已经有公网 IP,并且端口映射能稳定工作,那可以不用 WireGuard。

两种方案

先看需求,不要上来就把所有人都拉去装 WireGuard。

方案 谁要装 WireGuard 适合谁 代价
方案 A:公网转发 只要服主装 想让朋友直接连 VPS IP 流量都经过 VPS,延迟可能高一点
方案 B:全员组网 服主和玩家都装 小圈子长期玩,想像局域网一样 每个人都要配客户端

新手建议先用方案 A。能跑起来再说,别一开始就搞复杂。

前置条件

你需要:

  1. 一台有公网 IP 的 VPS,Debian/Ubuntu 最省事。
  2. 服主电脑上装 WireGuard 客户端。
  3. VPS 防火墙和云厂商安全组放行:
    • UDP 51820
    • TCP 25565
  4. 服主电脑上能正常启动 Minecraft 服务端。

如果 Minecraft 本机都连不上,先修 Minecraft,不要怀疑 WireGuard。

最终效果

做完以后,朋友可以通过 VPS 入口连接你的 Minecraft 服务端。服主电脑和 VPS 之间用 WireGuard 组成虚拟局域网,VPS 负责把外部玩家的连接转到家里的服务器。

如果用方案 B,玩家也能加入同一个 WireGuard 网络,体验更像局域网联机。

VPS 安装 WireGuard

在 VPS 上执行:

sudo apt update
sudo apt install wireguard -y

生成服务端密钥:

sudo mkdir -p /etc/wireguard
cd /etc/wireguard
wg genkey | sudo tee privatekey | wg pubkey | sudo tee publickey

看公钥:

sudo cat /etc/wireguard/publickey

私钥别发给别人。公钥可以发。

开启转发:

sudo sysctl -w net.ipv4.ip_forward=1
sudo sed -i '/net.ipv4.ip_forward=1/s/^#//' /etc/sysctl.conf
sudo sysctl -p

方案 A:公网转发

这个方案下,朋友不用装 WireGuard。他们直接连 VPS公网IP:25565

1. 服主电脑生成密钥

打开 WireGuard 客户端,添加一个空隧道。客户端会自动生成私钥和公钥。

你只需要复制服主电脑的公钥,等会填到 VPS 配置里。

2. VPS 写配置

编辑配置文件:

sudo nano /etc/wireguard/wg0.conf

示例:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <VPS私钥>

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.0.0.2
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.0.0.2

[Peer]
PublicKey = <服主电脑公钥>
AllowedIPs = 10.0.0.2/32

10.0.0.2 就是服主电脑在 WireGuard 里的虚拟 IP。

3. 服主电脑写配置

在 WireGuard 客户端里填:

[Interface]
PrivateKey = <服主电脑私钥>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <VPS公钥>
Endpoint = <VPS公网IP>:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

这里的 PrivateKey 一般客户端已经自动填好了,不要手欠复制错。

4. 启动测试

VPS 上启动:

sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

服主电脑启动 WireGuard。

然后在服主电脑上测试:

ping 10.0.0.1

能 ping 通,说明隧道通了。

接着启动 Minecraft 服务端。朋友连接:

<VPS公网IP>:25565

如果连不上,先看 VPS 的 25565 有没有放行,再看本地防火墙有没有挡 Java。

方案 B:全员组网

这个方案更像真正的虚拟局域网。每个人都有一个 10.0.0.x 地址。

适合固定几个人长期玩。缺点也很明显:每个人都要装客户端,配置发错一个就会连不上。

1. 收集每个人的公钥

让每个玩家装 WireGuard,添加空隧道,把公钥发给你。

给每个人分一个 IP:

虚拟 IP
VPS 10.0.0.1
服主 10.0.0.2
玩家 A 10.0.0.3
玩家 B 10.0.0.4

不要重复。重复就寄。

2. VPS 配置

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <VPS私钥>

[Peer]
PublicKey = <服主公钥>
AllowedIPs = 10.0.0.2/32

[Peer]
PublicKey = <玩家A公钥>
AllowedIPs = 10.0.0.3/32

[Peer]
PublicKey = <玩家B公钥>
AllowedIPs = 10.0.0.4/32

每加一个人,就加一个 [Peer]

3. 玩家客户端配置

每个人的配置长得差不多,只是私钥和地址不同。

服主:

[Interface]
PrivateKey = <服主自己的私钥>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <VPS公钥>
Endpoint = <VPS公网IP>:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

玩家 A:

[Interface]
PrivateKey = <玩家A自己的私钥>
Address = 10.0.0.3/24
DNS = 1.1.1.1

[Peer]
PublicKey = <VPS公钥>
Endpoint = <VPS公网IP>:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

私钥必须是每个人自己的。别把同一个配置群发,真不行。

4. 连接游戏

VPS 启动:

sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

所有人启动 WireGuard 后,互相 ping 一下:

ping 10.0.0.1
ping 10.0.0.2

能 ping 通,玩家就直接连服主虚拟 IP:

10.0.0.2:25565

排错

几个常见问题:

问题 先看哪里
WireGuard 没握手 公钥、Endpoint、UDP 51820、安全组
握手了但 ping 不通 AllowedIPs、系统转发、防火墙
ping 通但进不了服 Minecraft 是否启动、TCP 25565、本机防火墙
方案 A 玩家连不上 VPS 的端口转发规则、云厂商安全组

看 WireGuard 状态:

sudo wg

latest handshake 才算连上。没有握手就别看 Minecraft,问题还在网络层。

最后

我个人建议:

  • 临时开服:方案 A。
  • 固定朋友长期玩:方案 B。
  • 不想给每个人讲配置:方案 A。
  • 想延迟低一点、也更私密:方案 B。

先跑通,再优化。网络这东西一上来就追求完美,最后大概率卡在一个很蠢的配置上。