常見問題
關於NAT,ICE,STUN,TURN
什麼是NAT?
網絡地址轉換(Network Address Translation,NAT)是一種對網絡中機器的私有IP地址進行隱藏的機制。這種NAT機制通常存在於所有類型的網絡設備中,從家庭路由器到成熟的公司防火牆。在所有情況下,效果都是一樣的:NAT內的機器不能從外部自由訪問。
NAT對WebRTC通信的影響是非常負面的:網絡內的機器將能夠向外部發送數據,但它們將無法從位於網絡外的遠程端點接收數據。爲了滿足這一需要,NAT設備通常允許配置NAT綁定以允許數據從網絡外部進入;創建這些NAT綁定就是所謂的NAT遍歷,也稱爲“打開端口”。
什麼是ICE?
交互式連接建立(ICE)是一種用於NAT穿越的協議。它定義了一種技術,允許兩個端點之間的通信,其中一個在NAT內部,另一個在NAT外部。ICE進程的淨效果是,NAT將保留所有需要的端口以供通信,並且兩個端點都將擁有有關IP地址和可以聯繫另一個端點的端口的完整信息。
ICE不能獨立工作:它需要使用名爲STUN的助手協議。
什麼是STUN和TURN?
Session Traversal Utilities for NAT(STUN)是一個實現ICE的協議,用於解決NAT穿透問題。任何端點都可以使用它來確定NAT分配給它的IP地址和端口。它還可以用來檢查兩個端點之間的連接,並作爲一個保持活動的協議來維護NAT綁定。STUN與許多現有的NAT一起工作,不需要任何特殊的行爲。
Traversal Using Relays around NAT(TURN)是STUN的一個擴展,在NAT安全策略過於嚴格且無法成功創建所需的NAT綁定的情況下使用。在這些情況下,主機必須使用充當通信中繼的中間節點的服務。
注意
Turn是Stun的擴展。這意味着,如果您已經在使用TURN服務器,則不需要配置STUN服務器。
什麼時候需要STUN?
NAT後面的每個端點都需要STUN。所有使用NAT的對等方都需要打開自己的NAT端口,通過使用NAT之外的STUN服務器進行NAT穿透。
如果要在NAT環境中安裝Kurento(例如,如果服務器位於NAT防火牆之後),則需要使用STUN或TURN服務器,並在/etc/Kurento/modules/Kurento/WebRtcEndpoint.conf.ini中適當配置KMS。除此之外,您還需要打開雲提供商安全組中的所有UDP端口,因爲STUN/TURN將使用整個0-65535範圍內可用的任何端口。
類似地,NAT後面的所有能瀏覽的端點都需要配置STUN和/或TURN服務器詳細信息在 RTCPeerConnection constructor的iceServers字段。
讓我們用一個例子來看看:Kurento媒體服務器的典型安裝場景是在應用服務器和客戶機之間有一個嚴格的分隔。KMS和Application Server運行在雲主機上,沒有任何NAT或端口對傳入連接的限制,而瀏覽器客戶端運行在任何(可能是受限制的)網絡上,該網絡禁止任何未事先“打開”的端口上的傳入連接。客戶機可以與應用服務器通信以進行信令,但在一天結束時,大部分通信是在瀏覽器的WebRTC引擎和KMS之間完成的。
在這種情況下,客戶端能夠向KMS發送數據,因爲它的NAT將允許傳出數據包。但是,KMS將無法向客戶端發送數據,因爲客戶端的NAT對於傳入的數據包是關閉的。這可以通過配置客戶端使用一些STUN服務器,然後使用STUN協議在NAT中打開適當的端口來解決。執行此操作後,客戶端現在可以從KMS接收音頻/視頻流:
這個過程叫做ICE。
請注意,您也可以在NAT防火牆後面部署KMS,只要KMS本身也配置爲按照相同的過程(同樣,使用NAT之外的STUN服務器)打開自己的NAT端口。
註釋:TURN是STUN的補充。這意味着,如果您已經在使用TURN服務器,則不需要配置STUN服務器。
How to install Coturn?
Coturn是一個STUN服務器和(可選)TURN中繼,支持ICE協議所需的所有功能,並允許在位於NAT後面的主機之間建立WebRTC連接。
Coturn可以直接從Ubuntu包存儲庫安裝
sudo apt-get update && sudo apt-get install --no-install-recommends --yes \
coturn
1、編輯文件 /etc/turnserver.conf 並根據需要配置服務器。
此基本配置是一個很好的第一步;它將用於將Coturn與Kurento Media Server一起用於WebRTC流,修改參考:
listening-device=enp216s0f0
listening-port=3478
listening-ip=192.168.1.12
relay-ip=192.168.1.12
relay-device=enp216s0f0
external-ip=210.22.120.139/192.168.1.12
Verbose
lt-cred-mech
realm=testrealm
user=gmt:avsgm
stale-nonce=600
cert=/etc/turn_server_cert.pem
pkey=/etc/turn_server_pkey.pem
log-file=/var/log/turnserver/turnserver.log
simple-log
no-loopback-peers
no-multicast-peers
pidfile="/var/run/turnserver.pid"
mobility
no-cli
- 在使用內部NATS的雲提供商中,外部ip是必需的,比如Amazon EC2(AWS)。寫入服務器的公共IPv4地址,如111.222.333.444。它必須是IP地址,而不是域名。
- WebRTC需要指紋、it-cred-mech和realm選項。
- 用戶參數是使用TURN中繼功能的最基本授權形式。在和字段中輸入所需的用戶名和密碼。
- 其他參數可根據需要調整。有關詳細信息,請查看Coturn幫助頁:
- https://github.com/coturn/coturn/wiki/turnserver
- https://github.com/coturn/coturn/wiki/CoturnConfig
- A fully commented example configuration file: https://raw.githubusercontent.com/coturn/coturn/master/examples/etc/turnserver.conf
2、編輯 /etc/default/coturn 文件
TURNSERVER_ENABLED=1
所以服務器作爲系統服務守護進程自動啓動。
3、配置KMS並將其指向服務器正在偵聽連接的位置。
編輯文件/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini並設置STUN或TURN參數:
stunServerAddress=<CoturnPublicIpAddress>
stunServerPort=3478
turnURL=<TurnUser>:<TurnPassword>@<CoturnPublicIpAddress>:3478
如果在KMS中只配置置STUN參數,那麼Coturn的TURN中繼能力將不會被使用。當然,如果您改爲配置整個TURN URL,那麼KMS將能夠在需要時使用Coturn服務器作爲TURN中繼。注意,TURN是STUN的擴展,所以如果您配置TURN,則不需要也配置KMS中的STUN詳細信息。
應在防火牆或雲計算機的安全組中打開以下端口:
3478 TCP和UDP。
49152-65535 UDP:根據RFC 5766,這些是TURN服務器用來交換媒體的端口。可以使用Coturn的min port和max port參數更改這些端口。
注意
STUN協議不限制可能使用的端口範圍,因此在默認配置下,您應該打開所有UDP端口。但是,可以編輯文件/etc/kurento/modules/kurento/BaseRtpEndpoint.conf.ini並限制kurento媒體服務器使用的端口範圍。這樣可以減少服務器中打開的端口集。
4、最好, start the Coturn server and the media server:
sudo service coturn start
sudo service kurento-media-server restart
5、務必使用下的鏈接檢查你的安裝是否成功:
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/