TURN(已验证 443/TCP 可用)升级到"生产安全版"。目标是:
不再使用固定用户名/密码(防盗用带宽)
支持 turns(TLS)(更稳、更像生产)
降低被滥用/被打爆的风险
日志、限额、运维可控
一、必须做:改成"临时动态凭证"(REST API 方式)
现在用的是静态:
lanz / QAZ123
这在生产上很容易被抓包滥用。正确做法是 coturn 用 use-auth-secret,客户端每次通话前从你的业务后端拿一个 短有效期 TURN 凭证(比如 10 分钟)。
1)修改 /etc/turnserver.conf
把 user=lanz:QAZ123 删掉,换成:
bash
# === 基本监听 ===
listening-ip=123.129.219.235
listening-port=443
# 生产建议:保留 3478 作为备用也行,但你现在已证明 443 更稳
# alt-listening-port=3478
realm=im.com
server-name=im.com
external-ip=123.129.219.235
relay-ip=123.129.219.235
fingerprint
lt-cred-mech
# === 动态凭证(核心)===
use-auth-secret
static-auth-secret=请换成一段至少32位随机字符串(非常重要)
# === 端口范围(你已开放)===
min-port=49152
max-port=65535
# === 安全与稳定 ===
stale-nonce
no-multicast-peers
no-loopback-peers
# (可选)禁 IPv6(你前面已用 no-ipv6 配置项)
no-ipv6
# === 日志 ===
log-file=/var/log/turn.log
simple-log
然后确保日志文件可写(之前踩过坑):
bash
sudo install -o turnserver -g turnserver -m 640 /dev/null /var/log/turn.log
重启:
bash
sudo systemctl restart coturn
sudo systemctl status coturn --no-pager
static-auth-secret 一定要随机、保密,泄露就等于别人能无限生成 TURN 账号。
2)后端生成 TURN 凭证(原理)
用户名一般用:expiryTimestamp:userid(或 expiryTimestamp),credential 是:
base64(hmac_sha1(static-auth-secret, username))
有效期建议 5--10 分钟。
你后端返回给 App/Web 的 ICE server 配置示例:
urls: turn:123.129.219.235:443?transport=tcp
username: :
credential:
这样抓包拿到也只能用几分钟,且你随时能换 secret 让旧凭证全部失效。
二、必须做:把 TURN 的 443/TCP 固定为主通道
已经验证:443/TCP 在手机网络下稳定。生产上建议:
客户端 优先 turn:...:443?transport=tcp
再按需加 3478(UDP/TCP)做补充(Wi-Fi 下 UDP 可能更省开销)
注意:TURN 服务器单独一台,443 不和 Nginx 冲突,我们保持这个架构。
三、强烈建议:启用 TLS(turns)
现在你日志里一直提示缺证书,生产上建议启用:
turns:你的turn域名:443?transport=tcp
1)先准备一个专用域名
建议:turn.xx.amoa.cn 指向 TURN 服务器 123.129.219.235
2)coturn 配置证书项
在 /etc/turnserver.conf 里加:
bash
cert=/etc/letsencrypt/live/turn.xx.amoa.cn/fullchain.pem
pkey=/etc/letsencrypt/live/turn.xx.amoa.cn/privkey.pem
# 可选增强
dh-file=/etc/ssl/certs/dhparam.pem
四、建议做:限额与风控(防打爆)
1)限制单用户/单 IP(建议)
coturn 支持一些配额项,你至少保留:
bash
total-quota=100
bps-capacity=0
还可以加(视你业务规模调):
bash
user-quota=5