计算机网络原理(TCP/IP协议七):防火墙和网络地址转换

  • 防火墙
  • 网络地址转换
  • NAT穿越
  • 配置包过滤防火墙和NAT
  • IPv4/IPv6共存和过渡中的NAT
  • 与防火墙和NAT相关的攻击

 一、防火墙

常用的两种防火墙:代理防火墙(proxy firewall)、包过滤防火墙(packet-filter firewall)。它们之间的区别是所操纵的协议栈的层次及由此决定的IP地址和端口号的使用,包过滤防火墙是一个互联网路由器,能够丢弃符合(或者不符合)特定条件的数据报。从Internet客户端的角度来看,代理防火墙则是一个多宿主的服务器主机,也就是说它是TCP和UDP传输关联的终点,通常不会在IP协议层中路由IP数据报。

1.1包过滤防火墙

包过滤防火墙作为互联网路由器,能够过滤(filter)(丢弃)一些网络流量。

过滤器:包过滤器一般都可以配置为丢弃或转发数据包头中符合(或不符合)特定标准的数据包,这些标准称为过滤器(filter)。简单的过滤器包括网络层或传输层报头中各个部分的范围比较,最流行的过滤器包括:IP地址或者选项、ICMP报文的类型、数据包中端口号确定的各种UDP或TCP服务。

无状态和有状态的防火墙:一般简单的包过滤器防火墙是无状态的,而更复杂的防火墙是有状态的。无状态的防火墙单独处理每一个数据报,而有状态的防火墙能够通过关联已经或者即将到达的数据包来推断流或者数据报的信息,即那些属于同一个传输关联(transport association)的数据包或构成同一个IP数据报的IP分片。IP分片使得防火墙的工作变得更复杂,无状态包过滤防火墙极易被混淆。

上面是一个典型得包过滤防火墙得配置,防火墙作为IP路由器位于一个“内”网和“外”网之间,有时是在第三个“DMZ”或外联网,只允许某些特定得流量通过。一种常见得配置是允许所有从内网到外网得流量通过,但相反得方向只许小部分的流量,当使用一个DMZ时,只许从Internet访问其中的某些特定服务。

如图所示一个典型的包过滤器防火墙是一个有着三个网络接口的互联网路由器:一个”内“接口、一个”外“接口、一个”非军事区“(DMZ)接口。DMZ子网能够访问外联网或DMZ,其中部署的服务器可供互联网用户访问。

网络管理员会安装过滤器或访问控制列表(Access Control Lists,ACL)到防火墙中,ACL列出了什么类型的数据报需要被丢弃或转发的基本政策,这些过滤器将会全力拦截来自外网的恶意流量,但不会限制从内网到外网的流量。

1.2代理防火墙

代理防火墙并不是真正意义的互联网路由器,相反,它们本质上是运行一个或多个应用层网关(Application-Layer Gateways,ALG)的主机,该主机拥有多个网络接口,能够在应用层中继两个连接/关联之间的特定类型的流量。它们通常不像路由器那样做IP转发,虽然现在已经有结合各种功能的更复杂的代理防火墙。

代理防火墙作为一个多宿主的Internet主机,终止在应用层的TCP和UDP的连接,它不像一个传统的IP路由器,而更像一个ALG,单个应用程序或代理为了其所支持的每个服务,必须具备和代理防火墙进行通信交互的能力。

对于代理防火墙,防火墙的客户端通常会做特殊配置以便关联(或者连接)到代理防火墙,而不是连接到实际提供所需服务的真正的终端主机。(能够和代理防火墙以这种方式交互的应用需要提供相应的配置选项。)通常这些防火墙作为多宿主主机,即便具备IP转发的能力也是被禁用的。与包过滤防火墙一样,一种常见的配置是以”外“接口分配一个全局路由的IP地址,为”内“接口分配一个私有IP地址。因此,代理防火墙支持使用私有地址范围。

虽然这种类型的防火墙是非常安全的(一些人认为,这种防火墙从根本上比包过滤防火墙安全),但它是脆弱(brittleness)和缺乏灵活性为代价的。特别是,因为这种类型的防火墙必须为每个传输层服务设置一个代理,任何要使用的新服务必须安装一个相应的代理,并通过该代理来操作发起连接。此外,必须配置每个客户端以便能够找到代理(例如使用Web代理自动发现协议或WPAD[XIDAD],当然也有一些代理的方法,如所谓的捕捉代理就能够处理某类型的所有流量,而不管其目标地址如何)。至于部署方面,这些防火墙在所有被访问的网络服务均能提前确定的环境中能工作的很好,但是添加额外的服务可能需要网络运营者的重大干预。

