Linux内核工程导论——网络:服务质量与安全性


QoS

产生原因

数据包在传输的过程中默认情况下对路由器是无差别对待的。路由器认为所有的包都只不过是包,我尽力送达,送不达的无论是谁的包,发给谁的,都对不起了,扔掉。

         然而社会也是不平等的,网络服务也不可能平等。自有某一些包具备较高的优先级,不被有限扔掉,或者是被优先的服务。区别不同优先级并提供不同服务的方法叫QoS(Quality of Service)。

         QoS的产生并不是只是因为用户的不同需求。在大背景上看,分立的各个用户对网络不同质量的要求,远远没能到让整个传输网络都升级并且增加计算量的程度。可以有很多更轻量的办法来解决(例如ISP接入层次的速度限制和流量控制)。这里的QoS并不单指接入,整个传输网络的QoS支持代表一种势不可挡的需求,这种需求不可能来自于个别的用户。在三网融合的过程中,IP网络展现了巨大的魅力,确切的说从其一诞生开始,IP网络就开始击败一切的对手(AplleTalk、ISO、Netware、novell等),迅速占领整个以因特网和以太网,并且向嵌入式网络、电力网、设备通信协议等专用网络协议渗透。但是这些都是小的竞争对手,最大的是电话网和电视网,这两个网络的特点是实时性和多媒体特性。原有的IP网络的不负责任的做法就注定了除非在带宽非常充分的情况下,一定会有不少用户投诉。

         KK有一个上行创造的理论。IP本身没有野心,使用IP的人也没有太大野心,但是作为一个整体,IP协议栈表现出智能的侵略性。现在,这个整体智能要向最大的仍存在的对手宣战:电话网和电视网。也只有这种级别的对手,才能让整个IP网络有动力去自发的发生变化,并不需要一个整体的架构设计和强大的推动。这就是QoS普及的源动力。

概述

         既然决定了要提供这种服务,what已经清楚。接下来要确定的就是how。最先的是要怎样区别不同优先级的数据包。在不同的协议层次通过各自的域只能不同的优先级的值,可以用来描述当前数据包的优先级,也就是说优先级由数据包携带。也可以通过路由器本身根据在路由器上定义的规则,例如哪个目的地址到哪个,或端口到端口的优先级配置,来动态的检测数据包的优先级,决定为其提供的服务。

         术语将区分QoS分为了两类:集成式的和区分服务。集成式的就是路由器根据规则决策,指定决策规则的方法是通过一个叫做RSVP带宽预留协议。用户使用这个协议与路由器通信,路由器会将用户指定的带宽预留给用户。区分服务的就是数据包携带优先级,由于数据包有很多个层次,在哪一层携带都是可行的,由于不同层对网络具有的不同的认知能力,所以不同层携带的优先级编码注定只能代表本层的认知。例如IP层的TOS(DSCP)代表了IP数据包的优先级(从源IP地址到目的IP地址)。加上TCP/UDP层的端口的概念就变成了一个socket到另一个socket这个抽象的数据流的优先级的概念。路由器来决定使用数据包或者数据流的概念来区分不同的优先级。

         区分了不同的优先级后,要决定怎么对待不同优先级的数据包或流。典型的对待方式是保证速度,保证质量,限速(整形),优先丢弃,最省钱方式等。分为两大类:整形和策略。整形是速度控制,策略是丢弃决定。路由器能做的,也只能如此。策略算法有很多种,整形算法也有很多种。计算机科学就是通过这种划分与专门治理得到快速发展的。将不同优先级的数据或数据流放入不同的队列,不同队列采取不同的对待方式,分阶段的完成QoS。

