阅读须知:笔记为阅读《TCP IP 详解卷1:协议》后摘抄的一些知识点,其间也有加入一些根据英文原版的自己翻译和结合网上知识后的理解,所以有些段落之间并不能够串联上或者知识点与书上略有差别(基本差别不大,参考的资料属RFC官方文档)。
第七章:防火墙和网络地址转换
防火墙是位于内部网和外部网之间的屏障,是系统的第一套防线,作用是防止非法用户的进入。
网络地址转换是一种IP数据包通过路由器或防火墙时通过重写来源IP地址或目的地址的技术,可以用来隐藏或保护内部网络,同时也用来缓解IPv4资源紧缺(NAT普遍还是用于多台主机共用一个公有IP地址访问Internet网)。
防火墙
防火墙最常见的两种是代理防火墙和包过滤防火墙,它们之间的主要区别是所操作的协议栈的层次及由此决定的IP地址和端口号的使用。包过滤防火墙是一个互联网路由器,能够对由外向内的流量进行过滤,丢弃符合(或者不符合)特定条件的数据包,一般而言由内向外的流量不做控制。简单的过滤器包含网络层或者传输层报头中各个部分的范围比较,常见的包括IP地址或选项、ICMP报文类型、根据数据包中端口号确定各种UDP或TCP服务。
一个典型的包过滤防火墙如下图:
图中防火墙有三个接口,一个是对内的,一个是对外的,一个是"隔离区(DMZ)"的接口。
其中"隔离区"部署的服务器可供外网访问,其目的就是为了解决安装防火墙后外网对内网服务器的访问问题,是一个"安全区"和"非安全区"之间的缓冲区。
包过滤防火墙还分为有状态和无状态。有状态包过滤防火墙能够关联已经或者即将到达的数据包来推断流或者数据报的信息,继而将属于同一个传输关联的数据包或构成一个IP数据报分片;无状态包过滤防火墙则单独处理每一个数据包。
以Linux中的iptables为例,iptables包含过滤表格和过滤链的概念,一个表格包含许多预定义的链以及自定义的链。三个预定义的表格为:filter、nat和mangle。
1. filter表格用于处理基本的包过滤,包括预定义了INPUT、FORWARD、OUTPUT三条链,这些动作分别对应于目的地是防火墙路由器本身运行程序的流量、路由时通过防火墙的流量以及从该防火墙主机发出的流量。
2. nat表格包含PREROUTING、OUTPUT、POSTROUTING三条链。
3. mangle表格有五条链,用于任意修改数据包。
每条过滤链是一个规则列表,每条规则包含匹配条件及其对应的动作(也称为target,目标),这些动作可能执行预定义的动作如:ACCEPT、DROP、QUEUE、RETURN。
1. ACCEPT(DROP)指将数据包转发(丢弃)。
2. QUEUE指数据包将被提交给一个用户程序处理。
3. RETURN指处理将在之前触发的一条链中继续,形成一种包过滤链子调用。
Linux系统可用iptables命令配置包过滤防火墙:Try `iptables -h' or 'iptables --help' for more information.
代理防火墙则不作为路由器,而是作为运行一个或多个应用层网关(ALG)的主机。对于代理防火墙内的主机,通常会做特殊配置以便关联到代理防火墙,而不是连接到实际提供所需服务的终端主机。这个类型的防火墙相对是非常安全的,但牺牲的也是脆性和灵活性,因为每个传输层服务丢需要设置一个代理,任何要使用的新服务必须安装一个相应代理,并通过该代理来操作发起连接。代理防火墙结构如下图:
代理防火墙常见的有HTTP代理防火墙和SOCKS防火墙。前者也称为Web代理,只用于HTTP和HTTPS协议,该代理常见的是功能有提供Web缓存、基于"黑名单"阻止用户访问Web网站;SOCKS防火墙用于Web之外的其他服务。
NAT
网络地址转换(NAT)允许在互联网的不同地方重复使用相同的IP地址集。看似与IP地址是主机在网络上唯一标识的规则相违背,先看看NAT怎么实现的吧。
如图是一个将私有地址及其内部系统与Internet网络隔离的NAT:
如上图,私有地址的数据报不会直接在互联网上路由,而是有经过NAT路由器,NAT路由器内存在内外网络地址相互对应的地址池(基础NAT维护的是无端口号NAT表,NAPT支持端口映射的网络地址转换,也就是带端口的NAT表),数据包在NAT路由器内经过网络地址的转换后由NAT路由器传输到互联网就行路由而达到正确的目的主机。
然而,NAT也让内外主机之间的通信变得复杂而导致通信效率的降低。
除了转发数据包外,NAT还会在内部创建一个状态用以记住当前正在处理的一个新连接,称为NAT会话。对于NAT处理TCP请求,分别可以以TCP连接的SYS、ACK、FIN来标识连接的状态,从而使得NAT路由器有效的清除会话状态;而UDP则不同,UDP并没有标识位,只有基于两个端点的地址/端口号的组合。为了处理UDP会话状态的清除问题,NAT采用一个映射计时器,[RFC4787]要求计时器至少为2分钟,推荐5分钟,还要求NAT保证对外的刷新,对内的刷新行为则是可选的。
NAT作为防火墙,同时也支持一些数据过滤功能。当客户希望访问位于同一个NAT私有地址空间内的服务器时,就会产生一个NAT环回,其过程是下面的:
1. 主机A和主机B处于同一个NAT私有地址空间内,A希望访问B,如果A知道B的私有地址,则可以直接访问,但如果不知道B的私有地址,则需要向NAT服务器发送数据包;
2. NAT数据包接收到数据包后,根据NAT内的私有地址的关联表来映射到对应的B的私有地址;
3. 从NAT服务器发送到主机B的数据包如果包含的"地址信息"是NAT中A的关联地址,则B向A又通过NAT来通信。
于是... 形成了NAT环回。
在对于UDP/TCP这些可很好的被NAT支持的协议时,无须NAT做其他操作,但是当应用层协议与他们一起携带传输层或更低层的信息,如IP地址时,NAT的问题就变得复杂多了。如FTP交换传输及网络层的端点信息,当传输大量数据时可以增加额外的连接,这时候经过的NAT不仅仅是改写数据报的IP地址和端口号那么简单了,两者的改写同时导致有效载荷本身信息的改写,如数据报的序列号、大小修改...具备有效载荷编辑的NAT被称为NAT编辑器。
NAT穿越
由于如NAT编辑器的复杂性,一种可代替的方案是应用程序尝试实现NAT穿越。NAT穿越通过NAT映射(针孔)实现。当NAT映射创建时,针对特定应用程序的流量通常允许在NAT的两个方向传输,这种映射是临时的,通常适用于在执行时间内的单一应用程序,映射会随着程序之间的通信动态创建和删除。
其过程如下:
1. 私有地址S1的内部主机A和外部服务器C通信,私有地址S2的内部主机B和外部服务器C通信;
2. 由于服务器C和每个客户机都有连接,因此知道它们的外部寻址地址(NAT向外的接口IP地址及端口),于是C向主机A和主机B共享这些信息;
3. 于是位于S1的主机A可以直接根据服务器C提供的地址访问S2的指定地址/端口从而到达与主机B通信。
STUN(NAT会话穿越工具)是NAT穿越中确定地址的主力协议,TURN(NAT中继的穿越)是一个特定的STUN用法,通过一个通常位于互联网的经过特殊配置的TURN服务器来中继流量,ICE(交互式连接创建)通过使用本地信息和由STUN和TURN确定的地址来确定一对通信端点之间所有可能的地址。
STUN是一个客户机/服务器协议,依赖在互联网上能被访问的公共STUN服务器,能够在多种环境下确定在NAT中使用的外部IP地址和端口号。 STUN服务器的主要工作是回显发送给它的STUN请求,以确定客户端的寻址信息。STUN基础协议有两种类型的事务:请求/响应事务和标志事务。基础的STUN头部信息如图:
报文类型字段给出方法和类型(请求、响应、错误、成功);
报文长度字段提供一个最大为2的16次方-1字节的完整STUN报文长度;
事务ID用于匹配请求和响应,或者在标志情况下用于调试;
每个STUN报文能够包含0个或者多个属性,这取决于STUN的特定用法。
*注意:如果NAT是受限圆锥型或端口受限圆锥型[一(端口)对多(IP/端口)],双方必须一起开始传输。
TURN通过6种方法、9个属性以及6个错误响应代码增强STUN。大致可以分为支持建立和维护分配、认证以及操作隧道。6种方法和它们的方法号如下:分配(Allocate)(3),刷新(Refresh)(4),发送(Send)(6),数据(Data)(7),创建权限(CreatePermission)(8),隧道绑定(ChannelBind)(9)。前两种方法用于建立并保持分配存活;Send和Data使用STUN报文封装从客户端发送到服务器的数据,反之亦然;CreatePermission用于创建或刷新一个权限,ChannelBind通过一个16位的隧道号与一个特定的对等客户端相关联;错误报文表明与TURN功能相关的间题,如认证失败或资源耗尽(隧道)。
ICE用于帮助位于NAT后的UDP应用程序主机建立连接。ICE使用并扩展了“请求/应答”协议,如单播SIP连接建立时的会话描述协议(SDP)。
通常ICE用于创建两个SDP实体的通信,过程如下:
1. 首先需要确定一组每个代理都能够用来与其他代理进行通信的候选传输地址;
2. ICE可同时使用STUN和TURN来确定候选的传输地址,接着根据优先分配算法对这些地址进行排序,相比于那些需要中继的地址,该算法为能够提供直接连接的地址分配更大的优先级;
3. 然后ICE为对等代理提供优先的地址集合,其中对等代理也会有类似的行为;
4. 最终两个代理商量好一套最优的可用地址,并将选择的结果告知对方。
IPv4/IPv6共存及NAT
由于一系列的原因,IPv4和IPv6将会共存很长的一段时间,甚至可能是无期限的...这就需要网络支持IPv4和IPv6系统之间的通信。目前用于支持IPv4和IPv6组合的两种方式是隧道和转换。隧道方法包括Teredo、双协议栈精简版(DS-Lite)、IPv6快速部署(6rd)。
Teredo(又称为面向IPv6的IPv4 NAT网络地址转换穿越),是一项地址分配和自动隧道技术,能够跨越IPv4 Internet实现IPv6单播连接,为能够通过 IPv4 NAT,IPv6数据包作为基于IPv4的用户数据包协议(UDP)消息发送。
DS-Lite(双协议栈精简版)指在一台设备上同时启用IPv4协议栈和IPv6协议栈,这台设备既能和IPv4网络通信,又能和IPv6网络通信。如果这台设备是一个路由器,那么这台路由器的不同接口上,分别配置了IPv4地址和IPv6地址,并很可能分别连接了IPv4网络和IPv6网络。如果这台设备是一个计算机,那么它将同时拥有IPv4地址和IPv6地址,并具备同时处理这两个协议地址的功能。
IPv6快速部署(6rd)是一种特殊格式的PD(Prefix Delegation),以支持服务提供商快速部署IPv6。在DHCP Option的OPTION_6RD选项中保存IPv6 6rd前缀,用于根据客户已分配的IPv4地址为客户网站分配IPv6地址。
NAT64[RFC6146]被用于支持只有IPv6的客户机与其他IPv4服务器进行通信。作为一个NAT,NAT64符合BEHAVE规格,支持独立于端点的映射,以及独立于端点和依赖于地址的过滤。因此,它是和上文的NAT穿越技术(如ICE、STUN、TURN)兼容的。一个NAT64设备被赋予一个IPv6前缀,能用于形成一个有效的IPv6地址。
由于IPv4地址空间的不足,在IPv6到IPv4这个方向的转换利用了一个动态管理的IPv4地址池。这需要NAT64支持NAPT的功能,据此多个不同的IPv6地址可能会映射到一个相同的IPv4地址上。NAT64目前定义了由IPv6节点初始化的TCP、UDP和ICMP报文的转换方法。
NAT64对于到达的传输层校验和不为0的TCP或者UDP分片,可能会将分片排队,然后一起或者单独地转换它们。NAT64必须处理分片,即便是那些乱序到达的。一个NAT64可能被配置一个时限,限制分片被缓存的时间(至少为2s)。否则,NAT可能受到DoS攻击,耗尽保存分片的包缓冲空间。
小结
"防火墙、网络地址转换、IPv4/IPv6共存问题的解决方案"的相关知识点远不止上文描述,文中知识仅当看书了解一下,做知识的拓展,并未深入的做学习和研究。