coturn 搭建 stun / turn 服務(wù)器
分享經(jīng)驗(yàn)總結(jié),歡迎加入
簡介
STUN,首先在RFC3489中定義,作為一個完整的NAT穿透解決方案,英文全稱是Simple Traversal of UDP Through NATs,即簡單的用UDP穿透NAT。
STUN(Simple Traversal of User Datagram Protocol Through Network Address Translators),即簡單的用UDP穿透NAT,是個輕量級的協(xié)議,是基于UDP的完整的穿透NAT的解決方案。它允許應(yīng)用程序發(fā)現(xiàn)它們與公共互聯(lián)網(wǎng)之間存在的NAT和防火墻及其他類型。它也可以讓應(yīng)用程序確定NAT分配給它們的公網(wǎng)IP地址和端口號。STUN是一種Client/Server的協(xié)議,也是一種Request/Response的協(xié)議,默認(rèn)端口號是 3478。
TURN,首先在RFC5766中定義,英文全稱是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即使用中繼穿透NAT:STUN的擴(kuò)展。簡單的說,TURN與STURN的共同點(diǎn)都是通過修改應(yīng)用層中的私網(wǎng)地址達(dá)到NAT穿透的效果,異同點(diǎn)是TURN是通過兩方通訊的“中間人”方式實(shí)現(xiàn)穿透。
STUN協(xié)議在RFC5389中被重新命名為Session Traversal Utilities for NAT,即NAT會話穿透效用。在這里,NAT會話穿透效用被定位為一個用于其他解決NAT穿透問題協(xié)議的協(xié)議。它可以用于終端設(shè)備檢查由NAT分配給終端的IP地址和端口號。同時,它也被用來檢查兩個終端之間的連接性,好比是一種維持NAT綁定表項(xiàng)的?;顓f(xié)議。STUN可以用于多種NAT類型,并不需要它們提供特殊的行為。
STUN本身不再是一種完整的NAT穿透解決方案,它相當(dāng)于是一種NAT穿透解決方案中的工具。這是與RFC3489/STUN版本相比最重要的改變。
ICE跟STUN和TURN不一樣,ICE不是一種協(xié)議,而是一個框架(Framework),它整合了STUN和TURN。
coturn 搭建
鏈接:https://github.com/coturn/coturn
代碼拉取后,先安裝所需的依賴包
sudo apt-get install libssl-dev
sudo apt-get install libevent-dev
sudo apt-get install libpq-dev
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install libhiredis-dev
sudo apt-get install gcc
sudo apt-get install pkg-config
編譯 coturn
source ./configure
make -j 8
sudo make install
安裝部分截圖 安裝完成后編輯配置文件
路徑:/usr/local/etc/turnserver.conf.default
必須的配置項(xiàng),其他項(xiàng)自行百度查看
listening-port=3478 #指定偵聽的端口
external-ip=39.121.185.185 #指定云主機(jī)的公網(wǎng)IP地址
user=aaaaaa:bbbbbb #訪問 stun/turn服務(wù)的用戶名和密碼
realm=stun.xxx.cn #域名,這個一定要設(shè)置
cli-password=123456
開啟端口3478
turnserver 啟動
路徑:cd /usr/local/bin
turnserver -c ../etc/turnserver.conf
檢測 ice 穿透的在線工具
鏈接:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
測試發(fā)現(xiàn)火狐瀏覽器正常,谷歌瀏覽器不正常
Android 端使用
PeerConnection.IceServer iceServer = new PeerConnection.IceServer("turn:172.21.0.147:3478", "taxiao", "123456");
iceServers.add(iceServer);
PeerConnection.RTCConfiguration configuration = new PeerConnection.RTCConfiguration(iceServers);