我已经做了P2P通信的一些研究没有碱的服务器,然后走了过来STUN。 从我读过,STUN是NAT的一种方式“打洞”,将不需要对被端口转发到连接。 这是正确的,究竟是什么打孔是什么意思? 如果不需要端口转发,我不完全了解STUN做这一切似乎很脆弱,因为它会通过防火墙。 可以STUN在Java或其他语言的P2P程序可以使用诸如通过TCP / UDP端口将消息发送到对等体没有碱服务器或无需用户端口转发聊天客户端?
Answer 1:
考虑两个机器想与对方沟通的任务。 如果两台机器都直接连接到公共互联网(不是后面的路由器),然后在两台机器只需发送数据包来回对方的公网IP。 通常,机器后面的一个或多个路由器。 为了简化问题,我们假设只有一个级别的路由器。
NAT穿越解决了路由器的数据包转换的输出端口号成别的东西的问题(例如,您发送的端口X的请求时,路由器转换的包充当如果它从口Y左代替)。 如果路由器端口转发,则路由器实际上并没有做任何翻译(端口X-> X)。 大多数的家庭/企业/等路由器根本就没有端口转发,但是,因此NAT穿越的用武之地。 见NAT穿越和不同类型的NAT的 。
考虑一个路由器的防火墙,做任何上述文章(egfull锥)在非端口转发翻译。 如果路由器接收到数据包的一些端口X,但路由器没有发送从口Y的任何数据包,则丢弃该数据包(毕竟,谁是指数据包?路由器不知道!)。 只有当一些私人机发送一个数据包,路由器让翻译从私人机外口Y映射端口X将外部数据包口Y被转发到专用机器。
STUN穿越
为了让两个客户端,A和B都落后在互联网上防火墙,直接沟通,他们必须以某种方式知道路由器映射。 一般的解决方法是使用STUN服务器,以确定其端口映射。 机A发送的分组形式端口X击晕。 路由器翻译端口Y和STUN服务器看到这一点,并响应回到A告诉他的外部端口是什么。 B做出同样的。 然后,A和B交换他们的转化端口(通过使用一些其他的中央服务器......对于一个简单的例子,Skype公司可能有一个中央登录服务器A和B告诉Skype的服务器的端口转换,和Skype分别告诉A和B关于端口映射)。 然后,B发送一个数据包使用的端口Y A的公网IP,没有X.机A“打孔”的防火墙,允许它接收来自外部端口的数据包Y.
安全?
你提到的安全性:不打孔打通网络安全违规行为? 潜在的...我还没有研究的课题,但考虑完全锥形NAT。 一旦映射而成,任何外部设备可以将数据包发送到计算机A的路由器和将得到的数据包,即使从来没有发送数据包到一些恶意的机器Z.机Z,当然会以某种方式发现映射。 一些维基百科的文章,该图仅显示了具有完全锥形NAT的这个漏洞,但不要把我的话。 通过使用打孔申请量来看(Skype和Xbox Live的,...),它会出现网络依赖于应用程序和系统级防火墙的保护,除了路由器防火墙措施。
下面简要福特文中提到的安全性:“相反的是它的名字可能会建议,打孔不妥协的私有网络的安全性。” 这似乎是网络依赖于系统级防火墙路由器比防火墙的更多。
对称NAT和穿越TURN
STUN并不总是工作:有些路由器“表现不好”。 机器A可能从口X,一个两包发送到stackoverflow.com和一个facebook.com。 路由器映射stackoverflow.com分组FROM端口Y和facebook.com分组FROM端口Z(即使设备A发送FROM内部端口X两个分组)。 这是一个对称NAT。 这些NAT的是有问题的,因为上面的STUN / Skype的连接将无法正常工作。 与STUN和facebook.com与B机(你想对Skype与人)更换stackoverflow.com。 不幸的是,STUN可以找出NAT映射为数据包A向STUN,但发送到B的报文使用一个完全不同的映射。 在一般情况下,是不可能的(没有你能够跟踪出站路由器的数据包),以确定对称的NAT端口映射。 因此,需要中央路由服务器,为客户进行沟通,但这违背了P2P的整点。 见TURN 。
我们可以用这样一个Java聊天程序?
随着网络库支持(Java,C等)的任何语言,你可以从任意端口发送的数据包可以使用STUN来遍历NAT(只要它不是一个对称NAT等)。 在一般情况下,人们总是需要一个中央服务器(在这种情况下,两个:STUN和登录服务器)。 如Skype的实施例中描述用于在登录服务器; 一旦两个客户知道自己的端口映射,在P2P通信的开始(参见之前,他们必须传达给对方莫名其妙鸡还是先有蛋 )。 但是,一旦A和B知道对方的公网IP和NAT映射,它们可以直接通信。
警告
虽然我不可能列出所有的NAT穿越的注意事项,其中一个重要的概念是永葆:一旦路由器已经取得了端口映射,多久会持续吗? 说我连接到STUN服务器,然后等待10分钟一次,我告诉它的映射B到送我一包。 路由器可能会有所下降的映射(路由器必须定期清除出去腾出空间给新的旧的映射,并在安全性最小的尝试)。 我找不到我的参考,我认为这取决于TCP VS UDP数据包,但我熟悉发送保留的数据包的应用程序每〜60秒或更少,以确保路由器不下降的映射。 一旦路由器丢弃的映射和机器试图发送数据包,数据包将被丢弃(导致混乱的时间对我来说...)。
用品
- RFC 5389 STUN
- RFC 5766 TURN
- 对等网络通信跨网络地址转换。 B. Ford等人。
文章的最后是一个伟大的介绍很多的想法,在genreal路由器和NAT穿越。 我读了一段时间前,当我实现了一些TURN服务器/客户端程序,作者真的知道他们在说些什么!