【问题标题】:STUN binding request failing though IP and port are reachabe通过 IP 和端口失败的 STUN 绑定请求可访问
【发布时间】:2020-09-23 07:20:35
【问题描述】:

我正在测试一个 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.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     

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

AliceBob 每次尝试使用相同的代码/堆栈与 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:Stuntman
AliceBob 都能够成功执行 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服务器建立对等连接?我可以确认 Twilio TURN 服务器工作正常。我在我的 Twilio 帐户上看到来自其他同行的流量,并且 Trickle ICE 测试here 也成功了。当STUN 找不到对等点的外部 IP/端口时,TURN 不应该中继流量吗?

谢谢!

【问题讨论】:

    标签: networking webrtc nat stun turn


    【解决方案1】:

    我有一个遇到类似问题的 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 服务器来检查那里发生的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2023-03-13
      相关资源
      最近更新 更多