优先级划分

         拿出优先级划分深入单讲。因为在编程的世界里,数据结构是算法的基础,在国际世界里,领土划分是国际关系的基础,物理属性是根本。怎样划分就能很大程度上影响怎样使用,甚至划分本身也是根据怎样使用而制定的。

         前面有说过,划分可以在不同的层次。常见的是MAC 802.1p和IP层的TOS还有ATM的服务类别。但是目前在使用过程中,还是IP层的TOS完全胜出,所以只讨论TOS。

         TOS是IP协议的定义的IP头部的一个域。不是这个域的存在所以才可以做QoS,而是由QoS的需求才设计了这个域。这个域虽然有8个字节,但是这8个字节的具体定义却是逐渐确定的。最早的RFC 791中只使用了6个比特用于定义优先级,而在RFC 2474(DSCP)中使用了全部的8个比特,详细定义各种服务划分。

         前面说的TOS是一种思想,叫做QoS,但是实际的完整的QoS需要对网络的改造太大,实际上因特网上几乎没有真正完整的QoS实现。有一种比较简单的QoS叫做COS(class of service),这不是针对服务质量,而是针对服务种类。这么看文字游戏比较难理解。是指上,COS只区分优先级,总是优先发送高优先级的数据,低优先级的缓存待空闲时发送,或者在缓存不足时直接丢弃。而QoS保证的是质量,不是优先级。这个质量主要是指为实时的应用留出带宽,是一种预留,而不是一种数据包来了后的判断。使用QoS预留带宽必须要首先说明预留的量,其他的用户的丢包率控制在可接受的水平。QoS保证的是质量,不是通过优先级来确定哪个包优先通过,而是通过服务的类型来决定。

不要将CoS与QOS(服务质量)混淆,CoS是优先级队列形式,已在大量通信和连网协议中使用。它是一种基于应用类型(话音、视频、文件传输、事务处理)、用户类型(CEO,秘书)或其他设置对数据分组区分类别并区分优先级次序的方法。

CoS是一种排队规则,而QOS包括用以管理带宽和网络资源的更广范围的技术。CoS通过检查数据分组参数或CoS标记对数据分组区分等级,并基于预定义的标准将数据分组放在不同优先级的队列中。QOS涉及到保证一定的网络性能级别以满足业务合同或支持实时通信。对于QoS'要使用一些方法在发送数据分组前在网络上预留带宽。大部分情况下Cos是二层ISL或者802.1Q数据帧的优先级标记,3个bit,范围0-7与IP层的TOS表达的意思一致。而QoS是一种统称。这些术语用着用着就混了,明白原理就可以了。

NAT

概述与分类

NAT是一种将一个IP域与另外一个IP域映射起来的方法。其目的是向主机提供透明的路由。传统上,NAT是用来将一个独立的私有的没有注册的IP域与另外一个外部的带有全球唯一注册地址的IP域映射。

NAT的作用是绑定一个可以在外网通信的地址和一个内网私有的地址。这种绑定可以查表式的静态绑定(一直不变),也可以是根据需求和可用资源动态产生的动态绑定。静态绑定适用于内网机器较少,或者需要稳定的对外地址的情况下。动态绑定由于可以回收和重新分配地址资源,适用于机器较多,资源较紧张的情况。

NAT分为:Traditional NAT, Bi-directional NAT, Twice NAT, MUltihomed NAT

其中tranditionalNAT较为常见,分为basic NAT, NAPT。

Basic NAT 是一种将内网的IP地址与外网的IP地址关联绑定的技术。只作用于IP层。NAT设备(一般为路由器)持有多个全局IP地址,将内网的IP地址与全局的IP地址绑定映射,可以采用静态映射,或根据需求的动态映射。

NAPT 的运作条件是NAT设备(一般为路由器)只有一个IP地址,而内网有很多私有地址需要区别的外部通信。这时,NAT设备利用传输层的端口机制将内网的socket(IP:port)唯一映射为外网的IP:port。这种方法可行的原因是,大部分情况下,端口是有很多空余的,此时,内网所有用户用到的端口总数就是NAT设备需要用到的端口。端口资源耗尽时将无法正常映射。所以此种方法在较大的网络(超过6万台机器)可能出现问题。

锥形NAT是针对每个内网的IP:PORT,无论该地址向多少个外网发起多少连接,NAT设备只给其固定分配一个外网可用的IP:PORT地址。而对称NAT则是在内网同个IP:PORT发起不同连接时给其分配不同的外网可见的IP:PORT地址,并且只有在内网首先与外网通信后,外网才可与内网通信,而锥形NAT有多种方式如下。

锥形NAT分为(一般该分类只用在UDP,因为TCP的方式是统一的)

l  全双工锥形NAT。一旦一个内网的IP:PORT与NAT设备的外网可用IP:PORT绑定,外部的所有用户只要知道了该外网绑定的地址,就可以通过与这个地址的通信与内网建立连接。

