当前位置: 首页 > 知识库问答 >
问题:

关于眩晕服务器的困惑

尹钱青
2023-03-14

我需要的是,我将在x端口(本地机器)中打开一个UDP服务器监听,并且机器(公共IP)可以向我发送UDP数据包。我的计算机没有公共IP。基本上我需要stun

我正在测试stuntman服务器/客户端项目。我在服务器(公共ip)中运行stuntman-server。在我的系统中运行客户端(本地ip)。我要求为9999端口提供映射IP/端口。

./stunclient --mode full --protocol udp --localport 9999 stun.server.ip

Stun服务器返回IP和端口。然后,我在本地系统中打开一个UDP服务器(使用java),并开始侦听9999端口,并将一个UDP消息从其他计算机(具有公共IP)发送到stun服务器返回的映射IP/port。但我收不到任何数据。您可以假设我的服务器/客户机代码(用java编写)在本地网络中运行良好。

流量:

My machine ->>>>>stun request for 9999 port and my ip ------> stun server
My machine <<<<<<<<<<<<<<<<<<mapped ip/port <<<<<<<<<<<<<<<  stun server
My machine : Run JAVA udp server socket in 9999 port

My machine  <<<<<<<<<<<<<<<<<<<UDP message to mapped ip/port<<<<<< other public machine 
            xxxxxxxxxxxxxxxxxxxNot workingxxxxxxxxxxxxxxxxxxxxxxxx

共有1个答案

白禄
2023-03-14

您没有发布stunclient运行的结果,但我想它看起来如下所示:

$ stunclient --mode full --localport 9999 stun.stunprotocol.org
Binding test: success
Local address: 192.168.1.8:9999
Mapped address: 1.2.3.4:9999
Behavior test: success
Nat behavior: Endpoint Independent Mapping
Filtering test: success
Nat filtering: Address and Port Dependent Filtering

我猜您的行为测试是“endpoint独立”的,而过滤测试是“地址和端口相关”的,因为这些测试在家庭中是最常见的,并且与您上面描述的大部分匹配。(也称为“端口受限NAT”)。

无论如何,这意味着您已经在自己和STUN服务器之间创建了一个端口映射。在上面的示例中,我的公共IP地址是1.2.3.4。并且很常见,但并不总是这样,我的本地端口(9999)与公共端口相同。

NAT在内部保留如下逻辑表:

------------------------------------------------------------------------------------
||     LOCAL IP    | LOCAL PORT ||  EXT PORT    ||   REMOTE IP      | REMOTE PORT ||
||================================================================================||
||   192.168.1.8   | 9999       ||  9999        ||  107.23.150.92   | 3478        ||
------------------------------------------------------------------------------------

因为您从端口9999向stun服务器(107.23.150.92)发送了一个数据包,NAT会在其表中创建一个端口映射条目,持续几分钟。当数据包从Internet到达NAT/路由器时,它会参考该表。当响应从STUN服务器的IP:端口返回时,NAT能够根据上表中的“Remote”字段将其转发到NAT后面的计算机。

但您与希望从中接收数据的“其他公共机器”之间没有端口映射。让我们假设另一台机器的IP地址是2.4.6.8,并且它正试图从它的本地端口8888发送。NAT表中仍然没有任何内容可以将2.4.6.8:8888的流量映射到NAT后面的主机。因此,当流量从表中未列出的主机到达NAT时,NAT只知道将数据包丢弃在地板上。有一种NAT分类称为“锥形NAT”,在这种情况下可以工作,但这种情况并不常见。

在你的情况下,有一个简单的变通方法。从STUN服务器获得端口映射后,从您的同一本地端口(9999)向您希望从中接收数据的远程主机(和远程端口)发送另一个数据报。远程主机可以简单地忽略此数据报,但它会有效地在NAT上创建另一个端口映射条目

------------------------------------------------------------------------------------
||     LOCAL IP    | LOCAL PORT ||  EXT PORT    ||   REMOTE IP      | REMOTE PORT ||
||================================================================================||
||   192.168.1.8   | 9999       ||  9999        ||  107.23.150.92   | 3478        ||
||   192.168.1.8   | 9999       ||  9999        ||  2.4.6.8         | 8888        ||
------------------------------------------------------------------------------------

