本文主要取材于 《网络是怎样连接的》 第五章。
目录
5.1 Web服务器的部署地点
5.2 防火墙的结构和原理
5.3服务器负载平衡
5.4 使用缓存服务器分担负载
5.5 内容分发服务
简述:本文主要内容是解释 网络包如何朝服务器前进,并通过服务器前面的防火墙、缓存服务器、负载均衡器等。
- 为了保护服务器免受攻击,一般会在服务器前面部署防火墙,包过滤方式的防火墙可根据接收方IP地址、发送方IP地址、接收方端口号、发送方端口号、控制位等信息来判断是否允许某个包通过。不过这种无法检查包内数据的威胁。
- 单个服务器无法承载过多的访问量,因此需要分布式架构即多个服务器来分担流量,此时需要一个机制来分配客户端的请求。可通过DNS或者负载均衡器方式来分配请求。
- 缓存服务器通过缓存一些数据同样可以分担流量,但是Web运营者弄缓存服务器的代价高。
- 厂商来部署缓存服务器,并租借给Web服务器运营者,称为内容分发服务。部署好缓存服务器后最重要的是如何分配用户请求(一般要选择离客户端最近的服务器),因此如何判断客户端 到各个缓存服务器的距离很重要,有DNS扩展或者重定向等方法。另外,还需要及时更新缓存服务器保证数据的同步。
5.1 Web服务器的部署地点
如果客户端都可以直接访问服务器,那么服务器相当于在裸奔,容易受到攻击;防火墙可以先检查包,再转发包。
Web服务器既可以部署在公司内部,如下图(a)和(b),也可以部署在运营商的数据中心如(c)。数据中心是与运营商核心部分NOC直接连接的,或者是与运营商之间的枢纽IX直接连接的,可以提高访问速度。
5.2 防火墙的结构和原理
防火墙的基本思路是只允许发往特定服务器中的特定应用程序的包通过,然后屏蔽其他的包。
但是如何设置包过滤规则呢?
IP过滤:可以先根据接收方和发送方地址判断包的流向,并设置是允许还是阻止。
通过端口过滤应用程序包:要限定某个应用程序时,可以在判断条件中加上TCP头部或者UDP头部中的端口号。当包的接收方IP地址为Web服务器地址,且接收方端口号为80时,允许这些包通过(图5.2中表的第1行);或者当包的发送方IP地址为Web服务器地址,且发送方端口号为80时,允许这些包通过(图5.2中的表的第3行)。
通过控制位判断连接方向:TCP在执行连接操作时需要收发3个包,其中第一个包的TCP控制位中SYN为1,而ACK为0。其他的包中这些值都不同,因此只要按照这个规则就能够过滤到TCP连接的第一个包。如果这第一个包是从Web服务器发往互联网的,那么我们就阻止它(图5.2表中的第2行)。这样设置之后,当然也不会收到对方返回的第二个响应包,TCP连接操作就失败了。
公司内网访问公开区域:我们不仅要设置互联网和公开区域之间的包过滤规则,还需要设置公司内网和互联网之间,或者公司内网与公开区域之间的包过滤规则
包过滤方式的防火墙不仅可以允许或者阻止网络包的通过,还具备地址转换功能。当使用地址转换时,默认状态下是无法从互联网访问公司内网的。
包过滤方式的防火墙可根据接收方IP地址、发送方IP地址、接收方端口号、发送方端口号、控制位等信息来判断是否允许某个包通过。
防火墙可以根据包的起点和终点来判断是否允许包通过,但这样并不能筛选出所有有风险的包。如包中包中含有特定数据,会使服务器宕机。应对方式有两种:一是修复Bug防止宕机;二是在防火墙之外部署用来检查包的内容并阻止有害包的设备或软件。
5.3服务器负载平衡
当很多用户同时访问时,无论服务器的性能再好,仅靠一台服务器还是难以胜任的。在这种情况下,使用多台服务器来分担负载的方法更有效,这种成为分布式架构。若部署多个服务器,从而减轻每个服务器的访问量,需要一套机制将客户端发送的请求分配到每台服务器上。
1.通过DNS服务器来分配。当访问服务器时,客户端需要先向DNS服务器查询服务器的IP地址,如果在DNS服务器中填写多个名称相同的记录,则每次查询时DNS服务器都会按顺序返回不同的IP地址。
缺点是:若一台Web服务器出现了故障,这时希望在返回IP地址时能够跳过故障的Web服务器,然而普通的DNS服务器并不能确认Web服务器是否正常工作。
此外,轮询分配还可能会引发一些问题。在通过CGI等方式动态生成网页的情况下,有些操作是要跨多个页面的,如果这期间访问的服务器发生了变化,这个操作就可能无法继续。
2.使用负载均衡器。首先要用负载均衡器的IP地址代替Web服务器的实际地址注册到DNS服务器上,假设有一个域名www.lab.glasscom.com,我们将这个域名对应的IP地址设置为负载均衡器的IP地址并注册到DNS服务器上。于是,客户端会认为负载均衡器就是一台Web服务器,并向其发送请求,然后由负载均衡器来判断将请求转发给哪台Web服务器.
负载均衡器可以定期采集Web服务器的CPU、内存使用率,并根据这些数据判断服务器的负载状况,也可以向Web服务器发送测试包,根据响应所需的时间来判断负载状况。
对于有关联性的请求,可以在发送表单数据时在里面加上用来表示关联的信息。或者对HTTP规格进行扩展,在HTTP头部字段中加上用来判断相关性的信息。这样,负载均衡器就可以通过这些信息来作出判断,将一系列相关的请求发送到同一台Web服务器,对于不相关的请求则发送到负载较低的服务器了。
5.4 缓存服务器分担负载
将整个系统按功能分成不同的服务器,如Web服务器、数据库服务器。缓存服务器就是一种按功能来分担负载的方法。
缓存服务器是一台通过代理机制对数据进行缓存的服务器。代理介于Web服务器和客户端之间,具有对Web服务器访问进行中转的功能。当进行中转时,它可以将Web服务器返回的数据保存在磁盘中,并可以代替Web服务器将磁盘中的数据返回给客户端。这种保存的数据称为缓存,缓存服务器指的也就是这样的功能。不过Web服务器更新了数据,会造成缓存不可用。
正向代理,反向代理和透明代理不详细讲。
5.5 内容分发服务
缓存服务器放在放在服务器之前,易于管理但是无法减少网络流量;放在客户端,可减少网络流量但是无法管理;放在网络边缘可以达到均衡。
一些厂商来部署缓存服务器,并租借给Web服务器运营者。这种服务称为内容分发服务。提供这种服务的厂商称为CDSP(content delivery service provider), 缓存服务器可以缓存多个网站的数据,因此CDSP的缓存服务器就可以提供给多个Web服务器的运营者共享,从而降低了成本。
在使用内容分发服务时,互联网中有很多缓存服务器,如何才能从这些服务器中找到离客户端最近的一个,并让客户端去访问那台服务器呢?
对DNS服务器进行扩展:作为准备,需要事先从缓存服务器部署地点的路由器收集路由信息(图5.13)。DNS服务器根据路由表查询从本机到DNS查询消息的发送方,也就是客户端DNS服务器的路由信息。例如,根据图5.13路由器A的路由表,可以查出路由器A到客户端DNS服务器的路由。通过互联网内部的路由表中的路由信息可以知道先通过运营商X,然后通过运营商Y,最后到达运营商Z这样的信息,通过这样的信息可以大致估算出距离。依次查询所有路由器的路由表之后,我们就可以通过比较找出哪一台路由器距离客户端DNS服务器最近。提供路由表的路由器位于缓存服务器的位置,而客户端DNS服务器也应该和客户端在同一位置,这样就等于估算出了缓存服务器与客户端之间的距离,从而能够判断出哪台缓存服务器距离客户端最近了。
重定向服务器分配访问目标:
HTTP规格中定义了很多头部字段,其中有一个叫作Location的字段。当Web服务器数据转移到其他服务器时可以使用这个字段,它的意思是“您要访问的数据在另一台服务器上,请访问那台服务器吧。”这种将客户端访问引导到另一台Web服务器的操作称为重定向,通过这种方法也可以将访问目标分配到最近的缓存服务器。
对DNS服务器进行扩展的方法是估算客户端DNS服务器到缓存服务器之间的距离,因此精度较差;相对而言,重定向的方法是根据客户端发送来的HTTP消息的发送方IP地址来估算距离的,因此精度较高。
缓存的更新方法:
让Web服务器在原始数据发生更新时,立即通知缓存服务器,使得缓存服务器上的数据一直保持最新状态,这样就不需要每次确认原始数据是否有变化了,而且从第一次访问就可以发挥缓存的效果。内容分发服务采用的缓存服务器就具备这样的功能。