Coturn 是一个开源的 TURN(Traversal Using Relays around NAT)服务器,主要用于网络中的 NAT 穿透,特别是在实时通讯(如 WebRTC)中,帮助客户端绕过 NAT(网络地址转换)和防火墙,建立点对点的连接。TURN 服务器通过中继数据流,确保即使在复杂的网络环境下,客户端也能顺利通信。

GitHub - coturn/coturn: coturn TURN server project
coturn TURN server project. Contribute to coturn/coturn development by creating an account on GitHub.

安装 Coturn

安装 Docker 环境

HestiaCP + Portainer:轻松管理所有 Docker 应用
安装 Docker 使用apt存储库安装 在新的主机上首次安装 Docker Engine 之前,您需要设置 Dockerapt存储库。之后,您可以从存储库安装和更新 Docker。 设置 Docker 的apt存储库。 # 添加 Docker 的 GPG 公钥: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/

配置 Docker Compose

在 HestiaCP 中新建网站配置ssl新建数据库的操作就不再赘述了。如果你是第一次看到 HestiaCP 系列教程,请点击下方链接,就能看到完整的一系列教程了。

HestiaCP - HOSTEYE

如果你打算使用 HestiaCP 的备份与恢复功能,可以将 Docker Compose 文件和持久化存储设置在网站目录下。接下来我们就以这种方式进行演示。

我们在 /home/user/web/domain/public_html/ 目录下创建一个 docker-compose.yml 文件。内容参考如下:

version: '3.7'

services:
  coturn:
    image: coturn/coturn:latest
    container_name: coturn-server
    restart: unless-stopped
    network_mode: host  # 使用主机网络,推荐这种方式提高性能
    environment:
      - DETECT_EXTERNAL_IP=yes  # 自动检测外部 IP
      - DETECT_RELAY_IP=yes  # 自动检测中继 IP
    volumes:
      - /home/user/web/domain/public_html/config/turnserver.conf:/etc/coturn/turnserver.conf  # 挂载外部配置文件
    ports:
      - "3478:3478"            # 传统TURN端口
      - "3478:3478/udp"        # UDP端口
      - "5349:5349"            # TLS TURN端口
      - "5349:5349/udp"        # TLS UDP端口
      - "50000-50100:50000-50100/udp"  # 高端口范围,用于媒体交换
    tmpfs:
      - /var/lib/coturn  # 使用tmpfs加速数据存储(推荐提高性能)
  • 自行修改UID,挂载路径等

设置数据库

coturn 支持两种数据库:MySQL 和 PostgreSQL。可以选择任意一种数据库来存储用户和会话信息。

psql-userdb="host=<host> dbname=<database-name> user=<database-user> password=<database-user-password> connect_timeout=30"
coturn/docker/postgresql/schema.sql at master · coturn/coturn
coturn TURN server project. Contribute to coturn/coturn development by creating an account on GitHub.
mysql-userdb="host=<host> dbname=<database-name> user=<database-user> password=<database-user-password> port=3306 connect_timeout=10 read_timeout=10"
coturn/docker/mysql/schema.sql at master · coturn/coturn
coturn TURN server project. Contribute to coturn/coturn development by creating an account on GitHub.
💡
无论选择 MySQL 还是 PostgreSQL,确保在启动 coturn 之前,数据库连接配置正确,并且已经执行了上述 SQL 文件,以创建所需的表结构。

设置配置文件

coturn/docker/coturn/turnserver.conf at master · coturn/coturn
coturn TURN server project. Contribute to coturn/coturn development by creating an account on GitHub.

 这是官方的默认配置文件,你需要做以下修改,例如:

# 监听的端口,用于 TURN 协议的通信(默认是 3478)
listening-port=3478

# 使用 TLS 加密的 TURN 服务端口(这里设置为 5349)
tls-listening-port=5349

# TURN 服务器为客户端分配的端口范围,用于中继数据
min-port=50000
max-port=50100

# 开启详细日志,便于调试和排错
verbose

# 启用指纹 (fingerprint),用于 TURN 消息的安全性增强
fingerprint

# 启用长期凭证机制 (Long-Term Credentials Mechanism),更安全的认证方式
lt-cred-mech

# 配置 MySQL 数据库连接,用于存储用户和会话信息
mysql-userdb="host=127.0.0.1 dbname=coturn user=coturn password=xxxxxxxxxxx port=3306 connect_timeout=10 read_timeout=10"

# 设置 TURN 服务器的域名或主机名,用于 STUN 和 TURN 请求的验证
realm=xxxxx.com

# 禁用 TLS(传输层安全性协议),意味着 TURN 服务器将不使用加密
no-tls

# 启用 syslog 日志记录,允许将日志输出到系统日志中
syslog

# 控制命令行接口 (CLI) 监听的 IP 地址,127.0.0.1 代表本地访问
cli-ip=127.0.0.1

# 控制命令行接口 (CLI) 监听的端口,默认为 5766
cli-port=5766

# 设置 CLI 接口的密码,用于登录和控制 TURN 服务器
cli-password=xxxxxxxxx

# 禁用 RFC 5780 兼容性,这通常会禁用一些旧版本 TURN 客户端的支持
no-rfc5780

