Ubuntu中安裝TurnServer服務器

參考資料:http://www.webrtcbbs.com/forum.php?mod=viewthread&tid=139&extra=page%3D1

    http://www.blogjava.net/linli/archive/2014/10/22/418935.html

在使用WebRTC進行即時通訊時,需要使瀏覽器進行P2P通訊,但是由於NAT環境的複雜性,並不是所有情況下都能進行P2P(幾乎只能在同一局域網內進行),這時需要 TURN Server來幫助客戶端之間轉發數據。rfc5766-turn-server是一個高性能的開源TURN Server實現。以下是使用Ubuntu操作系統安裝rfc5766-turn-server:


第一步:下載安裝包

wget http://ftp.cn.debian.org/debian/pool/main/r/rfc5766-turn-server/rfc5766-turn-server_3.2.4.4-1_amd64.deb

第二步:安裝

sudo apt-get update
sudo apt-get install gdebi-core
sudo gdebi rfc5766-turn-server_3.2.4.4-1_amd64.deb
安裝完後,在/usr/share/doc/rfc5766-turn-server下有很多文檔可參考。


第三步:配置

在配置之前先生成一下TurnServer的用戶名還有密碼:

turnadmin -k -u 用戶名 -r north.gov -p 密碼


記得複製保存一下生成出來的key:0xa9c04dc63524413e8c16fa1bb04a1472

修改/etc/turnserver.conf 文件(直接將一下內容覆蓋原來的文件)

listening-ip=外網ip
listening-port=3478
tls-listening-port=5349relay-ip=外網ip
external-ip=外網ip
relay-threads=50
lt-cred-mech
user= myuserHello: 0xa9c04dc63524413e8c16fa1bb04a1472(格式:user:pass)
userdb=/etc/turnuserdb.conf
#max-bps=102400
pidfile="/var/run/turnserver.pid"
配置說明:

# TURN爲UDP和TCP的偵聽器端口(默認: 3478)。
# 注:實際上,TLS和DTLS會話可以連接到"清晰的"TCP和UDP端口,
#    如果允許配置。
listening-ip=外網ip
listening-port=3478
# TURN爲TLS的偵聽器端口(默認: 5349)。
# 注意:事實上,"清晰的"TCP和UDP會話可以連接到TLS和DTLS端口,
#      如果允許配置。
# TURN服務器"自動"識別傳輸類型。
# 實際上,兩個監聽終端點("清晰的"端和"TLS"端)是
# 對等的功能;但我們保持兩個端點來滿足RFC 5766規範。
# 對於安全的TCP連接,我們目前支持SSL的3個版本,
# 是TLS 1.0版本,1.1版本和1.2版本。
# SSL2還支持"encapculation模式"。
# 對於安全的UDP連接,我們支持DTLS版本1。
tls-listening-port=5349
# 中繼地址(本地IP地址將用於傳遞數據包的給每個端)
# 可以使用多箇中繼地址。
# 相同的IP可以用作監聽IP和繼電器IP。
# 如果沒有指定中繼IP,那麼turnserver將應用默認策略:
# 它將自行決定使用那個中繼
# 地址,並且它總是會使用客戶端套接字的
# IP地址作爲中繼的IP地址在TURN會話中(如果
# 請求的中繼地址族解決同族的客戶端套接字)。
#
relay-ip=外網ip
#
# Amazon EC2用戶:
# TURN服務器公開/私有的地址映射,假如服務器是在NAT後端。
# 在這種情況下,如果一個表單中"-X <ip>"使用一個-X,
# 然後該ip將被作爲中繼ip地址來使用。
# 這種情況只適用於一個簡單的例子,
# 當一箇中繼的地址是被使用,和沒有RFC5780功能是必需的。
# 單箇中繼地址必須通過NAT映射到外部的IP。
# 外部的IP值,假如不爲空,通過XOR-RELAYED-ADDRESS字段返回。
# 外部的IP,NAT必須直接轉發端口(轉發端口12345,
# 必須總是映射到相同的外部端口12345)。
# 在更復雜的情況下,當涉及到多個IP地址,
# 這個選項必須使用幾次,每個條目必須形
# 成"-X <public-ip/private-ip>",將所有涉及到的地址。
# RFC5780 NAT發現STUN功能正常工作,
# 如果正確的地址映射,即使TURN服務器本身是
# 在一個NAT後。
# 默認,該值爲空,並且沒有使用地址映射。
#
external-ip=外網ip
#
# 數量的中繼線程處理建立連接(除了驗證線程和偵聽器線程)。
# 如果設置爲0,那麼應用程序中繼進程在一個線程中運行,在同一
# 個線程中監聽處理(身份驗證線程仍然是一個單獨的線程)。
# 在舊系統(3.9 Linux內核之前),
# 數量的UDP線程總是一個線程監聽一個網絡端點,
# 包括輔助端點——除非設置0或1值。
#
relay-threads=50
#
# 取消使用長期證書機制。
# 默認情況下不使用憑證機制(允許任何用戶)。
# 這個選項可能使用用戶數據文件或
# PostgreSQL或MySQL或Redis來存儲用戶密鑰。
#
lt-cred-mech
#
# 鑰匙必須由turnadmin實用程序生成。鍵值取決於用戶名稱、領域和密碼:
#
# Example:
# 例子,使用以下命令:
#
# $ turnadmin -k -u ninefingers -r north.gov -p youhavetoberealistic
#
# Output: 0xbc807ee29df3c9ffa736523fb2c4e8ee
# 輸出是: 0xbc807ee29df3c9ffa736523fb2c4e8ee
#
# ('0x' in the beginning of the key is what differentiates the key from
# password. If it has 0x then it is a key, otherwise it is a password).
# ('0x'開始的關鍵是區分從密碼的關鍵。
# 如果它有0x,那麼它是一個關鍵,否則這是一個密碼)。
#
# The corresponding user account entry in the config file will be:
# 相應的配置文件中的用戶帳戶條目將:
#
#user=ninefingers:0xbc807ee29df3c9ffa736523fb2c4e8ee
# Or, equivalently, with open clear password (less secure):
#或者是這樣,明文密碼(不安全的):
#user=ninefingers:youhavetoberealistic
#
user=user:password
#
# 'Dynamic'用戶帳戶數據庫文件名。
# 只有用戶長期機制可以存儲在一個文件,短期機制不會處理選項,短期機制需要PostgreSQL或MySQL或
# Redis數據庫。
# 'Dynamic'的長期用戶帳戶在turnserver程序中動態檢查的,
# 這樣他們可以改變的在turnserver運行時。
# 默認文件名是turnuserdb.conf.
#
userdb=/etc/turnuserdb.conf
#
# 存儲進程pid的文件名。
# 默認是/var/run/turnserver.pid(超級用戶使用)
# 或者是/var/tmp/turnserver.pid
#
pidfile="/var/run/turnserver.pid"
在修改/etc/ turnuserdb.conf文件:

