【发布时间】:2020-09-23 07:20:35
【问题描述】:
我正在测试一个 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.92s内变成connected。
[0.074] onIceServers: [object Object],[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 在长达 60 秒内不会更改为 connected。如果我们等到大约 70 秒,状态将变为 failed。
[0.143] onIceServers: [object Object],[object Object],[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 在 2-3 秒内更改为connected。
我们对Matt进行以下测试
测试 1:IP/端口可达性
以下作品:
telnet global.turn.twilio.com 3478
这确认了到端口 3478 的传出 TCP 流量,并且 twilio 服务器没有被阻止。
测试 2:UDP 流量
我在Server 上创建了一个简单的netcat 监听器,如下所示:
nc -ul 3478
然后Matt 能够将数据包发送到此服务器,如下所示:
nc -u <SERVER_IP> 3478
这确认没有阻止到端口 3478 的传出 UDP 流量。
测试 3:StuntmanAlice 和 Bob 都能够成功执行 stun 绑定:
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
在Server 上使用stunserver --primaryport 8085 执行了相同的测试。结果是一样的。
===================
有以下关于Matt的问题:
- 如果
STUN服务器的IP和端口都可达,UDP的流量没有被阻塞,为什么stunclient请求失败? - IT 管理员需要做什么才能允许 STUN 请求?我应该问什么?
- 为什么没有通过
TURN服务器建立对等连接?我可以确认 TwilioTURN服务器工作正常。我在我的 Twilio 帐户上看到来自其他同行的流量,并且 Trickle ICE 测试here 也成功了。当STUN找不到对等点的外部 IP/端口时,TURN 不应该中继流量吗?
谢谢!
【问题讨论】:
标签: networking webrtc nat stun turn