RPC系列协议--rfc5382--NAT Behavioral Requirements for TCP

摘要

本文档为处理TCP的nat定义了一组要求,这些要求允许许多应用程序(如对等应用程序和在线游戏)一致工作。开发满足这组需求的NATs将极大地增加这些应用程序正常运行的可能性。

1.适用性的声明

这个文档是[BEHAVE-UDP]的附属,它定义了许多与NATs相关的术语,列出了所有NATs的一般要求,并为处理IP和单播UDP流量的NATs设置了要求。本文档的目的是为处理TCP通信的nat设置需求。本规范的要求适用于[RFC 2663]中描述的传统NATs。

2.介绍

网络地址转换器(Network Address translator, NATs)会阻碍应用程序中的连接,其中会话可能会启动到内部主机。读者可以参考[RFC3022]了解关于传统nat的详细信息。[behahad -UDP]列出了在IP和UDP上下文中NATs的术语和要求。本文档通过为处理TCP通信的nat设置需求来补充这些要求。这里继承了[BEHAVE-UDP]中的所有定义和需求。
[RFC4614]记录了TCP从最初的定义[RFC0793]到现在的实现的演变。虽然TCP在拥塞控制和流量控制、安全性和对高带宽网络的支持方面发生了很大的变化,但是启动连接的过程(即连接的初始化过程)仍然是TCP的核心。在美国,3向握手或同时打开的方式变化不大。这是连接启动的过程NATs影响最大。实验方法,如T/TCP。
[RFC1644]提出了另一种连接启动方法,但是发现这种方法很复杂,容易受到拒绝服务攻击。因此,现代操作系统和nat主要支持[RFC0793]中描述的3路握手和同时打开的连接启动模式。
最近,人们设计了许多技术来实现跨nat的对等TCP应用程序。[STUNT], [NATBLASTER], and [P2PNAT] 描述了单边自地址修复(UNSAF)机制,该机制允许点对点应用程序通过nat建立TCP。这些方法只需要修改端点应用程序并使用符合标准的操作系统堆栈。然而,这些方法依赖于特定的NAT行为,这种行为通常(但并不总是)得到NATs的支持

3.术语

该规范中的“NAT”包括“基本NAT”和“网络地址/端口转换器(NAPT)”[RFC2663]。术语“NAT会话”改编自[NAT- MIB],定义如下。
NAT会话-通过NAT转换,NAT会话是内部领域的TCP会话和外部领域的TCP会话之间的关联。NAT会话将提供两个会话表示之间的转换粘合。本文档使用术语“TCP连接”(或者只是“连接”)来表示由4元组(源和目标IP地址和TCP端口)和初始序列号(ISN)标识的单个TCP流。本文档还使用了相关术语:地址和端口映射(Address and Port Mapping),端点独立映射(Endpoint-Independent Mapping), 地址相关映射(Address-Dependent Mapping), 地址和端口相关的映射(Address and Port-Dependent Mapping), 过滤行为(filtering behavior), 端点独立过滤(Endpoint-Independent Filtering),地址关联过滤(Address-Dependent Filtering), 地址和端口相关的过滤(Address and Port-Dependent Filtering), 端口分配(Port assignment), 端口超载(Port overloading), hairpinning and 外部源IP地址和端口(External source IP address and port)。

4.TCP连接初始化

本节描述适用于TCP连接初始化的各种NAT行为。

4.1 地址和端口映射行为

NAT使用映射来转换每个TCP连接的数据包。映射被动态地分配给从内部启动的连接,并可能被某些后续连接重用。对于不同的NAT,关于映射何时可以重用的NAT行为是不同的。
考虑一个内部IP地址和TCP端口(X: x),该端口启动一个到外部(Y1: y1)元组的TCP连接。让NAT为这个连接分配的映射为(X1’: x1’)。不久之后,端点开始从相同的(X: x)到外部地址(Y2: y2)的连接,并获得NAT上的映射(X2’: x2’);如果(X1’: x1’)等于(X2’: x2’)所有(Y2: y2)的值,那么NAT被定义为具有“Endpoint-Independent Mapping”行为。如果(X1’: x1’)仅当Y2 = Y1时才等于(X2’: x2’),那么NAT被定义为具有“Address-Dependent Mapping”行为。如果(X1’: x1’)等于(X2’: x2’)只有当(Y2: y2)等于(Y1: y1)时,才有可能在第一个外部地址终止后不久连续连接到相同的外部地址,如果NAT在TIME_WAIT状态下保持连接状态,那么NAT被定义为具有“Address and Port-Dependent Mapping”行为。这个文档引入了一个额外的行为,其中(X1’: x1’)永远不等于(X2’: x2’),即为每个连接分配一个新的映射;在这种情况下,NAT被定义为具有“Connection-Dependent Mapping”行为。

4.2 内部发起的连接

内部端点通过NAT发送SYN包启动TCP连接。NAT为连接分配(或重用)映射,如前一节所述。映射定义了用于转换该连接的所有数据包的外部IP地址和端口。特别是,对于内部客户端启动到外部服务器的连接的客户机-服务器应用程序,映射用于转换出站SYN、产生的入站SYN-ACK响应、后续出站ACK和用于连接的其他包。这种连接启动方法对应于3路握手(在[RFC0793]中定义),并受到所有NATs的支持。
点对点应用程序使用另一种称为同时打开的连接发起方法([RFC0793])来遍历NAT。在同时打开的操作模式中,两个对等点都为同一个TCP连接发送SYN数据包。SYN包在网络中交叉。接收到另一端的SYN包后,每一端都响应一个SYN-ACK包,这个包也在网络中交叉。一旦接收到同步ACK,就认为建立了连接。从NAT的角度来看,内部主机的SYN包由同一个连接的入站SYN包满足(与3路握手期间的SYN-ACK包相反)。随后的交换,出站和入站同步ACK都可以看到连接。一些NAT错误地阻塞了正在进行的连接的入站SYN。一些NATs阻塞或错误地翻译出站同步ACK。这样的行为会破坏TCP同时打开,并阻止点对点应用程序在NAT之后正确地运行。
为了TCP提供网络地址转换服务,NAT必须正确地接收、转换和转发符合TCP状态机的有效转换的所有数据包([RFC0793])。

