转载: http://www.stars625.com/***passthrough.html

 

我们在使用×××连接时,由于×××数据是经过加密处理的,不同于普通的网络访问数据,在经过网关等网络设备时,有可能将×××数据作为损坏的数据丢弃,导致×××连接失败。这个时候我们可以通过开启NAT-T、NAT ALG等××× Passthrough功能。

××× Passthrough概述

××× Passthrough的应用场景主要有两种:一种是内网的×××客户端通过Passthrough访问远程的×××服务器;另一种是内网的×××服务器通过Passthrouth为远程的其它机器提供×××服务。对×××服务器的Passthrough需要根据××× Server的地址使用NAT工具进行端口映射,主要通过NAT功能实现,这里主要讨论第一种情况××× Client的Passthrough。

Passthrough的类型,按照×××的类型也有以下几种:IPSec Passthrough、PPTP Passthrough、L2tp Passthrough等。

在网关设备上,如果防火墙没有打开,那么在该情况下,所有包都是可以通过的;如果防火墙打开了,那么××× Passthrough功能就是要将×××服务需使用的协议、端口允许通过。如果在网关设备上开启了NAT功能,由于NAT与×××有一些冲突,那么Passthrough应该包含两个方面内容:一是PPTP的Passthrough;另外一种是L2TP/IPSec的Passthrough。对于PPTP,NAT中有相应的程序来支持其Passthough,e.g. Linux Netfilter里面的nf_nat_pptp.ko和nf_conntrack_pptp.ko模块。而对于IPSec的Passthough,基本上是×××客户端/服务器上通过启用NAT-T来实现,如果不使用NAT-T的话,那么NAT设备后的×××服务器只能建立一路IPSec连接。

IPSec Passthrough

IPSec在3个方面保证了网络数据包的安全:机密性、完整性、认证性。机密性就是保证数据包的原始内容不被看到;完整性即保证数据包的内容不会被修改;认证性保证数据来自被信任的客户端。因此不可避免地需要使用多种的加密算法来修改数据包的内容。修改后的数据包有2种主要的封装形式: AH (Authentication Header) 和ESP (Encapsulating SecurityPayload)。 AH在IP数据包中插入了一个包头,其中包含对整个数据包内容的校验值。AH只用于对IP 数据包的认证,而并不对数据包认证作任何修改。ESP用户加密整个数据包内容,同时也可以对数据包进行认证。AH和ESP 即可以同时使用也可以分开使用。

IPSec 在传输数据的时候也有2 种不同的模式:传输模式和隧道模式。传输模式主要用于主机到主机之间的直接通信;而隧道模式主要用于主机到网关或网关到网关之间。传输模式和隧道模式主要在数据包封装时有所不同(如图1 所示)。

 

在传输模式中,只有IP包的传输层部分被修改(认证或者加密);而在隧道模式中,整个数据包包括IP头都被加密或认证(如图2)。

 

 在多数情况下NAT 的处理对用户使用是完全透明的,但是当希望使用IPSec 技术组建××× 网络时,NAT 却带来了很大的麻烦。IPSec协议的主要目标是保护IP数据包的完整性,这意味着IPSec会禁止任何对数据包的修改。但是NAT 处理过程是需要修改IP 数据包的IP 头数据、传输层报文头数据甚至传输数据的内容(如FTP 应用),才能够正常工作。所以一旦经过IPSec 处理的IP 包穿过NAT设备时,包内容被NAT 设备所改动,修改后的数据包到达目的主机后其解密或完整性认证处理就会失败,于是这个报文被认为是非法数据而被丢弃。这就是组建××× 网关最常见的“IPSec 与NAT 协调工作”的问题。那么我们在什么时候会遇到这个问题呢?如果我们的××× 设备在NAT设备的后面,如果我们在外地上网需要通过×××客户端访问公司内网,如果我们没有合法的公网地址,只能通过服务商接入Internet 等等,都会遇到这个问题。

无论传输模式还是隧道模式,AH都会认证整个数据包。不同于ESP 的是,AH还会认证位于AH头之前的IP 头。当NAT 设备修改了IP 头之后,IPSec 就会认为这是对数据包完整性的破坏,从而丢弃数据包。因此AH 是绝对不可能和NAT 在一起工作的。

ESP模式在传输模式时会保护TCP/UDP头,但是并不保护IP头,因此修改IP 地址并不会破坏整个数据包的完整性。但是如果数据包是TCP/UDP数据包,NAT设备就需要修改数据包的校验值,而这个校验值是被ESP 所保护的,这样却会导致完整性校验失败。 所以最终可能和NAT一起工作的只能是隧道模式下的ESP。但是IKE和NAT工作时却有存在着冲突。

现在有许多的解决方案来解决NAT 和IPSec 共存问题,这里我们主要讨论一种最主要的解决方法:NAT-T和NAT穿越。

NAT-T设计简单,不需要改动已有的设备或者协议,只需要边界设备支持即可。这个技术的基本思路是在IPSec 封装好的数据包外再进行一次UDP 的数据封装。这样,当此数据包穿过NAT 网关时,被修改的只是最外层的IP/UDP 数据,而对其内部真正的IPSec 数据没有进行改动;在目的主机处再把外层的IP/UDP 封装去掉,就可以获得完整的IPSec 数据包。NAT-T在实际运作时,第一步是判断通信的双方是否支持NAT-T,这主要通过IKE协商时彼此发送的第一个数据包来判断。在判断双方均支持 NAT-T后,进入到第二步,去发现在上方的链路中间是否存在NAT设备,这一步通常成为NAT发现。NAT发现的原理实际上就是判断通信双发的IP 地址或者端口是否发生了改变。当发现NAT 设备以后,NAT-T 双方开始协商所采用的数据包封装方式,至此完成协商过程。

NAT穿越是在×××设备上进行设置,选择使用隧道模式下的ESP加密。

PPTP Passthrough

点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术。通过该协议,远程用户能够安全访问公司网络,并能拨号连入本地 ISP,通过 Internet 安全链接到公司网络。

PPTP 使用 GRE 的扩展版本来传输用户 PPP 包。这些增强允许为在 PAC 和 PNS 之间传输用户数据的隧道提供低层拥塞控制和流控制。这种机制允许高效使用隧道可用带宽并且避免了不必要的重发和缓冲区溢出。

在同一内网中只能正确建立一路PPTP连接,其他连接会在认证过程中止。这是因为在经过NAT设备时,NAT可能改变数据包中的端口信息,导致数据包不能正确识别。

为了解决NAT穿越问题,可以使用ALG模块。在Linux最新的内核中已经包含了PPTP相当的ALG模块,只需运行中加载相应模块,并且确保防火墙能正常通过即可。

综上,对于使用Linux系统搭建的网关设备要允许×××数据顺利通过可以在边际设备上启用NAT-T,或在网关设备上加载相关的ALG模块;如果是购买网关设备产品,要注意选择支持××× Passthough功能的产品,并开启××× Passthough功能。