l  受限制锥形NAT:与全双工不同的是,当内部地址与外部地址发起session时,NAT设备会记录该外部IP地址,只有被NAT记录的外部IP地址(不限端口)才可以通过把数据传给射射的外网可用地址将数据传进内网的地址。也即,只有内网与外网地址通信过,该外网才可与内网通信。

l  端口受限锥形NAT

在受限制的锥形NAT的基础上,不只是限制通信过的外网IP地址,而且必须是通信过的IP:PORT地址。也即,只有之前内网给外网的IP:PORT发送过数据,该IP:PORT地址才可发送数据给内网。

Basic NAT仅用于有足够多的全球唯一的IP地址的情况下,因为他要为内网的所有有通信需求的机器分配一个不重复的外网唯一IP。当NAT设备没有足够的外网IP地址时,或者只有一个时,就该启用NAPT。通过将IP:port映射,完成地址复用。这样的问题是不但会修改IP头部,还会修改传输层的头部,导致校验的全部重新计算。并且在有用到传输层头部的应用(如ftp),都需要重新修改以适应地址的变换,针对不同上层应用的NAT修改程序叫ALG。

 

安全性

         由于NAT的使用,使得IPSec失效,安全问题就必须考虑。由于NAT具有动态绑定的的特性,可以使内网主机不容易受到攻击,并且经常与防火墙共同使用。

锥形NAT具有解决UDP天然不安全机制的能力。由于UDP无法跟踪发送者,导致主机一旦暴漏了自己的地址,就会收到任意的UDP包,只要目的地址正确。锥形NAT通过受限和端口受限两种级别来过滤源地址,保证收到的UDP数据包是自己想要收到的。但是简单的机制具有盲目性,如果内网想要接收不受限制的UDP访问,比如运行服务器程序,限制就会阻碍服务器的正常运行。

所以,全双工NAT这种不受限制的访问适用于NAT内网运行服务器程序时,受限的两种级别可以应用于不运行服务程序的内部对安全程序的不同要求。

NAT穿透

请参考如下网络拓扑并回答问题:


Linux内核工程导论——网络:服务质量与安全性_第1张图片

在图示的网络拓扑中,两个主机都位于NAPT网关之后,如何让Host1和Host2之间建立起多条UDP连接?

Host1与host2为p2p的两个节点,server为服务器,其作用就是打洞,让host1与host2建立多条TCP连接。

由于在极端情况下(端口受限)host1与host2之间必须互相在特定的端口发送过才能互相通信。而这之前是没有发过的,甚至互不知晓,服务器的责任就是让host1与host2互相知道对方的IP:PORT地址。

知道之后,host1的IP:PORT与host2的互相发送信息,此时,各自的NAT就会记录通信记录,虽然第一次会不成功,但之后的通信就可以建立。此时,打洞完成,host1与host2可以自由的通信协商,以建立多条连接。

ALG

FTP的PORT命令和PASV命令都用到IP地址和TCP端口,而NAT会修改这两个地址,FTP ALG是运行在NAT设备上的,其目的就是检测这种情况并做合适的转换。除此之外,FTP ALG还必须要为FTP的数据会话调整参数准备状态。

FTP主动连接的数据传输的过程是,由之前已经建立的控制连接发送port命令,命令的参数是数据连接的IP:port地址,服务器在接收到这个地址之后,就向这个地址启动数据连接,开始发送数据。如果port命令所携带的IP和port是错误的(没有FTP ALG),数据连接不能正常建立。此时,与服务端有没有FTP ALG无关。

在被动连接时,客户端需要用PASV命令向服务端请求一个IP:PORT,服务端通过response通知目的地址自己已经打开的供数据连接使用的IP:PORT,这个地址,用户端的NAT不会翻译,因为其是外部的源地址,对于NAT来说,外部数据知会翻译目标地址,所以PASV数据包可以正常到达。所以,FTP的被动模式在用户端不需要FTP ALG(若服务端也工作在NAT之后,则服务端的NAT就需要FTP ALG)。

综上:主动模式下,用户端需要FTP ALG。被动模式下,服务端需要FTP ALG。

还有:DNS-ALG、ICMP、GRE、PPTP、ESP等

你可能感兴趣的:(linux,linux,网络,tcp,kernel,内核)