4.3 外部发起连接

NAT为内部端点发起的第一个连接分配到外部端点的映射。在某些情况下,NAT的策略可能允许对从外部到内部端点发起的连接重用此映射。与前面一样,考虑一个内部IP地址和端口(X: x),当它启动到外部(Y1: y1)的连接时,分配(或重用)一个映射(X1’: x1’)。外部端点(Y2: y2)试图通过向(X1’: x1’)发送一个SYN来启动与内部端点的连接。NAT可以选择允许建立连接,也可以选择不允许连接。如果NAT选择允许连接,它将转换入站SYN并根据现有映射将其路由到(X:x)。它还转换(X: x)响应生成的SYN-ACK,并将其路由到(Y2: y2),依此类推。另外,NAT可以通过过滤入站SYN来拒绝连接。
如果外部发起的连接的安全策略允许,NAT可能允许现有映射被该连接重用。如果一个NAT允许从所有(Y2: y2)开始连接,那么它被定义为具有“Endpoint-Independent Filtering”行为。如果NAT只在Y2等于Y1时才允许连接初始化,那么NAT被定义为具有“Address-Dependent Filtering”行为。如果NAT只在(Y2: y2)等于(Y1: y1)时才允许连接初始化,那么NAT被定义为具有“Address and Port-Dependent Filtering”行为(可能只在第一个连接终止后不久,但映射仍然是活动的)。此文档中定义的另一个过滤行为是当NAT不允许任何外部连接初始化时;在这种情况下,NAT被定义为具有“Connection-Dependent Filtering”行为。“Address and Port-Dependent Filtering”与“Connection-Dependent Filtering”行为的区别在于,前者允许入站SYN在第一个连接的TIME_WAIT状态下发起新连接,而后者则不允许。

5.NAT会话刷新

NAT维护与正在进行的连接和已建立的连接相关联的状态。因此,NAT很容易受到资源耗尽攻击,攻击者(或病毒)在内部试图让NAT创建比它拥有的资源更多的状态。为了防止这样的攻击,NAT需要放弃会话来释放状态资源。
一种仅适用于TCP的常见方法是优先为崩溃的端点放弃会话,然后是关闭的TCP连接和部分打开的连接。NAT可以通过发送一个TCP保持活动包并接收一个TCP RST包来检查一个会话的端点是否已经崩溃。如果NAT无法确定端点是否处于活动状态,那么在TCP连接空闲一段时间之前,它不应该放弃会话。请注意,已建立的TCP连接可以无限期地保持空闲(但处于活动状态);因此,不存在适用于所有应用程序的闲置超时的固定值。然而,由[RFC1122]中的建议引发的大量空闲超时可以减少放弃活动会话的机会。
TCP连接经过三个阶段:部分打开、建立和关闭。在部分打开阶段,端点同步初始序列号。该阶段由连接的第一个SYN发起,并一直扩展,直到两个端点都发送了设置了ACK标志的包(TCP状态:SYN_SENT和SYN_RCVD)。两个方向的ACK都标志着已建立的阶段的开始,在这个阶段,应用程序数据可以无限期地交换(TCP声明:ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2和CLOSE_WAIT)。当两个端点通过发送FIN包终止了它们的一半连接时,结束阶段就开始了。一旦在两个方向上都看到FIN包,应用程序数据就不能再交换了,但是栈仍然需要确保接收到FIN包(TCP声明:关闭和LAST_ACK)。
TCP连接可以无限期地保持在已建立的阶段,而不交换任何数据包。一些终端主机可以配置为在这样的空闲连接上发送keep-alive数据包;默认情况下,如果启用,这样的存活包每2小时发送一次[RFC1122]。因此,一个等待略多于2个小时的NAT可以检测到空闲连接,而保持活动的数据包则以默认的速率发送。另一方面,处于部分打开或关闭阶段的TCP连接在等待传输中的数据包时最多可以保持空闲4分钟[RFC1122]。

6.其他适用于TCP的要求

6.1 端口分配

允许不同的内部端点同时使用相同映射的NAT被定义为具有“端口重载”的“端口分配”行为。这种行为是不可取的,因为它阻止共享相同映射的两个内部端点同时建立到公共外部端点的连接。

6.2 Hairpinning行为

转发来自内部地址的数据包,目的地是与内部地址的活动映射相匹配的外部地址,返回到该内部地址的NAT被定义为支持“hairpinning”。如果NAT给hairpinning包一个外部源IP地址和端口即将其定义为具有用于hairpinning的“外部源IP地址和端口”。为了允许两个内部端点(仅通过它们的外部映射地址相互了解)彼此通信,必须使用hairpinning。hairpinning的“外部源IP地址和端口”行为避免了期望外部源IP地址和端口的混乱实现。

6.3 ICMP对TCP数据包的响应

一些TCP机制依赖于接收由传输TCP段触发的ICMP错误消息。其中一种机制是path MTU discovery [RFC1191],它是正确运行TCP所必需的。当前的路径MTU发现机制要求TCP段的发送方收到ICMP“数据报太大”响应的通知。

温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_20677327/article/details/105996834
今日推荐