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的WireGuard配置里,
- 防火墙关闭测试:
先临时关闭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




