在 NAT 的网络环境下要进行 P2P 通信的前提是进行 NAT 打洞 (NAT hole-punching),我们可以借助实现了 STUN 协议的 STUN 服务器来获取双方的地址来帮助做到打洞。但如果双方的 NAT 类型无法进行打洞(详情见我的这篇文章:P2P 的 NAT),就需要借助实现了 TURN 协议的 TURN 服务器来进行双方数据的交换。
而 ICE 协议同时使用了 STUN 协议和 TURN 协议。
我们可以使用 coturn 来方便搭建一个 ICE 服务器。
coturn
地址:https://github.com/coturn/coturn
你可以在 Linux 上直接使用包管理安装,或者使用 Docker 部署,但是在我使用 Docker 部署的时候总是失败,同时占满了我服务器的内存和 CPU 和网络,没搞懂是什么原因。所以这里我直接用 apt-get 安装。
$ sudo apt-get update
$ sudo apt-get install coturn
然后可以直接启动
$ sudo coturn
启动后它会告诉你有一些东西没有配置,比如证书等,所有的配置都默认在这个路径下:/etc/turnserver.conf
证书
首先我们配置证书。
使用 openssl
生成证书和密钥:
$ openssl req -x509 -newkey rsa:2048 -keyout /usr/local/etc/turn_server_pkey.pem -out /usr/local/etc/turn_server_cert.pem -days 99999 -nodes
证书和密钥你可以放在任何你想要的路径。然后在 /etc/turnserver.conf
中配置证书和密钥的路径:
cert=/usr/local/etc/turn_server_cert.pem
pkey=/usr/local/etc/turn_server_pkey.pem
监听端口
然后配置各种端口,也是在 /etc/turnserver.conf
中配置。
# 监听端口,0.0.0.0 即可
listening-ip=0.0.0.0
# 公网 ip
external-ip=<你的公网IP>
有些文章(CSDN)会教你配置
relay-ip=<公网IP>
,但其实你并不需要配置,或者配置为0.0.0.0
即可,(参考:Cannot Assign Requested Address - running through all the ports)。
用户名密码 realm
使用 TURN 协议需要用户名和密码,所以要配置一个。至于 realm,就是一个域名啦,指定一个域名可以让你使用域名而不知 IP 的方式来使用 ICE 服务。要注意让你的域名正确解析到你的服务器地址。
比如在这里我配置的 realm 是 turn.rustsoft.cn
。
在配置 /etc/turnserver.conf
中配置你的用户名和密码和 realm
user=<你的用户名>:<密码>
realm=<你的域名>
配置好了后重启一下 coturn,然在 这里 测试你的 ICE 服务器。
测试
如果只想测试 STUN 的话可以在 STUN or TURN URI 的输入框输入 stun:<你的 stun 服务器地址>
,点击 Add Server
,然后在下方点击 Gather candidates
测试,在显示的列表中的 Type Foundation
列中有 srflx
的话就表明 STUN 服务器正常。
如果测试 TURN 的话可以在 STUN or TURN URI 的输入框输入 turn:<你的 stun 服务器地址>
,然后在 TURN username 和 TURN password 输入框中分别输入你在先前配置的用户名和密码,点击 Add Server
,然后在下方点击 Gather candidates
测试,在显示的列表中的 Type Foundation
列中有 relay
的话就表明 STUN 服务器正常。
后台自启动
可以使用以下命令让你的 coturn 在后台运行和开机自启:
systemctl restart coturn
systemctl enable coturn
这篇博客介绍了如何使用coturn搭建ICE服务器来进行P2P通信。作者首先解释了在NAT网络环境下进行P2P通信需要进行NAT打洞,可以借助STUN服务器来获取地址来帮助打洞,但如果NAT类型无法进行打洞,则需要使用TURN服务器进行数据交换。然后作者介绍了coturn的安装和配置过程,包括生成证书和密钥、配置监听端口和用户名密码realm。最后作者提供了测试coturn服务器的方法,并介绍了如何让coturn在后台自启动。
这篇博客的闪光点在于作者提供了详细的步骤和命令来搭建coturn服务器,并给出了测试服务器的方法。这对于想要搭建自己的ICE服务器的读者来说非常有帮助。
然而,这篇博客可以改进的地方是在配置证书和密钥的部分,作者给出的命令中的路径与之前的路径不一致,可能会导致读者困惑。建议作者在给出命令时使用一致的路径。
此外,博客中没有提到如何配置coturn服务器的性能参数,例如连接数限制、带宽限制等。这些参数对于服务器的稳定性和性能非常重要,建议作者在博客中加入相关内容。
总体而言,这篇博客提供了一个清晰的指南来搭建coturn服务器,但可以通过改进路径的一致性和添加性能参数配置来进一步完善。非常感谢作者分享这个有用的教程!
这篇博客介绍了如何使用coturn搭建ICE服务器来进行NAT网络环境下的P2P通信。博文首先解释了在NAT网络环境下进行P2P通信的前提是进行NAT打洞,可以借助STUN服务器来获取双方地址来帮助打洞。但是如果双方的NAT类型无法进行打洞,就需要使用TURN服务器来进行数据交换。然后,博文介绍了ICE协议同时使用STUN和TURN协议,并推荐了使用coturn来搭建一个ICE服务器。
博文中提供了使用coturn的安装和配置步骤。首先是通过apt-get命令安装coturn,然后配置证书和密钥的路径,配置监听端口和公网IP,配置用户名密码和域名。最后,博文提供了测试coturn服务器的方法,并介绍了如何让coturn在后台自启动。
博文的闪光点在于提供了详细的安装和配置步骤,对于想要搭建自己的ICE服务器的读者来说非常实用。此外,博文还提供了测试服务器的方法,帮助读者验证服务器的正常运行。
然而,博文中存在一些可以改进的地方。首先,在安装部分,博文提到可以使用Docker部署,但作者没有提供详细的Docker部署步骤,这可能会让一些读者感到困惑。其次,在配置用户名密码和域名的部分,博文没有提供如何配置多个用户的方法,这可能会限制一些读者的使用需求。
改进空间包括提供Docker部署的详细步骤,以及提供配置多个用户的方法。此外,博文可以进一步扩展,介绍一些常见的ICE服务器的应用场景和实际案例,帮助读者更好地理解和应用ICE服务器。