尽管IP和端口已到达STUN绑定请求失败

问题描述

我正在测试一个WebRTC应用程序,该应用程序在成对的数百个对等点上都可以很好地运行,但是在一个特定的对等点上(下面的Matt)失败。考虑:

  • Alice:WebRTC应用程序可在其上运行的同级设备(位于NAT后面的家庭网络中的笔记本电脑上)
  • Bob:WebRTC应用程序可在其上运行的同级设备(公司网络中的ubuntu服务器)。
  • Matt:WebRTC应用程序无法在其上运行的同级设备(公司网络中的ubuntu服务器
  • Server:我用来模拟STUNTURN的Ubuntu 18.04 EC2实例(有关此内容的更多信息,请参见下文)

使用的STUNTURN服务器是:

stun:global.stun.twilio.com:3478
turn:global.turn.twilio.com:3478 (with credentials)

问题
AliceBob执行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     

现在,AliceMatt尝试发信号,并且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

AliceBob分别尝试使用与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服务器建立对等连接?我可以确认Twilio stunclient服务器正常工作。我在我的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服务器来检查那里发生的连接。