Centos 上搭建 stun-server、turn-server
- WebRTC
- 2024-03-29
- 56热度
- 0评论
整个webrtc系列,其实搭建 iceserver 是最为麻烦的,为什么这么说呢,其实如何搭建,网上一搜一大把,你根据文章去实操,也没有问题,但是实际应用起来,就是不能用。
一、stunserver、turnserver、iceserver 是什么?(实际上,你可以这样理解 stunserver+turnserver 构成 iceserver)
ICE:(Interactive Connectivity Establishment)是一种框架和协议,用于在网络中建立可靠的实时通信连接。ICE并不是单独的服务器,而是一种方法,它可以利用STUN(Session Traversal Utilities for NAT)和TURN(Traversal Using Relays around NAT)服务器来实现其目标。实际上ice是一个综合解决方案,它整合了STUN和TURN的功能。ICE通过在不同网络条件下选择最佳的连接路径,以确保最可靠和高效的通信。
STUN服务器:用于解决NAT(网络地址转换)引起的连接问题。STUN协议允许客户端发现其在NAT后的公共地址和端口,从而直接通信成为可能。
TURN服务器:用于在两个端点无法直接通信时提供中继服务。TURN服务器充当一个中继,将数据传输给两个端点,以解决NAT等问题。
其实很好理解,比方说我们两台电脑需要进行p2p通信,如果两台电脑再同一局域网,那直接就通信了,没有问题。
但是如果两台电脑再不同局域网,那么该怎么通信呢?我怎么能访问到另外一台电脑呢?它又不是服务器,我也不知道它的公网ip!
那么没有问题,STUN服务器来帮忙,他做的事情就是这个,它作用就是找到两台电脑【当然也可以是手机】的公网ip,然后两台电脑就可以通过公网ip地址,相互访问了。
问题又来了,它如果找不到公网ip怎么办? 这就是TURN服务器要干的事情了,没办法,那就只能让TURN服务器中转一下,注意,如果走到这一步,是要消耗服务器流量的。
二、具体搭建步骤
搭建stun-server和搭建turn-server,上来我们认为要搭建两个,实际上,可以用coturn解决问题, Coturn不仅仅是一个TURN服务器,还包括了STUN的功能,允许客户端发现其在NAT后的公共IP地址和端口,简而言之,只需要搭建一个就可以。
1.下载安装coturn:
脚本如下:
①更新系统: yum update
②安装Coturn: yum install coturn
③启动Coturn服务: systemctl start coturn
④确保Coturn开机启动: sudo systemctl enable coturn
⑤如果有防火墙,确保打开相应的端口:
firewall-cmd --zone=public --add-port=3478/udp --permanent
firewall-cmd --reload
2、处理证书问题:
coturn安装成功后,打开配置文件,我的是默认安装到了/etc/coturn下,配置打开如下【无用部分已排除】:
#listening-device=eth0
#listening-port=3478
#tls-listening-port=5349
#alt-listening-port=0
#alt-tls-listening-port=0
#listening-ip=172.17.19.101
#listening-ip=10.207.21.238
#listening-ip=2607:f0d0:1002:51::4
#relay-device=eth1
#relay-ip=172.17.19.105
#relay-ip=2607:f0d0:1002:51::5
#external-ip=60.70.80.91
#external-ip=60.70.80.91/172.17.19.101
#external-ip=60.70.80.92/172.17.19.102
#relay-threads=0
# Lower and upper bounds of the UDP relay endpoints:
# (default values are 49152 and 65535)
#min-port=49152
#max-port=65535
#user=username1:password1
#cert=/etc/pki/coturn/public/turn_server_cert.pem
#pkey=/etc/pki/coturn/private/turn_server_pkey.pem
#realm=mycompany.org
安装coturn后,cert和pkey是注释状态,但是实际上,这个是不能注释的,否则运行时,会报错,报证书找不到。
①安装依赖: yum install -y make gcc gcc-c++ wget openssl-devel libevent libevent-devel openssl git
②生成证书:openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
上面两个脚本执行后,/etc文件夹下,会有两个文件,turn_server_cert.pem以及turn_server_pkey.pem,将cert以及pkey配置为上面两个文件的地址。

3、处理各个ip以及端口的配置
listening-ip配置为0.0.0.0即可,这样会监听所有的ip请求
relay-ip配置为服务器的外网ip地址
external-ip 配置为服务器的外网ip地址
listening-port=3478 保持原有配置即可
4、配置用户名密码以及域标识
创建用户名密码以及域标识的格式如下:
turnadmin -a -u [用户名] -p [密码] -r [域标识]
我这里执行:
turnadmin -a -u wjc -p 123456 -r turn.zilv.cn
相当于创建了一个wjc的用户名,密码为:123456,域标识为turn.zilv.cn
以上创建好后,再次更新turnserver.conf文件如下:
user=wjc:123456
realm=turn.zilv.cn
三、测试
可以采用谷歌提供的在线测试工具进行:

四、将配置放到demo中
原来的配置都不用变,将自己的iceserver配置进去就可以了,如下图:

五、总结
最后还是提示下容易出问题的点,大家可以对号入座,作为重点排查对象:
1、ip设置的正确吗
2、用户名密码有没有用账号密码创建?我就是没有创建,直接想当然的的配置了,主要,要用脚本创建了用户名密码才可以
3、udp以及tcp端口放开了吗?我当时是udp再阿里云后台没有放开,所以一直不通,找了好久才发现这个隐蔽的问题
4、证书配置了吗?也是需要用脚本配置的哦
六、docker 部署 coturn
docker run -d --network=host --name coturn --restart=always \
-e DETECT_EXTERNAL_IP=yes \ #自动检测external-ip
-e DETECT_RELAY_IP=yes \ #自动检测relay-ip
-p 3478:3478/tcp -p 3478:3478/udp \ #指定stun和turn的监听端口,默认3478
-p 5349:5349/tcp -p 5349:5349/udp \ #stun和turn的tls监听端口,实际上tls会话也能连接3478端口,同时保持3478和5349是为了满足RFC 5766规范,这个端口不映射貌似也可以。
-p 49160-49170:49160-49170/udp \ #这些端口是用来在turn模式下交换媒体数据的,端口范围自行指定即可,一般没啥大需要范围填小点。
-v /root/docker/coturn/turnserver.conf:/etc/coturn/turnserver.conf \
coturn/coturn
turnserver.conf:
# 设置 TURN 服务器的监听端口
listening-port=3478
tls-listening-port=5349
# relay-ip=x.x.x.x
# external-ip=39.81.175.133
# 使用长时间凭据机制
lt-cred-mech
# 启用 fingerprint 支持,增加安全性
fingerprint
# 启用认证
use-auth-credential
# turn用于认证的用户名和密码
user=mabokai:123456
# 公网IPv4地址对应的域名
realm=home.mabokai.ltd
# 指定端口范围
min-port=49160
max-port=49170
七、参考
RTCMultiConnection:https://github.com/muaz-khan/RTCMultiConnection
Socket.io Signaling Server:https://github.com/muaz-khan/RTCMultiConnection-Server
coturn:https://github.com/coturn/coturn
使用docker基于coturn搭建自己的stun服务器:https://zhuanlan.zhihu.com/p/693196233

鲁ICP备19063141号
鲁公网安备 37010302000824号