单一 IP 多 TeamSpeak 服务:使用 TSDNS 和 Docker 实现各端口的独立域名访问

通过 TSDNS 为同一服务器上的多个 Docker 化 TeamSpeak 实例分配独立域名

发布于
作者是 GEMILUXVII · 收录在 TeamSpeak · 标签 techdockerteamspeak · 约 6 分钟阅读 · 这里是

前言#

在服务器上部署多个 TeamSpeak 3 服务器后,我们需要绑定不同的域名到每个服务器时,就会发现一个问题:似乎没有什么办法来保证简洁直接的域名显示,总是有这样那样的端口后缀。而 TeamSpeak 3 自带的 TSDNS 便可解决这个问题,部署方便、配置简单,可以将完全不同的域名指向同一服务器的不同端口(对外售卖 TeamSpeak 服务器的商家也是这么做的)。

如果尚未部署多个实例,可以先阅读:基于 Docker 在服务器上部署多个 TeamSpeak 服务器

1. 前置条件#

  • 主机环境: 拥有公网 IPv4 地址的 Linux 服务器
  • 域名: 一个可由您管理的有效域名
  • 软件依赖: 服务器已安装 Docker Engine
  • 基础知识: 掌握基本的 Linux Shell 操作及 Docker 命令

2. 架构规划与解析流程#

在部署之前,必须明确整个解析流程。当 TeamSpeak 客户端尝试连接一个域名时,其解析顺序如下:

  1. TSDNS SRV 查询: 客户端首先查询 _tsdns._tcp.example.com 的 SRV 记录
  2. TSDNS 服务连接: 如果 SRV 记录存在,客户端会连接到记录指向的 TSDNS 服务器(在我们的架构中,即 ts-dns Docker 容器的 41144 端口)
  3. 应用层解析: 客户端向 TSDNS 服务发送其尝试连接的原始域名(例如 game1.example.com
  4. 配置文件匹配: TSDNS 服务在 tsdns_settings.ini 文件中查找匹配的规则,并返回对应的 IP:端口
  5. 语音服务连接: 客户端使用从 TSDNS 获取的最终地址,向目标 TeamSpeak 语音服务器发起连接

本教程将基于以下示例参数进行部署:

  • 服务器公网 IP: 123.123.123.123
  • 主域名: example.com
  • 目标映射:
    • game1.example.com123.123.123.123:9986
    • 所有其他 *.example.com123.123.123.123:9987(回退/默认)

3. TSDNS 服务部署#

此步骤将创建一个独立的 Docker 容器来运行 TSDNS 服务。

3.1 配置文件 (tsdns_settings.ini)#

此文件是 TSDNS 服务的核心,定义了域名到地址的映射规则。

  1. 在主机上创建并编辑配置文件:

    mkdir -p /opt/tsdns_config
    nano /opt/tsdns_config/tsdns_settings.ini
    
  2. 填入以下映射规则:

    # 为特定子域名 game1.example.com 指定 IP 和非标准端口 9986
    game1.example.com=123.123.123.123:9986
    *.example.com=123.123.123.123:9987
    

3.2 Docker 容器化部署#

使用以下命令创建并启动 TSDNS 服务容器:

docker run -d \
  --name tsdns-server \
  --restart unless-stopped \
  -p 41144:41144/tcp \
  -v /opt/tsdns_config/tsdns_settings.ini:/data/tsdns_settings.ini:ro \
  -w /data \
  teamspeak:latest \
  /opt/ts3server/tsdns/tsdnsserver
  • --restart unless-stopped:确保 Docker 服务重启或容器意外退出时,服务能自动恢复,保障高可用性。

  • -p 41144:41144/tcp:映射 TSDNS 服务的标准 TCP 端口。

  • -v ...:ro:以只读模式(ro)挂载主机上的配置文件。这是安全最佳实践,可防止容器意外修改主机文件。

  • -w /data:将容器的工作目录(Working Directory)设置为 /data。此举旨在匹配配置文件的挂载点,以满足 tsdnsserver 程序在当前工作目录查找 tsdns_settings.ini 的隐性依赖。

  • /opt/ts3server/tsdns/tsdnsserver:使用绝对路径执行程序,确保不受容器 PATH 环境变量的影响,是保证命令执行成功率的稳健做法。

3.3 服务状态验证#

部署后,使用 docker ps 命令检查容器状态。STATUS 列应显示为 Up ...。如果状态为 Restarting,应立即使用 docker logs tsdns-server 检查日志以诊断问题。

4. 公共 DNS 配置#

最后一步是配置公共 DNS 记录,以引导客户端发现您的 TSDNS 服务。

  1. A 记录 (地址记录) 此记录用于将目标域名解析至服务器 IP

    • 主机: @
    • 类型: A
    • 值: 123.123.123.123
  2. SRV 记录 (服务定位记录) 此记录遵循 RFC 2782 标准,用于 TSDNS 服务的自动发现

    • 服务 (Service): _tsdns
    • 协议 (Protocol): _tcp
    • 优先级 (Priority): 0
    • 权重 (Weight): 5
    • 端口 (Port): 41144
    • 目标 (Target): example.com

5. 总结#

通过上述部署,已成功构建一个动态的 TSDNS 解析服务,以供将不同域名指向同一服务器上的不同 TeamSpeak 服务器。

完成 DNS 配置后,请等待 DNS 记录在全球范围内完成传播(通常需要几分钟到数小时不等),即可开始使用您自定义的域名进行连接。

如果还需要自动创建临时频道,可以继续阅读:为多个 Docker 化 TeamSpeak 服务器部署 teamspeak-management-tools

评论