我想在C#中进行TCP打孔(NAT Traversal) . 如果需要,可以使用集合服务器完成 . 我找到了http://sharpstunt.codeplex.com/但是无法让它工作 . 理想情况下,我需要一些方法,我将一个端口号(int)作为参数,在NAT上调用此方法后可用("Port Forwarded") . 如果该方法只返回一些后来在NAT上可用的端口号,那也没关系 . 有没有人用C#做过这个?你能给我一些sharpstunt或其他东西的例子吗?
我想在C#中进行TCP打孔(NAT Traversal) . 如果需要,可以使用集合服务器完成 . 我找到了http://sharpstunt.codeplex.com/但是无法让它工作 . 理想情况下,我需要一些方法,我将一个端口号(int)作为参数,在NAT上调用此方法后可用("Port Forwarded") . 如果该方法只返回一些后来在NAT上可用的端口号,那也没关系 . 有没有人用C#做过这个?你能给我一些sharpstunt或其他东西的例子吗?
6 回答
在每种网络场景中,TCP打孔操作的方式与UDP打孔方式类似 . 例如,如果两个对等体A和B落后于不同的NAT,则发送到另一个对等体的每个对等体的第一个SYN数据包在其各自的NAT中打开与其公共地址相关联的漏洞 . 如果A到B的第一个SYN数据包到达B的NAT,那么在B的第一个SYN数据包到A的B到达NAT之前,B的NAT认为A的SYN数据包是未经请求的并且丢弃了它 . 但是,随后B的第一个SYN数据包可以成功通过A的NAT,因为A的NAT将B的公共地址识别为A发起的传出会话的目的地 .
是的TCP打孔是可能的 . 我不明白为什么有人会这么想 .
另外,你不能手动创建这种类型的bahaviour吗?只要步骤相同以收集所有必需信息,它就不需要依赖任何特定协议 .
一般而言,TCP打孔(3.2.1)的过程如下:
客户端:A,B服务器:S
•A使用其与S的连接来请求S与B Build 连接 . •S使用B的私有和公共地址回复A,同时将A的地址发送给B.
•A和B异步地将传出连接尝试(发送SYN数据包)发送到彼此的公共和专用地址,从它们用于向S注册的同一端口 . 同时,它们侦听TCP的传入连接尝试 . 本地TCP端口 .
•A和B等待对其外出SYN数据包或传入连接请求(SYN数据包)的SYN-ACK响应 . 如果连接失败,则对等方可以重试连接到最大超时时间 .
•三次握手过程完成后,对等方互相进行身份验证 . 如果验证失败,则对等体关闭该连接并等待,直到另一个连接成功通过验证 . 第一个成功通过身份验证的连接将用于传输TCP数据 .
(我知道这不是一个答案,但没有足够的空间发表评论) .
这个问题已经很老了,但是对于任何寻找解决方案的人来说,你应该看一下Open.NAT project它真的很容易使用并且可以同时使用UPNP和PMP NAT!
假设你想将外部端口1700转发到本地端口1600,你所要做的就是:
您还可以列出所有现有映射,以便验证您的端口尚未使用 .
在MSDN上还有一篇关于NAT Traversal的博文:https://blogs.msdn.microsoft.com/ncl/2009/07/27/end-to-end-connectivity-with-nat-traversal/
听起来你可能会混淆TCP和UDP . TCP是一种面向连接的协议,防火墙和路由器很容易理解,并且需要一个启动器(客户端)和一个监听器(服务器) . 如果客户端和服务器都位于防火墙或NAT之后,则无法在没有连接到某个代理服务器(不是防火墙)的情况下打孔 . 这个问题是代理将负责转发他们的所有流量 .
从你的问题来看,听起来你对UDP打孔更感兴趣,它利用UDP无状态的脂肪,而不是以连接为导向 . 因此,大多数状态跟踪防火墙将对UDP数据流做出“最佳猜测”,并假设离开给定端口的流量将在同一端口上收到回复,并自动将它们路由回来 . 如果使用一些非通道方式(例如简单地传递地址而不是数据的TCP服务器),两个对等体可以在相同的端口上相互传输数据,它们各自的防火墙/ NAT路由器将打开允许的漏洞交通 .
至于如何做,这一切都取决于你如何获得对等的IP地址 . 完成后,只需在约定的端口上开始传输UDP数据包,然后等待回复 .
我们整合了一个名为IceLink的库,它使用ICE / STUN / TURN进行P2P流式传输,并进行完整的NAT遍历 . STUN为主打孔工作适用于大多数路由器在对等体之间 Build 直接连接,对于那里的"bad"路由器,连接可以回退到基于TURN的中继 .
http://sipsorcery.codeplex.com有一个正常工作的服务器 .
SipSorcery.core - > SipSorcery.Net - >晕眩
我不熟悉你的主题,但我碰巧知道一个开源P2PVPN,它使用lib来做NAT . 你可以在这里查看(www.SocialVPN.org) .
祝好运 .