ZerpTier搭配公网服务器实现内网穿透方案
在中国家宽环境下,使用 ZeroTier + 云服务器稳定搭建 Minecraft 大型整合包服务器(完整踩坑记录)
之前听过使用ZeroTier和公网服务器配网要比单纯的内网穿透要稳定,于是尝试了一下
一、背景与目标
1. 我的实际环境
- 一台闲置的家庭主机(高中时期的台式电脑) - 12代i5 + 16G RAM
- 一台云服务器(阿里云1v2g)
- 域名托管在 Cloudflare
二、为什么放弃 frp / nps?
实际上曾经尝试过frp/nps但是没有配置成功,遂放弃
服务主要用于暴露家庭主机mc端口
三、总体架构设计(最终方案)
玩家
↓ mc.example.com Cloudflare DNS(仅 DNS)
↓ 公网云服务器(阿里云)
↓ DNAT / iptables ZeroTier 虚拟局域网
↓ 家庭 Win11 主机 Minecraft Server :25565
主要耗时间的步骤是在服务端建立端口映射:通过ZeroTier内网地址,把内网主机的端口转发到自定义的公网端口,同时需要配置双向转发(在这里卡了很久)
四、ZeroTier 组网
1. 创建 ZeroTier 网络
- 官网:https://my.zerotier.com
- 创建 Network
- 记下 Network ID(用这个id可以在程序中直接加入网络)
2. 家庭主机加入网络(Win11)
官网下载ZeroTier之后会在右下角托盘显示图标,点击输入Network ID来加入网络
3. 云服务器加入网络(Debian)
有官方的安装脚本
curl -s https://install.zerotier.com | bash
zerotier-cli join <network_id>最后在控制台会发现添加到网络的设备,点进去 Authorize 然后保存,设备就成功加入网络了。
五、DNAT 转发配置
- 网络信息
- 需要知道的信息
- 服务器公网ip
- 家庭主机内网ip
这里使用演示把家庭主机mc默认的25565端口转发到服务器的34567端口上
- 关键前置条件
开启 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward关闭 rp_filter(否则回程会被丢)
for i in all default eth0 ztfl6m6fxd; do
echo 0 > /proc/sys/net/ipv4/conf/$i/rp_filter
done- iptables DNAT + FORWARD(最终可用规则)
# 清空旧规则
iptables -F
iptables -t nat -F
# DNAT:公网 34567 → 家里 25565
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 34567 -j DNAT --to-destination 10.57.33.8:25565
# 回程伪装
iptables -t nat -A POSTROUTING -o ztfl6m6fxd -j MASQUERADE
# FORWARD 去程
iptables -A FORWARD -p tcp -d 10.57.33.8 --dport 25565 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
# FORWARD 回程
iptables -A FORWARD -p tcp -s 10.57.33.8 --sport 25565 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# INPUT 放行公网端口
iptables -A INPUT -p tcp --dport 34567 -j ACCEPT
# 默认策略(排障阶段)
iptables -P FORWARD ACCEPT提示
但是挨个输指令是在是太麻烦了,实际上可以把目的和必要的信息扔给AI
并且要求他输出一整段包含调试信息,且可以直接粘贴进终端的脚本
这样子出错率低一些而且更有效率
- 抓包验证(非常关键)
tcpdump -ni eth0 tcp port 34567
tcpdump -ni <ZeroTier网卡> tcp port 25565看到 两边都有 SYN / SYN-ACK / ACK 即成功。
如果看到只有Flag S 输出的,可能是在上面配置转发有问题
六、Cloudflare DNS + SRV
minecraft支持使用SRV记录连接,这样如果服务端口不是默认25565的话也可以使用配置好的域名直接访问,更加美观
- 填写DNS记录
直接填写完整 SRV owner name
SRV记录
名称:_minecraft._tcp.<想要设置二级域名>
类型:SRV
优先级:0
权重:5
端口:34567
目标:<一个指向公网服务器地址的二级域名>.example.comA 记录(只给 target使用)
<一个指向公网服务器地址的二级域名>.example.com → A记录或者AAAA记录这里SRV的记录名称可以作为直接客户端填写的域名
比如mc.example.com
而不必要使用其他域名:端口来使用
同时SRV记录的子域名也不需要再设置一个指向服务器的主机记录了
这个时候输入mc.example.com时客户端会优先查询_minecraft._tcp.mc.example.com
进而查询到实际服务存在的域名和端口
- 验证方式
填写主机记录完需要等待一段时间才会生效
总是多试试就行
七、iptables 持久化(善后)
apt install -y iptables-persistent
iptables-save > /etc/iptables/rules.v4八、最终成果
家庭主机高性能运行整合包
公网稳定访问
不依赖 frp / nps
不暴露源站
玩家只需输入域名
当然也可以用来运行其他服务