问题标签 [nat-traversal]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 在 C# 中使用免费的 STUN 和 TURN 服务器进行 NAT 遍历
这是我之前的帖子:
NAT Traversal 仅使用 C# 中的免费 STUN 和 TURN 服务器
我正在制作一个在线应用程序,可以相互进行点对点通信。大多数用户都应该在 NAT 后面的专用网络中,我需要遍历它。我买不起外部服务器,所以我唯一可以依赖的就是像Numb这样的免费服务器(这意味着我无法提供自己的实现或扩展。)
但是,经过一些研究,我无法弄清楚如何使用这些服务器。我也没有找到可以与 C# 一起使用的库。
我应该如何使用此类服务器通过网络建立连接?有没有一个库来简化这些东西?(我是高中生,只能用免费的。)如果也实现ICE协议就更好了。
有些人建议我使用 UPnP,这对我来说确实很有效,但有些用户不喜欢在他们的路由器上打开 UPnP。这就是为什么我再次在这里问它的原因。
java - 如何在不使用外部主机的情况下以编程方式查找设备的外部 IP 地址?
当我读取设备的 IP 地址时,我总是得到本地 IP 地址。
我使用下面的代码片段来做到这一点。
但我需要在不使用任何外部主机或 Web api(例如http://jsonip.com )的情况下读取外部 IP 地址
networking - 如何在我的树莓派上使用 STUN/ICE 实现 NAT 遍历
我正在尝试在我的树莓派上设置一个能够突破 NAT 路由器后面的实现,以便我可以远程连接到它,而不管它位于哪个网络后面。
我已经尝试过 pagekite.me,它非常适合作为中继/反向隧道解决方案,但我觉得它仍然有点笨拙(存在延迟问题,因为中间需要连接一个额外的服务器)。
我已经阅读了有关 STUN 和 ICE 的信息,但我不知道可以在我的树莓派上实施的任何解决方案。
目标是无论其网络配置(路由器/网络)和网络防火墙如何,我都可以通过 SSH 连接到我的 PI。
有人可以指出我应该在哪里或寻找什么的正确方向吗?
java - Ice4j:测试 IcePseudoTcp - 需要 STUN 服务器吗?
有谁知道测试 IcePseduoTcp 的过程?它是自包含的,还是必须将其指向 STUN 服务器才能工作?
c# - 使用 tcplistener 监听特定的 IP 地址和端口
我正在创建一个屏幕共享应用程序。为了允许 nat 遍历,我必须通过服务器执行此操作,我只是想知道如何检查尝试连接到服务器的客户端是我想要连接的客户端而不是其他人,而实际上并没有阻塞其他人无法连接到该端口。
我正在考虑使用 BeginAcceptTcpClient() 而不是 AcceptTcpClient() 有没有办法在它以这种方式接受连接之前检查谁在尝试连接,以便稍后 TcpListener 可以拾取它?
我唯一能做的另一件事是在连接中发送我想要发送图像的人的 ID,并让服务器处理将其发送给谁,但这会太慢或资源密集吗?
python - 连接到 STUN 返回的外部 IP 地址
我正在尝试连接到位于端口 4000 的 NAT 后面的网络服务器。
在我的网络服务器上,使用 pystun ( https://github.com/jtriley/pystun ) 和命令:
$ pystun -p 4000
我有一个返回值
NAT Type: Symmetric NAT
External IP: <ip>
External Port: 1024
但是当我尝试从 http://:1024 访问它时,我无法连接并且它总是停留在等待响应。
这是使用 STUN 的正确方法吗?
java - 如何从 STUN 请求中获取我的外部 IP 地址和外部端口号?
我在我的 WiFi 路由器的 NAT 后面。当我从端口 20,000 发送一个数据包时,它来自我的 WiFi 路由器的端口 56867。我希望能够以编程方式获取输出端口号(56867),我正在尝试通过 STUN 协议这样做。
我正在使用https://code.google.com/p/openwonderland-jvoicebridge/source/browse/branches/jp/stun/src/com/sun/stun包“com.sun.stun”中的 STUN 客户端代码/StunClient.java。我尝试使用 STUN 客户端代码通过编写以下代码来获取我的外部 IP 地址和端口号:
我的输出如下所示:
问题是 stunClient1.getMappedAddress() 给了我 DatagramSocket 的绑定地址和临时端口号,我想获取我的公共 IP 和公共端口号。请帮忙。
*解释/澄清*
当我创建 DatagramSocket 时,OS/Java 为其分配一个临时端口号,在本例中为 58100。我有一个具有 NAT 的 Wifi 路由器。当我通过路由器向 stun.ekiga.net 发送数据包时,stun.ekiga.net 将响应发送回的外部端口号与内部端口号不同。我想要 STUN 服务器正在回复的外部端口号。
*有用的信息*
我收到了以下 STUN 数据包:
如何从 stun 数据包中的二进制数据中提取我的公共/外部端口号?
docker - Docker 网络设置和 iptables NAT
我有一个在 docker 容器内运行的服务器,监听 UDP 端口,比如说 1234。这个端口在 Dockerfile 中公开。
另外,我有一个外部服务器帮助进行 NAT 遍历,基本上,只是将注册服务器和客户端的地址相互发送,并允许通过注册期间发送的名称连接到服务器。
现在,如果我使用-P
选项运行我的容器,我的端口将作为某个随机端口发布,例如 32774。但是在辅助服务器上,我看到我的服务器从端口 1234 连接到它,因此它无法发送正确的地址到一个客户。客户端根本无法连接。
如果我运行容器在同一个端口上显式发布我的服务器-p 1234:1234/udp
,客户端可以直接连接到我的服务器。但是现在在辅助服务器上,我看到我的服务器从端口 123 6连接到它,并且它再次无法将正确的端口发送到客户端。
如何解决?我的目标是要求使用我的 docker 镜像的人尽可能少地进行额外配置。
编辑:所以,我需要知道容器内部的外部端口号才能将其发送到发现服务器,据我所知,目前不可能,对吧?或者我需要从容器和我的端口进行传出连接,以使用为传入连接配置的相同外部端口 - 这可能吗?
webrtc - 客户端-服务器 WebRTC 应用程序是否需要 ICE?
我有一个 WebRTC MCU ( kurento ) 在公共 IP 地址上运行,为一些只发送或只接收音频的客户端提供服务所以每个客户端都直接与具有公共 IP 地址的 MCU(而不是彼此)连接。
Q1:是否还需要使用 STUN 和 TURN 进行 NAT 穿越??如果是这样为什么?
Q2:浏览器中的 WebRTC 是否有任何 hack 可以消除 STUN 和 TURN 的需要?
在我看来:大多数客户端-服务器架构对 NAT 后面的客户端没有任何困难。与 webrtc 有什么区别?
android - 在 NAT 后面工作 - 一种设备通信方案
我正在尝试提出一种解决方案,支持在嵌入式设备(基于 xMega128(C))和 Android 应用程序之间进行数据交换。问题是数据交换必须通过互联网进行,嵌入式设备和运行应用程序的移动设备都可以在不同的 NAT 后面,使用不同的 ISP、3G、LTE 等进行连接。
我尝试了 UDP 打孔,但它不适用于对称 NAT。带有预测的打孔也不能保证 100% 的可靠性。我也考虑过使用 ICE,但是 ICE C 库(pjnath、libnice)与选择的硬件不兼容(libs 需要 os)。现在我正在考虑实施或使用(如果存在)流量中继服务器,但这对我来说似乎是一种黑客行为。
还有其他我没有考虑过的选择吗?任何帮助将不胜感激。
理想情况下,通信方案将是:
100% 可靠
相对较低的延迟(3 秒绝对最大值)
可扩展(比如未来多达 50 万台设备)
可由应用程序和设备初始化
多用户——一台设备可以连接许多安卓应用
此外,如果这有帮助,设备和应用程序之间的数据交换不是非常高强度 - 大约每小时 1 个会话,每个会话约 50 条消息,它们之间的时间为 10-20 秒,每条消息的重量约为 100 字节。