自动启用从互联网访问端口4900的方式

45
我正在编写一个在端口4900上运行的自定义P2P程序。在某些情况下,当用户位于路由器后面时,该端口无法从互联网访问。
有没有一种自动的方式可以使该端口从互联网访问。我对其他P2P应用程序的工作原理并不太确定。
请问有人能够解答一下吗?

可能是Is there a UPnP Library for .NET (C# or VB.NET)?的重复问题。 - David
3
我不同意这个重复的说法,虽然UPnP确实是“答案”。 - jv42
2
@jv42:说得对,这就是为什么关闭需要5个投票的原因。至少,它可以将OP指向有用和相关的信息。我认为StackOverflow礼仪更喜欢以这种方式链接重复内容,而不是重新发布相同的答案。但我可以看出这两者之间的差异。无论哪种方式,只要OP得到帮助,任务就完成了 :) - David
@David:我能理解这个观点。作为一个用户,我更喜欢对问题有一个明确的答案,即使它只是简短地指出了“重复”的原因。 - jv42
我已经发布了一个与你相关但不完全相同的问题,链接为https://stackoverflow.com/questions/54118006/vpn-with-webrtc-stun-ice - BBK
6个回答

135
P2P网络连接简述。假设我们这里讨论的是UDP。以下步骤也可以应用于TCP,但需要进行一些调整。
  1. 列出您所有本地IP地址(通常只有1个)。为每个具有IP地址的适配器创建一个给定端口号**的UDP套接字。

  2. 对于在步骤1中创建的每个套接字,使用相同的套接字联系STUN或TURN服务器,以发现您的外部IP地址,并发现内部端口号在NAT之外的映射方式(它并不总是相同的端口值)。也就是说,您的本地地址192.168.1.2:4900在外部世界上可能是128.11.12.13:8888。而某些NAT在使用相同的本地端口到其他IP地址时,并不总是使用相同的端口映射。TURN还将为您提供一个“中继地址”。如果您的路由器支持该协议,还可以使用UPNP直接获取端口映射地址。

  3. 通过约会服务(SIP、XMPP、即时消息、Web服务、电子邮件、带线的杯子),将您的地址候选列表发布到服务或向另一个客户端发送通知,内容为“嘿,我想与你连接”。此消息包括步骤1和2中收集的所有“地址候选”(IP和端口对)。

  4. 远程客户端在收到连接邀请后,也执行步骤1和2。然后通过接收到邀请者候选列表的同一通道将其候选列表发送回。

  5. 打洞步骤。双方开始通过UDP向对方的地址候选发送测试消息,并在其端口上侦听同一消息。每当收到消息时,回复到它来自的地址。最终,客户端将发现他们有一对可靠地发送数据报的地址。通常,一个端点做出最终决策,选择要与之通信的地址对(套接字),并且协议促进此端点告诉另一个端点这个决策。

通常最好不要依赖于一个众所周知的P2P客户端端口。因为两个在同一NAT或防火墙后面的客户端可能不能同时使用您的软件。

这里是一些技术的快速概述。

STUN - 是一个简单的服务器和协议,用于客户端在NAT /路由器后面发现其外部IP和端口映射。

TURN是对STUN的扩展,但支持中继 P2P 连接的场景,其中防火墙和 NAT 阻止直接连接。

ICE是一个设置 P2P 连接的步骤集,其中使用了 STUN 和 TURN。 ICE是步骤1-5的正式协议。两套关于 ICE 的优秀幻灯片在这里这里

WebRTC是ICE标准的一种变体,也是用于使用STUN和TURN进行P2P会话的参考库。

UPNP + Internet Gateway Device Protocol - 一些路由器支持此功能,使主机自动获取端口映射。

libnice是Linux的开源C库(可能也适用于Windows),实现了ICE。

libjingle是来自Google的另一种ICE实现(用C++编写)。适用于 Windows 和 Linux。

PJNATHPJSIP编码库套件中的一个库。它是一个很好的ICE stack实现(C代码),并已移植到许多平台上(Windows,Linux,Mac,iOS,Symbian,即将支持Android)。

最后,我想为你推荐使用我的STUN服务器代码库


@selbie,如果两个对等方中的一个或两个都在双重NAT后面,STUN / TURN / ICE实现是否可以工作? - Jagdish
1
@jagsgediya - 是的。最有可能通过TURN收敛。 - selbie
@selbie 我仍然不清楚这些东西是如何工作的。假设STUN服务器返回 128.11.12.13:8888 作为Natted IP和端口,而我的IP和端口是 192.168.1.2:4900。假设我想将我的3000端口暴露给外部世界。那么我是否需要将所有到达4900端口的请求转发到3000端口? - Viren
如果您正在尝试运行一个任何客户端都可以连接的专用服务器,那么这些内容都不适用。您只需像您所描述的那样在路由器和防火墙上打开一个端口即可。如果您想要在不手动配置NAT的情况下与另一台计算机动态建立临时短期连接,则应使用上述P2P说明。 - selbie

5

3
我会使用WebRTC技术作为这种应用程序的开源框架。 官方网站 实际上,它是一个开源项目,支持所有点对点技术所需的功能:
- ICE和STUN(NAT遍历) - DTLS和SRTP(安全性) - AVPF用于流媒体质量。

2

1

2
继承者是端口控制协议 - Martin Andersson

-1

对于初学者,我建议先了解“打洞”技术。这个视频在这里非常好。但请注意,它并不总是适用于网络拓扑结构。这解决的是ICE技术,可以发现如何建立连接。


由于您当前的回答写得不够清晰,请[编辑]以添加更多细节,帮助他人了解它如何回答所提出的问题。您可以在帮助中心找到有关撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接