树莓派申请端口转发进行联机


核心思路

树莓派不能直接代替 Box 做 NAT,但它可以做两件事:

  1. 通过 UPnP 给自己申请一个公网端口
  2. 把这个端口转发到我的 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 防火墙没放行对应端口,树莓派即使转发过去也会失败。