Minecraft 双栈网络(IPv4+IPv6) SRV解析与端口隐藏部署文档

背景

需求:将运行在 49999 端口的 Minecraft 服务器映射到对外域名 mc.blxxxxxx.cn,实现免端口号直连,并支持 IPv4/IPv6 双栈网络自动无缝切换。
当前上游资源:

  • IPv4 节点:通过内网穿透(FRP)提供,动态域名为 tbxxxx.uunat.com
  • IPv6 节点:本地宽带直连,通过 DDNS 解析到 v6.blxxxxxx.hanknovic.top

排错与原理分析

误区一:双 SRV 记录导致“假 v6”玩家卡死

最初计划配置两条 SRV 记录(分别指向 v6 和 v4,设置不同优先级)以实现回退机制。

原理释义:在 Minecraft 客户端中,当存在多条 SRV 记录时,客户端会按优先级尝试连接。但国内大量宽带/光猫下发了 IPv6 地址却未打通公网权限(即“假 v6”)。客户端本地存在 v6 地址,会死磕优先级更高的 IPv6 记录,陷入漫长的连接超时等待,无法自动回退到 IPv4。

误区二:SRV 记录目标绑定 CNAME 冲突

尝试将 FRP 穿透商提供的动态域名直接绑定到备用 SRV 记录时,出现解析大面积失效问题。
利用 Ping/测速工具测试时,看似获取到了底层固定 IP 183.147.251.81

但经穿透服务商客服核实,该穿透域名本质为 CNAME 解析。

原理释义:根据 DNS 核心规范(RFC 2782)什么是 DNS SRV 记录? | CloudflareSRV 记录的 Target(目标地址)必须直接指向能够解析出 IP 的 A 记录或 AAAA 记录,严禁指向 CNAME(别名)。强行绑定会导致严格的 DNS 服务商拒收从而使游戏客户端解析断链。

解决思路:必须剥离 CNAME 属性,通过DDNS-Go脚本提取底层真实 IPv4 地址,生成纯粹的 A 记录。

核心配置/步骤

为彻底解决 CNAME 规范冲突与假 v6 客户端假死问题,须废弃双 SRV 配置策略,转用统一域名双栈绑定(利用系统层 Happy Eyeballs 算法)

原理释义:让同一个域名(如 node 节点)同时具备 v4 和 v6 属性。操作系统底层网络在解析到此类双栈域名时,会同时向 v4 和 v6 极速发起探测连接,谁先响应就使用哪条通道。这完美绕过了 Java/Minecraft 客户端极其死板的单线等待逻辑。

1. 配置 DDNS-GO 聚合底层双栈记录

部署 ddns-go 服务,将提取出的真实 IPv4 和本地直连 IPv6,统一合并推送到自有的中转节点域名 node.blxxxxxx.hanknovic.top

在终端测试 IPv4 真实地址提取脚本:

# 执行单次 ping 探测穿透域名,通过 grep 正则精准提取 stdout 中的原生 IPv4 地址
ping -c 1 tbxxxx.uunat.com | grep -m 1 -oE '([0-9]{1,3}.){3}[0-9]{1,3}'

在 DDNS-Go Web 面板执行以下配置映射:

# IPv4 配置区
Enable: trxx # 是否启用:开启 IPv4 同步
GetType: command # 获取方式:通过执行 Shell 命令获取 IP
Command: "ping -c 1 tbxxxx.uunat.com | grep -m 1 -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'" # 执行命令:上文测试的提取脚本
Domains: node.blxxxxxx.hanknovic.top # 域名:双栈底层节点域名

# IPv6 配置区
Enable: trxx # 是否启用:开启 IPv6 同步
GetType: netInterface # 获取方式:通过物理网卡/接口获取公网 v6
Domains: node.blxxxxxx.hanknovic.top # 域名:必须与 IPv4 填写绝对一致的域名

2. 校验底层 DNS 记录池状态

登录云服务商 DNS 解析控制台,校验 node.blxxxxxx.hanknovic.top 域名是否同时成功生成 A 记录与 AAAA 记录。

告警:Proxy status(代理状态:CDN 加速接管)必须保持为“仅 DNS”,严禁开启小黄云/代理,否则七层 CDN 节点会强行拦截 49999 这种非 Web 标准端口。

3. 配置顶层单 SRV 实现端口隐藏

清理 mc.blxxxxxx.cn 下多余的试错记录,仅保留一条唯一的对外 SRV 记录,将其靶向导流至刚建好的双栈底层节点。

Type (记录类型): SRV
Name (主机记录): _minecraft._tcp.mc
Target (目标地址): node.blxxxxxx.hanknovic.top
Port (目标端口): 49999
Priority (优先级:决定主备解析顺序,单条记录可随意填写): 10
Weight (权重:相同优先级下的负载比例): 5

验证与排错

  1. 直连验证:客户端添加服务器 mc.blxxxxxx.cn,不加端口直连,校验控制台是否有对应鉴权日志接入。
  2. 边缘场景校验:寻找一台处于“假 v6”网络环境的终端发起连接。预期结果为:系统底层自动探测失败并极速丢弃 v6 通道,无缝回退至纯 v4 通道,实现秒连,不再发生 Connection timed out 等假死报错。