问题描述
我正在测试一个WebRTC应用程序,该应用程序在成对的数百个对等点上都可以很好地运行,但是在一个特定的对等点上(下面的Matt
)失败。考虑:
-
Alice
:WebRTC应用程序可在其上运行的同级设备(位于NAT后面的家庭网络中的笔记本电脑上) -
Bob
:WebRTC应用程序可在其上运行的同级设备(公司网络中的ubuntu服务器)。 -
Matt
:WebRTC应用程序无法在其上运行的同级设备(公司网络中的ubuntu服务器) -
Server
:我用来模拟STUN
和TURN
的Ubuntu 18.04 EC2实例(有关此内容的更多信息,请参见下文)
使用的STUN
和TURN
服务器是:
stun:global.stun.twilio.com:3478
turn:global.turn.twilio.com:3478 (with credentials)
问题 Alice
和Bob
执行WebRTC信令,iceConnectionState
在0.92秒内变为connected
。
[0.074] onIceServers: [object Object],[object Object],[object Object]
[0.081] createOffer
[0.161] onAnswer
[0.17] ICE STATE: new
[0.171] onTrack
[0.234] addIceCandidate
[0.235] addIceCandidate
[0.73] addIceCandidate
...
[0.928] ICE Connected
现在,Alice
和Matt
尝试发信号,并且iceConnectionState
在长达60s的时间内都没有变为connected
。如果我们等到〜70s,状态将变为Failed
。
[0.143] onIceServers: [object Object],[object Object]
[0.147] createOffer
[0.399] onAnswer
[0.408] ICE STATE: new
[0.409] onTrack
[0.541] addIceCandidate
[0.541] addIceCandidate
...
[15.528] addIceCandidate
[76.77] ICE FAILURE: Failed
Alice
和Bob
分别尝试使用与100个其他对等方相同的代码/堆栈来发信号,并且在每种情况下,均建立了对等方连接,并且iceConnectionState
更改为{{1 }}在2-3秒内。
我们在connected
测试1:IP /端口可达性
以下作品:
Matt
这确认到端口3478的传出TCP流量并且twilio服务器未被阻止。
测试2:UDP流量
我在telnet global.turn.twilio.com 3478
上创建了一个简单的netcat
侦听器,如下所示:
Server
然后nc -ul 3478
能够按照以下方式将数据包发送到该服务器:
Matt
这确认到端口3478的传出UDP通信没有被阻止。
测试3:特技演员 nc -u <SERVER_IP> 3478
和Alice
都能成功执行眩晕绑定:
Bob
但是,root@XXXX:/# stunclient --verbosity 9 global.stun.twilio.com 3478
Resolved global.stun.twilio.com to 54.244.51.6:0
config.fBehaviorTest = false
config.fFilteringTest = false
config.timeoutSeconds = 0
config.uMaxAttempts = 0
config.addrServer = 54.244.51.6:3478
socketconfig.addrLocal = 0.0.0.0:0
Sending message to 54.244.51.6:3478
Got response (76 bytes) from 54.244.51.6:3478 on interface 10.1.13.185:47172
Other address is 54.244.51.6:3479
Binding test: success
Local address: 10.1.13.185:47172
Mapped address: 50.209.172.197:47172
未通过绑定测试:
Matt
对root@YYYYY:/# stunclient --verbosity 9 --mode full global.stun.twilio.com 3478
Resolved global.stun.twilio.com to 34.203.250.156:0
config.fBehaviorTest = true
config.fFilteringTest = true
config.timeoutSeconds = 0
config.uMaxAttempts = 0
config.addrServer = 34.203.250.156:3478
socketconfig.addrLocal = 0.0.0.0:0
Sending message to 34.203.250.156:3478
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Sending message to 34.203.250.156:3478
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Binding test: fail
Behavior test: fail
Filtering test: fail
的{{1}}执行了相同的测试。结果是相同的。
==================
关于stunserver --primaryport 8085
,存在以下问题:
- 如果
Server
服务器的IP和端口可以访问并且Matt
流量没有被阻止,为什么STUN
请求失败? - IT管理员需要做什么才能允许STUN请求?我应该问什么?
- 为什么无法通过
UDP
服务器建立对等连接?我可以确认Twiliostunclient
服务器正常工作。我在我的Twilio帐户上看到其他同伴的流量,并且Trickle ICE测试here也成功。当TURN
找不到对等方的外部IP /端口时,TURN是否应该中继流量?
谢谢!
解决方法
我有一个存在类似问题的WebRTC项目。 ubuntu数字海洋上的一个Peer无法连接。我发现的是
我不得不打开数字海洋防火墙上的端口。这些是我必须启用的端口
#+BEGIN_SRC
107 ufw allow 49152:65535/udp
108 ufw allow 3478/udp
109 ufw allow 3478/tcp
#+END_SRC
请注意,您同时需要3478
udp和tcp。以我为例,我使用的是Coturn STUN / TRUN服务器,该服务器配置为在此端口上运行
environment:
- TURN_PORT_START=49152
- TURN_PORT_END=65535
我认为这些是默认的TURN范围,但不确定turn:global.turn.twilio.com:3478
是否相同
我会检查Matt
对等端上的端口范围
也许您可能希望托管自己的TURN服务器来检查那里发生的连接。