如果你只有一個用戶就配置下面這一句就好了,這裏的跟turnuserdb.conf配置的用戶名密碼保持一致:

myuserHello: 0xa9c04dc63524413e8c16fa1bb04a1472(格式:user:pass)
配置解釋:

#This file can be used as user accounts storage for long-term credentials mechanism.
#這個文件可以用作長期用戶帳戶存儲憑證機制。
# Keys must be generated by turnadmin utility. The key value depends
# on user name, realm, and password:
# 鑰匙必須由turnadmin實用程序生成。鍵值取決於用戶名稱、領域和密碼:
#
# Example:
# 例子,使用以下命令:
# $ turnadmin -k -u ninefingers -r north.gov -p youhavetoberealistic
# Output: 0xbc807ee29df3c9ffa736523fb2c4e8ee
# 輸出是: 0xbc807ee29df3c9ffa736523fb2c4e8ee
#
# ('0x' in the beginning of the key is what differentiates the key from
# password. If it has 0x then it is a key, otherwise it is a password).
# ('0x'開始的關鍵是區分從密碼的關鍵。如果它有0x,那麼它是一個關鍵,否則這是一個密碼)。
#
# The corresponding user account entry in the userdb file will be:
# 相應的用戶帳號在userdb文件中是:
#
#ninefingers:0xbc807ee29df3c9ffa736523fb2c4e8ee
# Or, equivalently (less secure):
#或者是這樣(不安全的):
#ninefingers:youhavetoberealistic
#
yourname:yourpsw

第四步:啓動

turnserver -L <public_ip_address> -c /etc/turnserver.conf -o -a -b/etc/turnuserdb.conf -f -r <system_domain_name>


第五步:測試

在瀏覽器訪問http://外網ip:3478,如果看到“TURN Server”,說明已經搭好了。


在WebRtc的JS客戶端中這樣寫:

iceServer = { "iceServers":[{"url": "stun:stun.l.google.com:19302" },
                             {"url":"stun: 外網ip:3478"},
                             {"url":"turn:外網ip", 
                             "credential":"0xa9c04dc63524413e8c16fa1bb04a1472","username":"myuserHello"} 
]}










發佈了194 篇原創文章 · 獲贊 736 · 訪問量 145萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章