# 禁用对旧版 STUN 协议的支持
no-stun-backward-compatibility

# 仅响应符合 RFC 5780 标准的请求
response-origin-only-with-rfc5780

# 禁用 TCP 中继,这将不允许通过 TCP 协议进行数据转发
no-tcp-relay
  • 请自行参考官方文档调整配置
  • 在使用 HestiaCP 配置 coturn 服务器时,需要特别注意 TLS 和 DTLS 的设置。HestiaCP 默认通过 Nginx 处理 HTTPS 请求,而 coturn 默认启用了 TLS 和 DTLS 加密协议,这可能导致冲突,从而使证书验证失败,最终导致 TURN 服务无法正常工作。

配置 NAT 后面的 TURN 服务器

如果 TURN 服务器 位于 NAT 后面,那么 NAT 网关必须有一个外部的、可公开访问的 IP 地址。

1. 配置外部 IP 地址

需要通过 external-ip 参数告诉 coturn 服务器其外部的、公开可访问的 IP 地址。配置示例如下:

external-ip=EXTERNAL_NAT_IPv4_ADDRESS
  • EXTERNAL_NAT_IPv4_ADDRESS:这是 NAT 网关的公共 IPv4 地址。这个地址会被 coturn 服务器告知客户端,以便它们可以与 TURN 服务器进行通信。

2. 配置本地 IP 地址

如果希望 coturn 仅监听 NAT 映射到外部地址的 本地地址,可以使用 listening-ip 配置项指定本地服务器的地址:

listening-ip=INTERNAL_TURNSERVER_IPv4_ADDRESS
  • INTERNAL_TURNSERVER_IPv4_ADDRESS:这是内部 IP 地址,通常是私有地址,在 NAT 后面可访问。

3. 配置 IPv6 地址

如果 NAT 网关 同时支持 IPv4 和 IPv6,并且希望 coturn 服务器能够同时宣传 IPv4 和 IPv6 地址,可以配置两个 external-ip 参数:

external-ip=EXTERNAL_NAT_IPv4_ADDRESS
external-ip=EXTERNAL_NAT_IPv6_ADDRESS

当配置外部 IPv6 地址时,请确保 coturn 服务器所在系统的 防火墙 和 网络设置 已正确配置,以便接受 IPv6 流量。同时,coturn 需要监听映射到外部 IPv6 地址 的本地 IPv6 地址,确保该配置有效。

反向代理

HestiaCP 如何反向代理?
我们知道,AAPanel反代功能非常方便,那么在HestiaCP 如何设置反向代理呢? 从官方文档能看到,HestiaCP 支持创建自定义Web 模板。 Web Templates and FastCGI/Proxy Cache | Hestia Control PanelOpen-source web server control panel.Hestia Control Panel 创建模板 首先到服务器的这个路径 /usr/local/hestia/data/templates/web/nginx 因为它们会被更新覆盖,所以要复制 default.tpl 和 default.stpl ,复制之后的文件要记得重命名成自己看的懂的。 比如,我想给运行在32000端口的qbittorrent-nox添加反代,我可以重命名成 qb.tpl 和 qb.stpl。其中,

下面是调整后的参考模版:

tpl

#=========================================================================
# Default Web Domain Template
# DO NOT MODIFY THIS FILE! CHANGES WILL BE LOST WHEN REBUILDING DOMAINS
# https://hestiacp.com/docs/server-administration/web-templates.html
#=========================================================================

server {
	listen      %ip%:%proxy_port%;
	server_name %domain_idn% %alias_idn%;
	error_log   /var/log/%web_system%/domains/%domain%.error.log error;

	include %home%/%user%/conf/web/%domain%/nginx.forcessl.conf*;

    location ~ /.well-known {
        allow all;
    }

    location / {
      proxy_pass http://127.0.0.1:3478;   
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Upgrade-Insecure-Requests 1;
    }



	include %home%/%user%/conf/web/%domain%/nginx.conf_*;
}

stpl

#=========================================================================
# Default Web Domain Template
# DO NOT MODIFY THIS FILE! CHANGES WILL BE LOST WHEN REBUILDING DOMAINS
# https://hestiacp.com/docs/server-administration/web-templates.html
#=========================================================================

server {
	listen      %ip%:%proxy_ssl_port% ssl;
	server_name %domain_idn% %alias_idn%;
	error_log   /var/log/%web_system%/domains/%domain%.error.log error;

	ssl_certificate     %ssl_pem%;
	ssl_certificate_key %ssl_key%;
	ssl_stapling        on;
	ssl_stapling_verify on;

	# TLS 1.3 0-RTT anti-replay
	if ($anti_replay = 307) { return 307 https://$host$request_uri; }
	if ($anti_replay = 425) { return 425; }

	include %home%/%user%/conf/web/%domain%/nginx.hsts.conf*;

    location ~ /.well-known {
        allow all;
    }

    location / {
      proxy_pass http://127.0.0.1:3478;   
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Upgrade-Insecure-Requests 1;
    }


	proxy_hide_header Upgrade;

	include %home%/%user%/conf/web/%domain%/nginx.ssl.conf_*;
}

包含的标签:

教程, HestiaCP, Docker

最后更新: December 16, 2024