第一次初始化
This commit is contained in:
+245
@@ -0,0 +1,245 @@
|
||||
# Minecraft 基岩版 UDP 转发配置文档
|
||||
|
||||
## 架构
|
||||
|
||||
```
|
||||
公网玩家 (UDP 19132)
|
||||
↓
|
||||
北京VPS (salmonstill.cn)
|
||||
socat 监听 19132 → 转发到 10.0.0.2:19132
|
||||
↓ WireGuard 隧道
|
||||
旁路由 ImmortalWrt (192.168.1.199 / 10.0.0.2)
|
||||
nftables 端口转发 + SNAT
|
||||
↓
|
||||
NAS (192.168.1.188:19132)
|
||||
↓
|
||||
Minecraft 基岩版 Docker 容器
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 设备信息
|
||||
|
||||
| 设备 | IP | 系统 |
|
||||
|---|---|---|
|
||||
| 北京VPS | `salmonstill.cn` / `49.232.242.90` | Ubuntu 22.04 |
|
||||
| 旁路由 | `192.168.1.199` / WG隧道: `10.0.0.2` | ImmortalWrt 24.10 (GL-MT2500) |
|
||||
| NAS | `192.168.1.188` | 绿联云 UGOS |
|
||||
|
||||
---
|
||||
|
||||
## 第一部分:北京VPS 配置
|
||||
|
||||
### WireGuard 配置 `/etc/wireguard/wg0.conf`
|
||||
|
||||
```ini
|
||||
[Interface]
|
||||
Address = 10.0.0.1/24
|
||||
ListenPort = 51820
|
||||
PrivateKey = <北京VPS私钥>
|
||||
MTU = 1420
|
||||
|
||||
# 回包源地址转换(必须,否则公网玩家收不到回包)
|
||||
PostUp = iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
|
||||
PostDown = iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
|
||||
|
||||
[Peer]
|
||||
# 旁路由
|
||||
PublicKey = 9jPlaUhx2Dc+C5ZqJx6Iu8GtNMig3cFIoqfHg8PZbCA=
|
||||
AllowedIPs = 10.0.0.2/32
|
||||
PersistentKeepalive = 25
|
||||
```
|
||||
|
||||
> ⚠️ 不使用 iptables DNAT 转发,改用 socat 处理 UDP 转发,避免 conntrack 连接跟踪问题导致回包丢失。
|
||||
|
||||
### 开启内核转发
|
||||
|
||||
```bash
|
||||
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
|
||||
sysctl -p
|
||||
```
|
||||
|
||||
### 开放防火墙端口
|
||||
|
||||
```bash
|
||||
ufw allow 51820/udp # WireGuard
|
||||
ufw allow 19132/udp # Minecraft 基岩版
|
||||
```
|
||||
|
||||
### 启动 WireGuard
|
||||
|
||||
```bash
|
||||
systemctl enable wg-quick@wg0
|
||||
systemctl start wg-quick@wg0
|
||||
```
|
||||
|
||||
### socat UDP 转发
|
||||
|
||||
socat 监听公网 19132 端口,收到包后转发给旁路由隧道 IP,并维护连接状态确保回包正确返回。
|
||||
|
||||
创建 systemd service:
|
||||
|
||||
```bash
|
||||
nano /etc/systemd/system/mc-forward.service
|
||||
```
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Minecraft UDP Forward
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/socat UDP4-LISTEN:19132,fork,reuseaddr UDP4:10.0.0.2:19132
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
启动并设置开机自启:
|
||||
|
||||
```bash
|
||||
systemctl daemon-reload
|
||||
systemctl enable mc-forward
|
||||
systemctl start mc-forward
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 第二部分:旁路由 ImmortalWrt 配置
|
||||
|
||||
### WireGuard 接口配置
|
||||
|
||||
路径:**网络 → 接口 → 添加新接口**
|
||||
|
||||
**常规设置:**
|
||||
|
||||
| 字段 | 值 |
|
||||
|---|---|
|
||||
| 接口名称 | `WireGuard` |
|
||||
| 协议 | `WireGuard VPN` |
|
||||
| 私钥 | `<旁路由私钥>` |
|
||||
| IP 地址 | `10.0.0.2/24` |
|
||||
| 监听端口 | 不填 |
|
||||
|
||||
**防火墙设置:** 加入 `wan` 区域
|
||||
|
||||
**Peers → 添加对端:**
|
||||
|
||||
| 字段 | 值 |
|
||||
|---|---|
|
||||
| 公钥 | `n159R7bNB+tW3Br0cok2zA27Pzg2WSPTI9uQ9odOFyU=` |
|
||||
| 端点主机 | `salmonstill.cn` |
|
||||
| 端点端口 | `51820` |
|
||||
| 允许的 IP | `0.0.0.0/0` |
|
||||
| 路由允许的 IP | ✅ 勾选 |
|
||||
| 持续 Keep-Alive | `25` |
|
||||
|
||||
> ⚠️ 允许的 IP 必须设为 `0.0.0.0/0`,否则 WireGuard 会丢弃来自公网玩家 IP 的包。
|
||||
|
||||
### 端口转发配置
|
||||
|
||||
路径:**网络 → 防火墙 → 端口转发 → 添加**
|
||||
|
||||
| 字段 | 值 |
|
||||
|---|---|
|
||||
| 名称 | `Minecraft-udp` |
|
||||
| 协议 | `UDP` |
|
||||
| 源区域 | `wan` |
|
||||
| 外部端口 | `19132` |
|
||||
| 目标区域 | `lan` |
|
||||
| 内部 IP 地址 | `192.168.1.188` |
|
||||
| 内部端口 | `19132` |
|
||||
|
||||
### SNAT 配置
|
||||
|
||||
路径:**网络 → 防火墙 → NAT 规则 → 添加**
|
||||
|
||||
| 字段 | 值 |
|
||||
|---|---|
|
||||
| 名称 | `minecraft-snat` |
|
||||
| 地址族限制 | `仅 IPv4` |
|
||||
| 协议 | `UDP` |
|
||||
| 出站区域 | `lan` |
|
||||
| 目标地址 | `192.168.1.188` |
|
||||
| 目标端口 | `19132` |
|
||||
| 操作 | `SNAT - 重写为特定的源 IP 或端口` |
|
||||
| 重写 IP 地址 | `192.168.1.199` |
|
||||
|
||||
> SNAT 的作用:将转发给 NAS 的包源 IP 改为旁路由 IP,确保 NAS 的回包发回给旁路由而不是直接走主路由,避免回包路径不对称。
|
||||
|
||||
---
|
||||
|
||||
## 第三部分:NAS Docker 配置
|
||||
|
||||
使用 `network_mode: host` 避免 Docker NAT 导致的 IP 映射问题。
|
||||
|
||||
```yaml
|
||||
services:
|
||||
bedrock:
|
||||
image: itzg/minecraft-bedrock-server:2026.2.1
|
||||
container_name: mc-bedrock
|
||||
network_mode: host
|
||||
stdin_open: true
|
||||
tty: true
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
VERSION: "1.26.14.1"
|
||||
TZ: "Asia/Shanghai"
|
||||
OPS: "2535472561115036"
|
||||
volumes:
|
||||
- /volume2/ProgramsV2/minecraft:/data
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 第四部分:验证
|
||||
|
||||
### 检查 WireGuard 隧道
|
||||
|
||||
```bash
|
||||
# 旁路由
|
||||
wg show
|
||||
# 正常应有 latest handshake 和双向 transfer
|
||||
```
|
||||
|
||||
### 检查 socat 运行状态
|
||||
|
||||
```bash
|
||||
systemctl status mc-forward
|
||||
```
|
||||
|
||||
### 抓包验证完整链路
|
||||
|
||||
```bash
|
||||
# VPS 上抓 wg0,确认双向流量
|
||||
tcpdump -i wg0 udp port 19132 -n
|
||||
|
||||
# 旁路由抓 br-lan,确认转发到 NAS
|
||||
tcpdump -i br-lan udp port 19132 -n
|
||||
|
||||
# NAS 上抓包,确认收到并回包
|
||||
sudo tcpdump -i bridge0 udp port 19132 -n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排查
|
||||
|
||||
| 现象 | 排查方法 |
|
||||
|---|---|
|
||||
| WireGuard 无握手 | 检查 VPS 防火墙 51820/udp 是否开放 |
|
||||
| socat 收不到包 | 检查 ufw 19132/udp 是否开放 |
|
||||
| 旁路由收不到包 | 检查 WireGuard AllowedIPs 是否为 `0.0.0.0/0` |
|
||||
| NAS 收不到包 | 检查端口转发内部端口是否填写正确 |
|
||||
| NAS 有回包但玩家连不上 | 检查 SNAT 规则是否生效,确认 NAS 用 host 网络模式 |
|
||||
| 游戏内延迟不显示 | 检查 socat 是否正常运行,DNAT 规则是否已删除 |
|
||||
|
||||
---
|
||||
|
||||
## 扩展:新增其他 UDP 服务
|
||||
|
||||
1. VPS 新建一个 socat service,修改端口号
|
||||
2. 旁路由 LuCI 端口转发新增一条规则
|
||||
3. `ufw allow <新端口>/udp`
|
||||
Reference in New Issue
Block a user