You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu Server 22.04端口转发失效求助(WireGuard连接VPS与家庭服务器转发Minecraft端口)

Ubuntu Server 22.04端口转发失效求助(WireGuard连接VPS与家庭服务器转发Minecraft端口)

你好!看你折腾了这么多iptables规则、甚至试了socat,还是卡在Minecraft的Joining world加载环节,太懂这种卡半路上的烦躁了😅 结合你给出的规则和网络信息,我猜问题大概率出在回程流量的路由/地址转换配置上——Minecraft连接需要双向通信,光把外部请求转发到家庭服务器还不够,得确保家庭服务器的返回包能正确回到VPS,再发给客户端。

先理清楚你的核心网络环境:

  • VPS:公网接口ens6(公网IP 82.165.127.112),WireGuard地址10.7.0.1
  • 家庭服务器:WireGuard地址10.7.0.2,本地内网地址192.168.178.57
  • 需求:外部访问VPS公网IP的25565端口(TCP/UDP),转发到家庭服务器的WireGuard地址10.7.0.2:25565

第一步:先清理现有混乱的规则

你现在的nat表有重复的DNAT、SNAT规则,先清干净避免冲突:

sudo iptables -t nat -F PREROUTING
sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -F OUTPUT

第二步:配置正确的DNAT转发(外部请求进VPS后转去家庭服务器)

指定VPS的公网接口ens6,只对发往公网IP的25565请求做转发,不影响WireGuard内部的访问:

# 转发TCP 25565到家庭服务器WireGuard地址
sudo iptables -t nat -A PREROUTING -i ens6 -p tcp --dport 25565 -j DNAT --to-destination 10.7.0.2:25565
# 转发UDP 25565(现在Minecraft很多场景也依赖UDP,必须加上)
sudo iptables -t nat -A PREROUTING -i ens6 -p udp --dport 25565 -j DNAT --to-destination 10.7.0.2:25565

第三步:配置POSTROUTING SNAT(确保回程流量正确返回客户端)

这是关键!家庭服务器收到请求后,源IP是客户端的公网IP,它的返回包会默认走自己的本地网关(比如家里的路由器),而不是回到VPS,导致客户端收不到回复卡在加载。我们需要把家庭服务器发往公网的流量源IP改成VPS的公网IP:

# 对WireGuard网段(10.7.0.0/24)发向公网的流量做SNAT,用VPS的固定公网IP
sudo iptables -t nat -A POSTROUTING -o ens6 -s 10.7.0.0/24 -j SNAT --to-source 82.165.127.112

如果你的VPS公网IP是动态的,可以把上面的命令换成MASQUERADE(但固定IP用SNAT更稳定):

sudo iptables -t nat -A POSTROUTING -o ens6 -s 10.7.0.0/24 -j MASQUERADE

第四步:确认FORWARD链允许转发流量

你的现有FORWARD规则已经允许10.7.0.0/24的流量和相关已建立的连接,但可以再针对性加规则确保25565的流量能通过:

# 允许公网到家庭服务器的25565 TCP/UDP流量转发
sudo iptables -A FORWARD -i ens6 -o wg0 -p tcp --dport 25565 -d 10.7.0.2 -j ACCEPT
sudo iptables -A FORWARD -i ens6 -o wg0 -p udp --dport 25565 -d 10.7.0.2 -j ACCEPT
# 允许家庭服务器返回的25565流量到公网
sudo iptables -A FORWARD -i wg0 -o ens6 -p tcp --sport 25565 -s 10.7.0.2 -j ACCEPT
sudo iptables -A FORWARD -i wg0 -o ens6 -p udp --sport 25565 -s 10.7.0.2 -j ACCEPT

额外检查点(很容易忽略!)

  • 家庭服务器的路由设置
    家庭服务器的默认网关如果是本地路由器,返回包会走本地网络出去,不会回到VPS。你可以临时加一条路由,让家庭服务器的流量优先走WireGuard回VPS:
    # 让家庭服务器所有流量走WireGuard(适合需要全流量转发的场景)
    sudo ip route add default via 10.7.0.1 dev wg0 table 100
    sudo ip rule add from 10.7.0.2 table 100
    # 或者只让Minecraft相关流量走WireGuard(更精准)
    sudo ip route add 82.165.127.112/32 via 10.7.0.1 dev wg0
    
  • WireGuard配置检查
    • VPS的WireGuard配置里,AllowedIPs要包含10.7.0.0/24,确保能接收家庭服务器的流量
    • 家庭服务器的WireGuard配置里,AllowedIPs如果是0.0.0.0/0就没问题(所有流量走WireGuard),如果是自定义网段,要包含VPS的公网IP
  • 防火墙关闭测试
    先临时关闭VPS和家庭服务器的ufw或其他防火墙,测试是否能正常连接,排除防火墙拦截的可能:
    sudo ufw disable
    

为什么你之前的规则不行?

  • 你之前的POSTROUTING规则有重复的SNAT和MASQUERADE,而且针对25565的SNAT规则是发向ens6接口,逻辑错误,应该是从WireGuard出来的流量发向公网时做SNAT
  • 你混用了家庭服务器的本地内网地址192.168.178.57和WireGuard地址10.7.0.2,VPS只能通过WireGuard的10.7.0.2访问家庭服务器,不能直接用本地内网地址(除非VPS和家庭服务器在同一个物理局域网)

现在按上面的步骤配置完,应该就能正常进入Minecraft世界了!如果还是有问题,可以再发一下WireGuard的配置文件和家庭服务器的路由表看看~

备注:内容来源于stack exchange,提问作者mankenntihn25565

火山引擎 最新活动