rfc5766-turn-server規(guī)范
rfc5766-turn-server是谷歌推薦的turn開源項(xiàng)目路呜,經(jīng)常作WebRTC的服務(wù)器端使用赞草。 該開源項(xiàng)目是包含TURN與STUN功能于一體离赫,默認(rèn)TURN與STUN監(jiān)聽端口為3478滥玷。
支持tcp, udp, tls, dtls 連接.tls為基于TCP的安全層傳輸協(xié)議,dtls為基于udp的安全傳輸層協(xié)議床估。
注意:TLS和DTLS需要安裝證書弯囊。
TURN specs:
RFC 5766 - base TURN specs
RFC 6156 - IPv6 extension for TURN
Experimental DTLS support as client protocol.
STUN specs:
RFC 5389 - base "new" STUN specs
RFC 5769 - test vectors for STUN protocol testing
RFC 5780 - NAT behavior discovery support
RFC 3489 STUN1
典型的TURN與client通信流程如下:
1.客戶端發(fā)送一個(gè)不帶證書的allocate請求痰哨,服務(wù)器返回401錯(cuò)誤。
2.客戶端發(fā)送一個(gè)帶long-term credential(長期證書匾嘱,服務(wù)器配置文件user字段定義)的allocate請求斤斧,服務(wù)器接收請求,并返回分配的轉(zhuǎn)發(fā)地址霎烙。
3.客戶端定期發(fā)送refresh包撬讽,證明自己的存在。
coturn搭建
webrtc適用配置文件:
鏈接:https://pan.baidu.com/s/1oj9zn6q4eE90QBsg0qAbGg 密碼:1vur
安裝依賴項(xiàng)
1.sudo apt-get install libssl-dev
2.sudo apt-get install libevent-dev
3.sudo apt-get install libpq-dev
4.sudo apt-get install mysql-client
5.sudo apt-get install libmysqlclient-dev
6.sudo apt-get install libhiredis-dev
其中SQL相關(guān)的依賴項(xiàng)可能會失敗悬垃,不過這也沒什么大不了的游昼,SQL庫是為了支持更多用戶而準(zhǔn)備的,如果你不是生產(chǎn)環(huán)境的話尝蠕,忽略也行烘豌。
檢出代碼
從https://code.google.com/p/rfc5766-turn-server/source/checkout 到任意目錄,我檢出到了stun看彼,下文腳本請注意自行對號入座廊佩。cd進(jìn)去
開始編譯
生成makefile文件,編譯靖榕,安裝
1./configure
2.make
3.sudo make install
在bin目錄下生成六個(gè)可執(zhí)行文件
turnadmin turnutils_peer turnutils_stunclient
turnserver turnutils_rfc5769check turnutils_uclient
turnserver 就是我們需要的服務(wù)器.
turnadmin 用來管理賬戶.
turnutils_stunclient 用于測試stun服務(wù)
turnutils_uclient 用于測試turn服務(wù). 模擬多個(gè)UDP,TCP,TLS or DTLS 類型的客戶端
example 目錄主要是示范如何配置和使用turn. 包含一些測試用例.
example/etc 下是pem證書和conf配置文件
example/var/db 下是sqlite的db庫. 用于示范數(shù)據(jù)庫的格式.
coturn 支持三種配置. 命令行, conf文件和數(shù)據(jù)庫. 數(shù)據(jù)庫支持sqlite, mysql, postgresql, MongoDB, redis
examples\scripts 下一些測試用例:
loadbalance 示范如何進(jìn)行負(fù)載均衡. 設(shè)置一個(gè)master turn server 然后配置若干個(gè)slave turn server.
longtermsecure 示范如何使用long-term 驗(yàn)證
longtermsecuredb 與 longtermsecure 類似, 不過是從數(shù)據(jù)庫配置
shorttermsecure 示范如何使用short-term驗(yàn)證.
restapi 示范了web方面的使用.
stun 定義了兩種驗(yàn)證方式.
Long-Term Credential
Short-Term Credential
短期證書用戶名标锄,密碼及有效時(shí)間。
長期證書包含用戶名序矩,密碼鸯绿,在整個(gè)會話周期有效。
具體可以參考stun標(biāo)準(zhǔn) http://tools.ietf.org/html/rfc5389#section-15.4
但是對于webrtc而言. 僅支持long-term .
fingerprint屬性:當(dāng)幾種協(xié)議復(fù)用相同的通信地址時(shí)簸淀,為了區(qū)分stun消息瓶蝴,可以使用fingerprint屬性,這時(shí)在stun數(shù)據(jù)包中會包含fingerprint屬性租幕。
http://www.ietf.org/proceedings/87/slides/slides-87-behave-10.pdf
TURN REST Server API
這個(gè)PDF 描述了. turn服務(wù)器和客戶端的交互流程.
簡單的使用
turnserver -o -a -f -v --mobility -m 10 --max-bps=100000 --min-port=32355 --max-port=65535
--user=ling:ling1234 --user=ling2:ling1234 -r demo
-m 10 表示啟動(dòng)十個(gè)relay線程.
當(dāng)TURN Server用于WebRTC時(shí)舷手,必須使用long-term credential mechanism, 即指定 -a 或者 --lt-cred-mech
--max-bps=100000 限制最大速度為100KB/s.
添加了兩個(gè)用戶ling 和ling2.
可以直接使用turnutils_uclient -u ling -w ling1234 來測試. turnutils_uclient 有很多參數(shù)可以配置的.
webrtc::PeerConnectionInterface::IceServer turnServer;
turnServer.uri = "turn:ip";
turnServer.username = "ling";
turnServer.password = "ling1234";
servers.push_back(turnServer);
如果從安全性方面考慮. 可以為賬戶生成key, 這樣就可以直接通過key登錄. 而不需要提供密碼.
key 通過turnadmin生成, 需要(username, password, realm) . realm是啟動(dòng)turn server時(shí)-r 參數(shù)指定的.
例如這樣:
turnadmin -k -u ling -p ling1234 -r demo
0xccba8f3a6a025a38eb4a0e795fc92705
測試
試試看是否編譯成功,先看看turnserver支持哪些功能
turnserver -h > help.txt
支持協(xié)議
測試各基礎(chǔ)協(xié)議是否支持
配置
rfc5766-turn-server是利用配置文件來定義自己的功能表現(xiàn)的劲绪,安裝完成后男窟,在下列路徑都有默認(rèn)的配置文件:
啟動(dòng)rfc5766-turn-server
sudo turnserver -c /你的路徑/turnserver.conf --daemon