STUN简介
Simple Traversal of UDP over NATs, NAT的UDP的简单穿越,是一种网络协议。是客户机-服务器的一种协议,由RFC 3489 定义。该协议定义了一些消息格式,大体上分为Request/Response。这个协议主要作用就是可以用来在两个处于NAT路由器之后的主机之间建立UDP通信。它允许位于NAT后的客户端找出自己的公网地址,确定自己位于的NAT是哪种类型,以及NAT为这个客户端的本地端口所绑定的对外端口。
譬如,一个软件包可能会包括一个STUN客户端A,这个客户端A会向STUN服务器发送请求,之后,服务器就会向STUN客户端A发送NAT路由器的公网IP地址以及NAT为这个客户端A开通的端口号,这个端口号是允许从别的客户端B传入流量传回到这个客户端A的。
为什么需要STUN?
一般情况下,通信的两个客户端主机往往是位于NAT之后的,用传统的方法时无法建立连接的。
STUN主要功能
STUN主要有3个功能,分别是检测是否位于NAT后面,检测NAT的类型,获取经过NAT转换后的地址和端口。 在内网安装一个STUN Client,在公网上安装一个STUN Server。client 向server 发送request,server 发送response给client。
- 检测是否位于NAT后面 Server 在收到client 发送的UDP包以后,Server 将接收该包的地址和端口利用UDP再传回给client,client把Server发送过来的地址和端口信息与本机的ip地址和端口进行比较,如果不同,说明在NAT后面;如果相同就说明client位于NAT前面,client也是公网。
- 检测NAT的类型 这个主要发送响应的时候使用不同IP地址和端口或者改变端口等等。这个检测是对NAT一般情况下有效,但是对防火墙就无能为力了,因为防火墙可能不会打开UDP端口。
NAT 主要分为4种类型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。其中Full Cone、Restricted Cone、Port Restricted Cone可以统称为Cone NAT,它们有一个共同点就是,只要是从同一个内网的地址和端口出来的包,NAT转换后的公网地址和端口一定是相同的。Symmetric 是如果是同一个内网的地址和端口出来的包,到同一个外部目标地址和端口,那么NAT转换后的公网地址和端口号也是相同的,但是如果如果到不同的外部目标地址和端口,NAT会转换成不同的端口号(公网地址是不变的,因为只有一个)
- Full Cone NAT 从内网主机 in ipx和端口in portx发送的数据会映射为相同的公网ip x 和端口 port x。从其他机器上如果通过UDP发送数据到公网ip x和端口 port x上,最终数据都会被转发到内网主机上(in ipx :in portx)。 发送给内网的ip 和 port 都不受限。
- Restricted Cone 从内网主机 in ipx和端口in portx发送的数据会映射为相同的公网ip x 和端口 port x。外部机器主动请求通信的源IP地址必须和内部主机主动向这个外部机器发送请求时的外部机器接收ip地址一致。即ip地址受限,端口不限。内网能接收信息的外部机器必须是内网主动发送请求过的外部机器。
- Port Restricted Cone 从内网主机 in ipx和端口in portx发送的数据会映射为相同的公网ip x 和端口 port x。外部机器主动请求通信的源IP地址、端口必须和内部主机主动向这个外部机器发送请求时外部机器接收的ip地址、端口一致。即ip地址受限,端口都受限。内网能接收信息的外部机器必须是内网主动发送请求过的外部机器(ip相同),同时外网给内网发送数据包的端口还必须是接收内网数据包时所采用的端口号(端口相同)。
- 对称NAT 发送包的目的ip和port 相同,那么NAT 映射的ip和port会相同。如果目的地址不同,即使同一台内网机器、同一个端口,mapping的端口也不同,但是ip还是相同(因为同一个公网ip)。所以只有它主动连的服务器才会知道它的端口。
例子:
A机器在内网(192.168.0.4) NAT服务器(210.21.12.140) B机器在公网(210.15.27.166) C机器在公网(210.15.27.140)
如果 A 连接过机器B,假设是如下:A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8000)-> B(210.15.27.166:2000)。A和C从来没有通讯过。
不同类型的NAT,分析:
- Full Cone NAT C 将数据发送到 210.21.12.140:8000,NAT 会将数据包送到A(192.168.0.4:5000)。因为NAT上已经有192.168.0.4:5000到210.21.12.140:8000的映射。也就是说只要机器A与任何公网上机器通讯过,其它任何公网上机器都能发送数据给A,通过发送数据包给NAT上转换后的ip和端口之后,NAT会自动将数据包送到机器A。NAT 对发送给A的数据包来者不拒,不过滤。
- Restricted Cone C无法和A进行通信,因为A从来没有和C通信过,NAT会拒绝C试图与A连接的动作,但是B可以通过发送数据到210.21.12.140:8000和A的192.168.0.4:5000通信,这里机器B自己可以使用任何端口和A通信,譬如210.15.27.166:2001 -> 210.21.12.140:8000,NAT会将数据送到A的5000端口上。注意这里B使用的端口是2001 不是初始A连接B时,B接收A数据使用的端口2000。即只能是通信过的机器才能够进行通信,但是再通信时端口不需要固定。
- Port Restricted Cone C无法和A进行通信,因为A从来没有和C通信过,NAT会拒绝C试图与A连接的动作,而且机器B只能用它的210.15.27.166:2000与A的192.168.0.4:5000通信。即只有曾经收到内网地址A发送过数据包的公网机器,才能通过NAT映射后的地址向内网机制发送UDP包。
- Symmetric NAT 如果A机器还想连接C机器,则NAT上产生一个新的映射,对应的转换可能为A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8001)-> C(210.15.27.140:2000)。
B与A通信:B(210.15.27.166:2000)-> NAT(转换后210.21.12.140:8000)-> C(192.168.0.4:5000)。 C与A通信:B(210.15.27.140:2000)-> NAT(转换后210.21.12.140:8001)-> C(192.168.0.4:5000)。
stun 的NAT 类型探测流程
什么是 TURN 服务器
TURN 是使用 NAT 的中继进行穿透,这些服务器对于现代互联网通信至关重要。
在各种情况下,由于网络限制,直接点对点通信是不可能的。
以下是 TURN 服务器的一些功能:
- 克服 NAT 和防火墙问题: NAT 是路由器使用的一种方法,用于转发来自本地网络中通过单个公共 IP 地址连接的多个设备的流量。由于公共 IP 地址的可用性有限,因此 NAT 是必不可少的。
NAT 使 P2P 通信复杂化,因为 NAT 后面的设备无法直接与外部网络连接。
- 促进通信: 由于 NAT 或防火墙的限制,当位于不同 NAT 和防火墙后的设备无法相互通信时,就会出现以下情况
- 设备之间无法直接通信。这类限制在许多网络中都很常见。这时,TURN 服务器就能促进这种通信。
TURN 服务器如何工作?
对TURN 服务器有一个概念性的理解,然后就是实际的实现。我们将研究两个概念,首先让我们从概念上理解转向服务器是如何工作的,然后我们将转向实际应用
- 中继数据: TURN 服务器的主要用途是在因 NAT 和防火墙而无法直接连接的设备之间转发数据。
- TURN 服务器从一台设备接收数据,然后将数据转发给另一台设备。通过 TURN 服务器传输的所有数据都经过加密,因此任何人,甚至是 TURN 服务器都不知道通过它传输的数据是什么。
- 保持连接: TURN 服务器会跟踪连接情况,并通过它管理数据的持续转发,以维护所有对 webRTC 通信至关重要的连接。
STUN 服务器 VS TURN 服务器
TURN
- TURN 服务器更加通用,可以处理 STUN 服务器发生故障的情况,可以在通信设备之间持续中继流量。
- 用于 NAT 和防火墙限制通过 STUN 服务器进行通信的情况,需要大量带宽、CPU 和资源
STUN
- STUN 服务器用于发现 NAT 分配给特定用户的本地 IP 地址和端口号
- STUN 服务器有助于在两个不同 NAT 后面的设备之间建立直接连接
- STUN 是一种较简单的协议,在对称 NAT 和存在复杂防火墙规则的情况下会失效
如何测试STUN/TURN服务器的连通性
测试工具:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
需要用FF浏览器。 CHrome就会有问题。
客户给的一组数据 admin admin 175.178.213.69:3478 (这是测试服务器,不是我们的)
我们的服务器 106.14.213.55:3478 admin 123456
最下面还是有很多错误和超时
这是正常的结果,如下图
测试我们自己的服务器
“TurnServer”:”turn:106.14.213.55:3478″,
“TurnServerUsername”:”admin”,
“TurnServerPwd”:”123456″,
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/6608