代理防火墙的两种常见形式是HTTP代理防火墙(HTTP proxy firewall)[RFC2616]和SOCKS防火墙协议(Web),这些协议是非常普遍的,因此这些代理会被经常使用。这些代理对于内网用户来说就像是Web服务器,对于被访问的外部网站来说就像是Web客户端。这种代理往往也提供Web缓存(Web cache)功能。这些缓存保存网页的副本,以便后续访问可以直接从缓存中获取,而不需要访问原始的Web服务器。这样做的好处是可以减少显示网页的延迟,提高用户访问网站的体验。一些Web代理也经常被用作内容过滤器(content filter),能够基于”黑名单“来阻止用户访问某些Web网站。相反,在互联网上还可以找到一些所谓的隧道代理服务器(tunneling proxy server)。这些服务器(例如篇siphon和CGIProxy)本质上执行相反的功能,以避免用户被内容过滤器封阻。

SOCKS协议比HTTP代理访问使用更为广泛,可用于Web之外的其他服务。目前正在使用的SOCKS有两个版本:版本4和版本5。第4版为代理传输提供了基本的支持,而第5版增加了强大的认证、UDP传输和IPv6寻址。为使用SOCK代理,应用程序在开发时必须添加SOCKS代理支持功能(即它必须是能够被代理的),同时通过配置应用程序能够获知代理的位置及其版本。一旦配置完成,客户端使用SOCKS协议请求代理进行网络连接,也可以选择性地进行DNS查找。

 二、网络地址转换

网络地址转换(NAT)本质上是一种允许在互联网的不同地方重复使用相同的IP地址集的机制,建立NAT的主要动机是当时急剧减少的有限IP地址空间,使用NAT最常见的情况是,唯一Internet连接的站点仅被分配了很少的几个IP地址(甚至只有一个IP地址),但内部却有多台主机需要同时上网。当所有进出的流量均被通过一个单独的NAT设备时,该设备将内部系统的地址空间和全球互联网地址空间分割开,因此所有的内部系统可以使用本地分配的私有IP地址访问互联网。

NAT的引入用于解决两个问题

IP地址枯竭和关于路由器扩展性的担忧;

无类域间路由(CIDR)解决了路由扩展性问题;

NAT存在的几个缺点

需要做特殊的配置才能使处于NAT内部的主机能够提供互联网访问的服务,因为互联网上的用户无法直接访问具备私有地址的主机。

每个隶属同一个连接或关联的双向数据报都必须通过相同的NAT。这是因为NAT必须重写每个数据包的寻址信息,以便私有地址空间的系统和Internet主机之间能够正常通信。

NAT和互联网协议的基本宗旨是背道而驰:“智能边缘(smart edge)”和“哑巴中间(dumbmiddle)”。为了完成工作,NAT需要跟踪每个关联(per-association(或每个连接per-connection))的连接状态,其操作贯穿多个协议层,并不像传统的路由器。修改IP层地址也需要同时修改传输层的校验码。

NAT的工作原理:重写通过路由器的数据包的识别信息。在数据传输的两个方向上,将传出数据包的源IP地址变为NAT路由器中面向Internet的网络接口地址,而不是原始主机的接口地址;将传入数据包的目的IP地址变为NAT路由器面向本地网络接口的地址,而不是原来的Internet的网络接口地址。

大多数的NAT同时执行转换(translation)和包过滤(packet filtering),包过滤的标准取决于NAT的动态状态。包过滤策略的选择可能会有不同的粒度,例如,NAT如何处理非请求的数据包取决于和目标IP地址和/或源和目的的端口号。处理的行为在不同的NAT上会有所不同,有时甚至在同一个NAT上也会随时间变化而变化,这使得运行在NAT后面的应用带来了各种挑战。

2.1传统NAT:基本NAT和NAPT

很多年来NAT没有的行为都没有精确的定义,但根据NAT思想行为的不同实现,对已经出现的NAT类型进行分类可以分为:基本NAT和网络地址端口转换(Network Address Port Translation,NAPT)[RFC3022]。