到2.4.6.8:8888的简单1字节数据包允许NAT将流量从该地址转发回NAT后面的主机。

换句话说,使用您自己的网络流命名法:

My machine:9999 ---->[STUN BINDING REQUEST]--->stun server:3478

My machine:9999 <----[STUN BINDING RESPONSE mapped IP:port]<--- stun server:3478

My machine:9999 [Open socket on port 9999]

My machine:9999 ---->[1 byte datagram] -------> 'other:8888'

My machine:9999 <---- [UDP to public IP:port obtained in step 2]<----'other:8888'

如果另一台机器在公共互联网上,您技术上不需要STUN。第一台机器(在NAT后面)可以直接发送到远程IP和端口,说“给我发送一些数据”。远程端只是检查此消息的对等地址和端口,以决定将其发送回何处。端口映射已创建。有些RTSP客户端假定服务器是公共的

关于套接字NAT遍历的基本知识,我的答案在这里。

我碰巧认识特技人的开发者。他是个相当不错的人,长得漂亮,而且很聪明。他们还说我和他长得很像,名字的拼写也差不多。如果你有关于STUN和NAT遍历的问题,你可以直接给他发邮件。

 类似资料:
  • 我是Android的新手,我对服务和线程的生命周期感到很困惑。 假设我有一个活动,它通过调用startService()在工作线程中启动服务。根据谷歌文档,即使调用组件被破坏,该服务也将无限期运行。 所以我的问题是:如果应用程序进程被完全销毁(退出并从后台堆栈中清理),服务是否仍在运行?UI线程是否仍在运行?如果是,这是否意味着即使其调用进程被破坏,线程也不一定会被终止?

  • 我试图通过遍历特定边缘的标签来返回从特定顶点开始的顶点和边缘,我正在寻找的结果是顶点,遍历叶节点所有边缘的边缘 [示例图]https://i.stack.imgur.com/5yQTW.png 预期结果: ap1包含p1 ap2包含p1 p1使用f1包含ap1 f2包含f1 f3包含f2 f3使用f4包含ap2 f5包含f4 f6包含f5 f6使用 生成图形的脚本 在使用以下查询时,似乎遇到了循环

  • Navicat 提供强大的工具助你管理服务器对象,例如数据库、表、视图、函数等。 【注意】在 Navicat 中开始使用服务器对象前,你要首先创建连接。 在对象设计器的“SQL 预览”或“脚本预览”选项卡中,你可以预览创建或编辑对象时所需的 SQL 语句和脚本。对于某些数据库或模式对象,你可以使用底部的下拉式列表来显示在“文件”菜单中选择“保存”或“另存为”时所运行的 SQL 或脚本。 Navic

  • Navicat 提供强大的工具助你管理服务器对象,例如数据库、表、视图、函数等。 【注意】在 Navicat 中开始使用服务器对象前,你要首先创建连接。 在对象设计器的“SQL 预览”或“脚本预览”选项卡中,你可以预览创建或编辑对象时所需的 SQL 语句或脚本。对于某些数据库或模式对象,你可以使用底部的下拉式菜单来显示在“文件”菜单中选择“保存”或“另存为”时所运行的 SQL 或脚本。 Navic

  • Navicat 提供强大的工具助你管理服务器对象,例如数据库、表、视图、函数等。 【注意】在 Navicat 中开始使用服务器对象前,你要首先创建连接。 在对象设计器的“SQL 预览”或“脚本预览”选项卡中,你可以预览创建或编辑对象时所需的 SQL 语句和脚本。对于某些数据库或模式对象,你可以使用底部的下拉式列表来显示在“文件”菜单中选择“保存”或“另存为”时所运行的 SQL 或脚本。 Navic

  • 问题内容: Docker菜鸟在这里,尝试使用Compose设置一个简单的Django项目。过,我已经在此方面取得了成功,但是这次我正在尝试一种不同的设置,但我不知道为什么它不起作用。 我有以下docker-compose.yml文件: 我的/ Dockerfile是: 我的/ docker / web / Dockerfile是: 我的/docker/web/default.conf文件是: do