简单介绍
CoTURN是一种流行的开源TURN服务器,而TURN(Traversal Using Relays around NAT)协议是用于帮助位于NAT或防火墙后面的设备建立通信连接
在WebRTC和某些VoIP场景中,当直接对等连接(P2P)由于网络限制无法建立时,CoTURN服务器就可以充当中继服务器,帮助数据在不同网络之间传输
下面分别介绍使用Docker安装和直接安装的两种方式
使用Docker搭建CoTURN
配置docker-compose.yml
直接使用docker compose部署启动,下面是docker-compose.yml
文件的内容
注意:提前申请好SSL证书并挂载到容器里
version: "3.4"
services:
coturn_server:
image: coturn/coturn:latest
restart: always
container_name: coturn
network_mode: host
volumes:
- /docker/coturn/turnserver.conf:/etc/coturn/turnserver.conf
- /etc/letsencrypt/live/your.domain/fullchain.pem:/etc/letsencrypt/live/your.domain/fullchain.pem
- /etc/letsencrypt/live/your.domain/privkey.pem:/etc/letsencrypt/live/your.domain/privkey.pem
其中网络模式设置为host,是因为考虑到CoTURN服务需要占用很多端口,需要进行较多的映射,host模式让容器服务可以直接使用宿主机的网络,这也是官方推荐的做法
配置turnserver.conf
turnserver.conf
包含了CoTURN服务器所需的全部配置,详细的配置选项可以参考官方Github提供的示例内容
下面是我目前使用的配置:
listening-port=3478
tls-listening-port=5349
listening-ip=0.0.0.0
external-ip=your_public_ip
server-name=your.domain
realm=your.domain
fingerprint
use-auth-secret
static-auth-secret=your_secret
cert=/etc/letsencrypt/live/your.domain/fullchain.pem
pkey=/etc/letsencrypt/live/your.domain/privkey.pem
log-file=/var/tmp/turnserver.log
min-port=49152
max-port=65535
total-quota=0
bps-capacity=0
stale-nonce
no-multicast-peers
这里面cert
和pkey
设为自己的证书和私钥,这里我是用certbot
申请后挂载到容器里的,应该也可以使用openssl req -x509 -newkey rsa:2048 -keyout /docker/coturn/turnserver_pkey.pem -out /docker/coturn/turnserver_cert.pem -days 99999 -nodes
生成自签名证书和私钥。PS:这里有一点很坑,就是一定要确保证书和私钥对所有人都有可读的权限(chmod 644 xxx.pem
),不然CoTURN无法读取就不会监听TLS端口
static-auth-secret
建议使用pwgen -s 64 1
或openssl rand -hex 32
生成认证密码
启动CoTURN服务
执行docker-compose up -d
启动服务,顺利的话可以通过netstat -antp
看到3478和5349端口都已被监听
可以使用turn:your.domain
或turns:your.domain
来连接CoTURN服务器
小结
不出意外的话,这套turnserver.conf
配置是没有问题的,我在配置好后第一时间用Matrix Synapse连接进行语音和视频通话测试是很顺利的,但是后来有一次发现莫名其妙的连接不上了,折腾了半天最后放弃了Docker直接在服务器上装了CoTURN,并调整了配置,一开始也是无法连接,最后退出重新登录了一下Matrix用户后发现竟然又行了
所以这套Docker方案应该还是可以使用的,如果出现像我一样的问题可以先尝试重新登陆一下Matrix
正是因为这样,所以有了下面这套直接在服务器安装的方案,同样是可行的
直接在服务器搭建CoTURN
安装
Debian系统直接apt install coturn
就完成了
然后通过systemctl status coturn
可以查看到coturn服务已经启动了,但是默认情况下coturn服务是由安装时创建的turnserver用户运行的,如果后面要配置SSL证书和密钥,那么turnserver用户可能由于无法读取导致TLS无法启动
所以可以考虑修改coturn服务配置为root用户,也就是修改/lib/systemd/system/coturn.service
中的用户和组为root
配置turnserver.conf
这里的配置是采用了Matrix官方的建议,与之前Docker部署时的配置不同,但应该都可以使用
use-auth-secret
static-auth-secret=your_secret
realm=your.domain
syslog
no-tcp-relay
no-multicast-peers
user-quota=12
total-quota=1200
cert=/etc/letsencrypt/live/your.domain/fullchain.pem
pkey=/etc/letsencrypt/live/your.domain/privkey.pem
重启服务
执行systemctl restart coturn
,不出意外的话就可以顺利连通了
写在最后
TURN服务器建议使用一台线路好的机器,因为要尽可能保证语音和视频通话的质量
我目前使用的是一台三网优化的香港服务器,测试连通性和通话质量都较好