NAT 穿越

本文是对 NAT、NAT 穿越、STUN、TURN 和 ICE 的概述。
NAT
NAT 和 TCP
考察一个由地址为 10.0.0.126 的无线客户端发起的 TCP 连接,其目标是 Web 服务器主机 www.isoc.org(IPv4 地址 212.110.167.157)。在私人段内发起连接的数据包可表示为(10.0.0.126∶9200;212.110.167.157∶80)。NAT/防火墙设备作为客户端的默认路由器,将会收到第一个数据包,数据包的源 IP 地址会被修改为 NAT 路由器的外部接口的 IP 地址,变为(63.204.134.177∶9200;212.110.167.157∶80)。除了转发数据包之外,NAT 还创建一个内部状态记住当前正在处理一个新连接(称为 NAT 会话 NAT Session)。这种状态至少包括一个由客户端的源端口号和 IP 地址组成的条目(称为 NAT 映射 NAT mapping)。当 Internet 服务器回复时会用到这些信息。服务器会采用客户端初始选择使用的端口号来回复端点(63.204.134.177:9200),即 NAT 的外部地址。这种形为被称为端口保留(port preservation)。通过比对收到的数据包的目的端口号与 NAT 映射条目,NAT 能够确定发起请求的客户端的内部 IP 地址。在我们的例子中,这个地址是 10.0.0.126,所以 NAT 将回复的数据包从(212.110.167.157∶80;63.204.134.177∶9200)改为(212.110.167.157∶80;10.0.0.126∶9200),并对其进行转发。然后客户端收到对其请求的响应。
NAT 会话会根据 TCP 连接的建立与终止中的数据包,以及一些计时器来清除。
NAT 和 UDP
UDP 也有如上对应的 NAT 映射,但是 UDP 没有连接的建立与终止,所以会采用一个映射计时器(mapping timer)来清除 NAT 的状态,当数据包从内部传输到外部时 NAT 就刷新(NAT 的对外刷新行为)或反之亦然(NAT 的对内刷新行为)。 IP 分片并不能被 NAT 或 NAPT 正确处理。
过滤行为
过滤行为就是转发行为的方向,对独立于端点的 NAT 行为,只要为内部主机创建了映射,无论来源如何,都将允许任何传入的流量。对依赖于地址的过滤行为,仅当 X1∶x1 之前访问过 Y1 时,才允许 Y1:y1 传输流量到 X1∶x1。对于那些依赖于地址和端口的 NAT 过滤行为,仅当 X1∶x1 之前访间过 Y1:y1 时,才允许 Y1∶y1 传输流量到 X1∶x1。
NAT 穿越
针孔和打孔
一个 NAT 通常包括流量重写和过滤功能。当一个 NAT 映射创建时,针对特定应用程序的流量通常允许在 NAT 的两个方向传输。这种映射是临时的,通常只适用于在执行时间内的单一应用程序。这类映射被称为针孔(pinhole),因为它们被设计为只允许通过一部分的临时信息流量(例如,一对 IP 地址和端口号组合)。随着程序之间的通信,针孔通常动态地创建和删除。
通过采用针孔试图使位于 NAT 之后的两个或两个以上的系统直接通信的方法称为打孔(hole punching)。一个客户机需通过一个向外的连接来访问一台已知的服务器,这样便在本地的 NAT 中创建了一个映射。当另一个客户机访问同一台服务器时,由于服务器和每个客户机均有连接,因此知道它们的外部寻址信息。它然后在客户机之间交换它们的外部寻址信息,一旦知道了这个信息,一个客户机便可以尝试直接连接到其他的客户机。
STUN
NAT 会话穿越工具 Session Traversal Utilities for NAT,STUN 是一个相对简单的客户机/服务器协议,它能够在多种环境中确定在 NAT 中使用的外部 IP 地址和端口号。
TURN
利用 NAT 中继的穿越 Traversal Using Relays around NAT 为两个或多个系统提供了一种通信方式,即使它们均位于并未协作的 NAT 后。
ICE
交互式连接建立 Interactive Connectivity Establishment 用于帮助位于 NAT 后的 UDP 应用程序主机建立连接,ICE 使用了其他协议,如 TURN 和 STUN,ICE 首先需要确定一组每个代理都能够用来与其他代理进行通信的候选传输地址(candidate transport address),这些地址可能是主机传输地址、服务器反向地址或中继地址,ICE 根据优先分配算法对这些地址进行排序,相比于那些需要中继的地址,该算法为能够提供直接连接的地址分配更大的优先级,然后,ICE 为对等代理提供优先的地址集合,其中对等带来也会有类似的行为,最终,两个代理商量好一套最好的可用地址,并将选择的结果告知对方。