基本NAT:只执行IP地址的重写,本质上就是将私有地址改写成公共地址,一般都是基于ISP提供的地址池或共有地址范围。这种类型的NAT不是最流行的,因为它无助于减少需要使用的IP地址数量,全局可路由的地址数量必须大于或等于希望同时访问Internet的内部主机数量。

网络地址端口转换(NAPT):使用传输层标识符(即UDP和TCP端口,ICMP查询标识符)来确定一个特定的数据包到底和NAT内部哪台私有主机关联。这样就可以实现内部多台主机共用一个公共地址,通过公共地址的不同的端口号或ICMP查询标识符来关联内部主机的私有地址。

接下来的内容所说的NAT将同时包括传统的NAT和NAPT,除非区分很重要才会特别区分使用名称。下面是基本NAT和NAPT地址转换的示例:

在NAT“后面”或者“内部”使用的私有地址范围不受除了本地网络管理员之外的任何人限制。因此,有可能私有范围内采用全局地址空间。原则上,这是可以接受的,但是全局地址也被互联网上另一个实体使用时,在私有范围内的本地系统可能无法到达使用相同地址的公共系统,这是因为采用相同地址的本地系统会屏蔽掉使用相同地址的远端系统。为了避免这种不良情况的发生,保留了三个IPv4地址范围作为私有地址范围使用[RFC1918中]:10.0.0.0/8、172.16.0.0/12、196.168.0.0/16。这些地址范围经常被用作嵌入式DHCP服务器的地址池的默认值。

为了保证私人地址领域和公共领域中的主机之间的正常通信,虽然在实践中可以使用各种策略,一个共同的策略是:几乎允许所有的传出及其返回流量通过NAT,但几乎阻断所有传入的新连接请求。此行为抑制了试图确定可利用的活动主机的IP地址“探测”攻击,此外NAT对外“隐藏”内部地址的数量和配置,一些用户认为这些拓扑信息是专有的并应保密,NAT有助于这汇总所谓的拓扑隐藏。

关于NAT需要适合他们所支持的协议和应用程序,NAT是如何处理其支持的每个主要传输协议的,以及如何在IPv4/IPv6混合环境中被使用,这其中的许多行为细节是IETF的BEHVE(Behavior Engineering for Hindrance Avoidance)工作组的讨论主题,2007年开始,BEHVE已经完成了一些文件,阐明了NAT的一致行为。

2.1.1NAT和TCP

互联网中最为主要的传输层协议是TCP,使用一个IP地址和端口号来标识一个链接的每一端。每个连接由两端组成,每个TCP连接有两个IP地址和两个端口号唯一标识。当发起一个TCP连接时,“主动发起者”或客户端通常发送同步包(SYN)到“被动发起者”或服务端。服务器端通过回复一个自己的SYN数据包来进行响应,同时还包括一个对客户端的SYN数据包进行确认的ACK数据包,客户端回复一个ACK数据包给服务端,通过这样的“三次握手”创建了连接。类似的结束(FIN)数据包被用于优雅的关闭连接,也有可能通过重置(RST)数据包来强行关闭。与TCP相关的传统NAT行为要求定义在[RFC5382]中,主要涉及了TCP的三次握手。

由2.0中的家庭网络为例,由NAT后面的10.0.0.126的无线客户端发起的TCP连接,其目标是Web服务主机www.isoc.org(IPv4地址212.110.167.157),下面基于这个操作的每个步骤来解析NAT和TCP的工作机制(假设客户端的端口号是9200,www.isoc.org服务的端口号是80):

①在NAT后面的无线客户端发起连接数据包表示为10.0.0.126:9200;212.110.167.157:80,NAT/防火墙设备作为客户端的默认路由器收到数据包后发现是一个新的连接(TCP报头中的SYN标志位是打开的)。如果策略允许(通常会允许,因为这是一个向外发起的连接),数据包的源IP地址会被修改为NAT路由器的外部接口的IP地址。因此,当NAT转发这个数据包的时候,其寻址是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映射条目,NAT能够确定发起请求的客户端的内部IP地址。基于NAT映射条目的内部客户端地址和端口号,将服务器发送过来的数据包寻址信息改写为212.110.167.157:80;10.0.0.126:9200,然后转发给NAT后面的客户端主机。

