Coturn 是一个开源的 TURN(Traversal Using Relays around NAT)服务器,主要用于网络中的 NAT 穿透,特别是在实时通讯(如 WebRTC)中,帮助客户端绕过 NAT(网络地址转换)和防火墙,建立点对点的连接。TURN 服务器通过中继数据流,确保即使在复杂的网络环境下,客户端也能顺利通信。
安装 Coturn
安装 Docker 环境
配置 Docker Compose
在 HestiaCP 中新建网站,配置ssl,新建数据库的操作就不再赘述了。如果你是第一次看到 HestiaCP 系列教程,请点击下方链接,就能看到完整的一系列教程了。
如果你打算使用 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"
mysql-userdb="host=<host> dbname=<database-name> user=<database-user> password=<database-user-password> port=3306 connect_timeout=10 read_timeout=10"
设置配置文件
这是官方的默认配置文件,你需要做以下修改,例如:
# 监听的端口,用于 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 地址,确保该配置有效。
反向代理
下面是调整后的参考模版:
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_*;
}