简介
本文档介绍NAT (STUN)服务器对会话遍历实用程序的需求、关于STUN服务器的网络地址转换(NAT)设置类型、NAT如何导致此设置中的问题以及解决方案。
背景信息
NAT设备的主要用途是允许局域网(LAN)中具有私有IP地址的设备与公有地址空间(例如Internet)中的设备通信。但是,尽管NAT设备应该允许内部主机与公共空间连接,但当涉及到点对点(P2P)应用(例如VoIP、游戏、WebRTC和文件共享,其中最终用户需要同时充当客户端和服务器来维护双向端到端通信)时,NAT却难以建立这些UDP连接。通常需要NAT穿越技术才能使这些应用程序正常运行。
需要NAT穿越
如今,互联网上的实时语音和视频通信是支持VoIP呼叫的主流即时消息(IM)。最初采用VoIP的一大障碍是大多数PC或其他设备都位于防火墙之后并使用私有IP地址。通过带有NAT的防火墙,网络中的多个私有地址(IP地址和端口)映射到单个公有地址。但是,终端设备不知道其公有地址,因此无法在其VoIP通信中通告的私有地址上接收来自远程方的语音流量。
单方面自地址固定(UNSAF)过程是一些始发终端尝试确定或固定地址(和端口),而另一个终端知道此地址(和端口),例如,能够在协议交换中使用地址数据或通告其接收连接的公共地址。
因此,正在讨论的P2P连接是苏丹武装部队的进程。 P2P应用程序建立对等会话并保持NAT友好性的一种常用方法是,它们使用公共可寻址交汇服务器进行注册和对等体发现。
NAT会话遍历实用程序
根据RFC 5389,STUN提供处理NAT的工具。它提供了一种方法,使终端能够确定NAT设备分配的IP地址和端口,该地址与设备的私有IP地址和端口相对应。它还为终端提供保持NAT绑定活动状态的方法。
NAT实施类型
据观察,UDP的NAT处理方法因实施而异。实施中观察到的四种处理方法是:
全锥:全锥NAT是指来自同一内部IP地址和端口的所有请求映射到同一外部IP地址和端口的NAT。此外,任何外部主机都可以向内部主机发送数据包,并将数据包发送到映射的外部地址。
限制锥:限制锥NAT是来自相同内部IP地址和端口的所有请求映射到相同外部IP地址和端口的NAT。与全锥形NAT不同,外部主机(具有IP地址X)只有在内部主机之前向IP地址X发送过数据包时才能向内部主机发送数据包。
端口限制锥:端口限制锥NAT类似于限制锥NAT,但限制包括端口号。具体而言,只有当内部主机之前向IP地址X和端口P发送过数据包时,外部主机才能使用源IP地址X和源端口P向内部主机发送数据包。
对称:在对称NAT中,来自同一内部IP地址和端口到特定目标IP地址和端口的所有请求都映射到同一外部IP地址和端口。 如果同一主机使用相同的源地址和端口发送数据包,但目的地不同,则使用不同的映射。 此外,只有接收数据包的外部主机才能将UDP数据包发送回内部主机。
考虑源(A、Pa)(其中A是IP地址,Pa是源端口)通过NAT设备与目标(B、Pb)和(C、PC)通信的拓扑。
NAT实施类型 |
公共源(目的地为(B、Pb)) |
目的地为(C、Pc)的公共源 |
目标(例如: (B, Pb))是否可以将流量发送到(A, Pa)? |
全圆锥 |
(X1,Px1) |
(X1,Px1) |
Yes |
限制锥 |
(X1,Px1) |
(X1,Px1) |
仅当(A, Pa)首先将流量发送到B时 |
端口限制锥 |
(X1,Px1) |
(X1,Px1) |
仅当(A, Pa)首先将流量发送到(B, Pb)时 |
对称 |
(X1,Px1) |
(X2,Px2) |
仅当(A, Pa)首先将流量发送到(B, Pb)时 |
NAT遍历和对称NAT问题
STUN服务器响应STUN客户端发送的STUN绑定请求,并提供客户端的公共IP/端口。现在,STUN客户端在其点对点通信信令中使用了此地址/端口组合。但是,现在endhost使用相同的私有地址/端口(让我们假设绑定到STUN响应中提供的公共IP/端口),如果使用对称的NAT实施,则NAT设备会将其转换为相同的IP,但会转换为不同的端口。这会中断UDP通信,因为信令已根据上一个端口建立连接。
默认情况下,Cisco IOS® 路由器执行PAT时的NAT 实现是对称的。因此,您应该会看到执行NAT的这些路由器存在UDP连接问题。
但是,Cisco IOS-XE路由器执行PAT时的NAT实施不对称。当您发送具有相同的源IP和端口,但目的地不同的两个不同流时,源会被NAT到相同的内部全局IP和端口。
问题的解决方案
根据此说明,如果执行终端独立映射,显然可以解决此问题。
根据RCFC 4787:使用终端独立映射(EIM),NAT会针对从同一内部IP地址和端口(X:x)发送到任何外部IP地址和端口的后续数据包重用端口映射。
从客户端上,当终端主机在两个不同的终端窗口中运行nc -p 23456 10.0.0.4 40000和nc -p 23456 10.0.0.5 50000命令时,如果使用EIM,将产生NAT转换的结果:
Pro Inside global Inside local Outside local Outside global
tcp 10.0.0.1:23456 192.168.0.2:23456 10.0.0.4:40000 10.0.0.4:40000
tcp 10.0.0.1:23456 192.168.0.2:23456 10.0.0.5:50000 10.0.0.5:50000
在这里,您可以看到源地址和端口相同的不同流量被转换为相同的地址/端口,而与目标端口/地址无关。
在Cisco IOS路由器上,可以使用命令ip nat service enable-sym-port启用终端不可知端口分配。
https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/ipaddr_nat/configuration/15-mt/nat-15-mt-book/iadnat-fpg-port-alloc.html
摘要
当您使用端口地址转换(PAT)时,Cisco IOS NAT实施默认对称,当它传递需要服务器(如STUN)进行NAT穿越的P2P UDP流量时,可能会导致问题。您需要在NAT设备上明确配置EIM才能使此功能。