在上面的例子中只描述了正常情况下建立一个NAT会话,并未说明该会话是如何被清除的。正常情况下会话状态将会在交换FIN数据包之后被删除,但并不是所有TCP连接都是正常关闭的。要解析NAT在非正常情况下如何请求会话,就要先了解NAT中的两个重要机制:连接计时器、会话计时器。

NAT连接计时器:NAT在检测到一个传入的SYN数据包后会激活连接计时器(connection timer),如果回复的ACK数据包在计时器到期之前还未到达,则该会话状态将被清除。

NAT会话计时器:如果ACK数据包在NAT连接计时器的时间内到达,连接计时器被清除,并创建一个超时较长的会话计时器(session timer),会话计时器一般采用小时替代分钟为计时单位。在会话计时到期前,NAT可能会通过内部的端点发送一个额外的数据包用来确认会话是否已经终止(称为探测probing),如果NAT收到主机响应探测请求的ACK,则重制会话计时器,并不会删除会话。如果没有收到探测的响应,在关闭会话计时器超时之后或者收到一个RST数据包,则表明连接已终止,状态将被清除。

BEHAVE工作组在[RFC5382]中指出,一个TCP连接可以被配置为发送“存活”(keepalive)数据包,在该配置被启用时其默认的发送速率是两个小时一个数据包。否则,一个TCP连接可以一直保持下去。然而,当一个连接被建立或者清除时,其最大的空闲时间是4分钟。因此,[RFC5382]要求(REQ-5)NAT在判定所创建的连接是否已经断开前至少需要等待2小时4分钟,而判定部分打开或关闭的连接是否已经断开前至少需要等待4分钟。

一个TCP NAT面临的棘手问题是如何处理位于多个NAT内部的主机上运行的对等(peer-to-peer)应用[RFC5128]。一部分应用程序采用了“同时发起连接”(simultaneous open)的技术,让连接的每一端均作为客户端同时发送SYN数据包。TCP能够响应SYN+ACK的数据包,完成连接的速度比三次握手还要快,但目前有许多NAT并不能正确地处理这种情况。为此,[RFC5382]要求(REQ-2)NAT处理所有有效的TCP包交换,尤其是这种连接同时打开的情况。某些对等应用程序(如网络游戏)便采用这种行为。

此外,[RFC5382]还规定NAT将会静默丢弃那些一无所知的传入的SYN数据包,这可能会发生在同时发起一个连接时,即当外部主机的SYN数据包先于内部主机的SYN数据包到达NAT主机时,虽然这种情况发生的可能性不大,但在出现时钟错误时确实会发生。如果传入的外部SYN数据包被丢弃,内部的SYN数据包还有时间来建立这个由外部SYN数据包代表的NAT映射。如果在6秒内没有接收到内部的SYN数据包,NAT可能会向外部主机发送一个错误信号。

2.1.2NAT和UDP

针对单播UDP的NAT行为要求定义在[RFC4787]中。NAT在处理一系列UDP数据包时所出现的问题,与处理TCP时出现的问题大多数一样。但是UDP有些不同,不像TCP它没有连接建立和清除的过程。更具体的说,它没有标识位,如用SYN、FIN和RST这些位来表示一个会话的创建或销毁。此外,它是基于两个端点的地址/端口号的组合。为了处理这些问题,如果一个绑定在“近期”没有被使用,UDP NAT会采用一个映射计时器(mapping timer)来清除NAT的状态。用多大的计时器值来表示“表示”变化很大,而[RFC478/7]要求计时器至少为2分钟,推荐5分钟。一个相关的问题是计时器何时刷新。当数据包从内部传输到尾部时NAT就刷新(NAT的对外刷新行为)或反之亦然(NAT的对内刷新行为)。[RFC4787]要求NAT保证对外的刷新行为,对内刷新行为是可选的。

还记得在计算机网络原理(TCP/IP协议五):internet协议中介绍的,UDP和IP数据包可以被分片,分片允许一个IP数据报跨越多个块(碎片),其中每个都是作为一个独立的数据报。但由于UDP是在IP层之上,为此除了第一个分片之外,其他的分片并没有包含端口号信息,而这是保证NATPT正确操作所必须的信息。这同样也适用于TCP和ICMP,因此,在一般情况下,分片并不能被NAT或NAPT正确处理。

2.1.3NAT和其他传输协议(DCCP,SCTP)

 

posted @ 2023-01-20 21:19  他乡踏雪  阅读(789)  评论(0编辑  收藏  举报