树莓派申请端口转发进行联机
核心思路
树莓派不能直接代替 Box 做 NAT,但它可以做两件事:
- 通过 UPnP 给自己申请一个公网端口
- 把这个端口转发到我的 Windows 电脑上的 Minecraft 端口
最后链路就是:
朋友 -> 公网 IPv4:40000
-> Box UPnP 映射到 树莓派:40000
-> 树莓派 socat 转发到 Windows电脑:40000
-> Minecraft 世界
第一步:检查 Box 的 UPnP 是否可用
在树莓派执行:
upnpc -s
upnpc -l
如果看到类似下面内容,说明可以继续:
Found valid IGD : http://192.168.1.1:1900/ctl/IPConn
ExternalIPAddress = 公网ip
这表示:
- 树莓派成功发现了 Box 的 UPnP / IGD
- 当前公网 IPv4 已经拿到
- UPnP 服务正常
第二步:在游戏里开放局域网端口
在 Minecraft Java 里打开世界后:
- 选择“对局域网开放”
- 端口手动填:
40000
成功后游戏里会显示类似:
本地游戏已在端口 [40000] 上开启
注意:
游戏里后面如果又提示“无法获取映射 / miniupnp 服务映射”,先不用管。
因为我们现在不是依赖游戏自己去做 UPnP,而是由树莓派代做。
第三步:让树莓派通过 UPnP 给自己申请公网端口
在树莓派执行:
upnpc -e "pi-mc-proxy" -a 树莓派本地ip 40000 40000 TCP 3600
成功后会看到类似:
InternalIP:Port = 树莓派本地ip:40000
external 公网ip:40000 TCP is redirected to internal 树莓派本地ip:40000
这表示:
- 公网
公网ip:40000 - 已经映射到树莓派
树莓派本地ip:40000
第四步:在树莓派安装 socat
socat 用来做 TCP 转发。
安装命令:
sudo apt update
sudo apt install -y socat
第五步:让树莓派把 40000 转发到 Windows 电脑 40000
前台测试方式
sudo socat TCP-LISTEN:40000,reuseaddr,fork TCP:电脑ip:40000
如果终端里“看起来没反应”,这是正常现象。
它并不是卡死,而是在前台等待连接。
后台运行方式(推荐)
如果想让它在后台运行:
nohup sudo socat TCP-LISTEN:40000,reuseaddr,fork TCP:电脑ip:40000 >/tmp/mc-proxy.log 2>&1 &
查看是否监听成功:
ss -lntp | grep 40000
查看日志:
tail -f /tmp/mc-proxy.log
第六步:让朋友连接
朋友在 Minecraft 里直接填:
公网ip:40000
最后测试成功,朋友已经可以连上。
成功的关键点总结
这次成功的核心不是“让游戏自己 UPnP 成功”,而是:
1. 让树莓派给自己开公网口
而不是给 Windows 电脑开。
2. 统一端口
这次最终统一使用:
- 游戏监听端口:
40000 - 树莓派监听端口:
40000 - 公网映射端口:
40000
3. 用树莓派做中转
最终链路是:
公网 40000 -> 树莓派 40000 -> Windows 40000
我实际踩过的坑
坑 1:一开始以为应该用 25565
最开始按常规思路想用默认端口 25565,但实际我这里是:
- 游戏里手动开放的是
40000 - 所以树莓派转发也必须改成
40000
如果端口不一致,就会连不上。
坑 2:socat 看起来像卡住
其实不是卡住,而是在监听。
比如这条命令:
sudo socat TCP-LISTEN:40000,reuseaddr,fork TCP:电脑ip:40000
执行后终端停在那里是正常的。
坑 3:游戏提示 miniupnp 映射失败
这个提示不代表不能联机。
这里只是说明:
- Minecraft 自己尝试请求路由器开映射失败了
但因为我已经让树莓派来完成这件事,所以这个报错可以忽略。
快速复用步骤(以后再开服时)
以后再想开一次,按这个顺序就行:
A. 在 Windows 电脑里打开世界并指定端口
例如:
40000
B. 在树莓派申请映射
upnpc -e "pi-mc-proxy" -a 树莓派ip 40000 40000 TCP 3600
C. 在树莓派启动转发
nohup sudo socat TCP-LISTEN:40000,reuseaddr,fork TCP:电脑ip:40000 >/tmp/mc-proxy.log 2>&1 &
D. 朋友连接
公网ip:40000
如果连不上,按这个顺序排查
1. 检查游戏是不是已经真的开放到 40000
看游戏聊天栏有没有这句:
本地游戏已在端口 [40000] 上开启
2. 检查树莓派是不是还在监听 40000
ss -lntp | grep 40000
3. 检查 UPnP 映射是否还在
upnpc -l | grep 40000
4. 检查树莓派能不能访问到你的电脑 40000
nc -vz 192.168.1.174 40000
5. 检查 Windows 防火墙
如果 Windows 防火墙没放行对应端口,树莓派即使转发过去也会失败。
发表回复