WireGuard Minecraft 联机教程
想在自己电脑上开 Minecraft 服务器,最烦的不是开服,是让朋友连进来。
没有公网 IP,端口映射不会配,运营商还可能封端口。折腾半天,最后朋友还是连不上,挺抽象。
我这里用 WireGuard + 一台 VPS 解决。核心思路是:让家里的电脑和 VPS 先进同一个虚拟局域网,再让玩家通过 VPS 或虚拟 IP 连进来。
适用场景
这篇适合自己在家里或宿舍开 Minecraft 服务端,但朋友从外网连不进来的情况。
- 没有公网 IP,或者公网 IP 不稳定。
- 不想在路由器上手动做复杂端口映射。
- 有一台能访问公网的 VPS。
- 能接受 Minecraft 流量经过 VPS 中转。
如果你已经有公网 IP,并且端口映射能稳定工作,那可以不用 WireGuard。
两种方案
先看需求,不要上来就把所有人都拉去装 WireGuard。
| 方案 | 谁要装 WireGuard | 适合谁 | 代价 |
|---|---|---|---|
| 方案 A:公网转发 | 只要服主装 | 想让朋友直接连 VPS IP | 流量都经过 VPS,延迟可能高一点 |
| 方案 B:全员组网 | 服主和玩家都装 | 小圈子长期玩,想像局域网一样 | 每个人都要配客户端 |
新手建议先用方案 A。能跑起来再说,别一开始就搞复杂。
前置条件
你需要:
- 一台有公网 IP 的 VPS,Debian/Ubuntu 最省事。
- 服主电脑上装 WireGuard 客户端。
- VPS 防火墙和云厂商安全组放行:
- UDP
51820 - TCP
25565
- UDP
- 服主电脑上能正常启动 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/3210.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。
先跑通,再优化。网络这东西一上来就追求完美,最后大概率卡在一个很蠢的配置上。