部署防火墙的方式

  1. 直接部署在公司网络,并且可以从互联网直接访问
    1. 缺点:
      1. IP地址不足,因为这个方式需要公司网络中所有设备包括服务器和客户机都分配公有地址
      2. 安全问题,从互联网传过来的包会无节制的进入服务器,服务器基本处于“裸奔”状态
  2. 部署防火墙,防火墙只允许指定服务器的指定应用程序的网络包通过,从而屏蔽其他不允许通过的包
    1. 防火墙屏蔽了不允许外部访问的应用程序,即便这些程序存在安全漏洞,用于攻击的网络包也进不来
  3. 将服务器放在网络运营商管理的数据中心里
    1. 数据中心直接通过高速线路直接连接到互联网核心部分,因此速度很快
    2. 专人防护,抗震,门禁,安全

image.png

防火墙

基本思路:允许发往服务器特定应用程序的包通过,屏蔽其他包

如何设置包过滤的规则?
网络包的头部包含了用于控制通信操作的控制信息,只要检查这些信息,就可以获得很多有用的内容。

通过接收方IP和发送方IP,我们可以判断出包的起点和终点。
从互联网发送过来的包,其起点是不确定的,但是终点是确定的,可以设定规则,允许符合规则的包通过。
收到包后,服务器需要确认应答,需要服务器向互联网发送包,可以将起点为服务器地址的包设置为通过
但是,这样是危险的。

因为这相当于允许了互联网和Web服务器之间所有包通过,这个状态很危险。
如果服务器还有另一个文件服务器在工作,那么这些文件很可能会被非法访问而造成信息泄露。

通过端口号限制应用程序

要限定某个应用程序的时候,可以在判断条件中加上TCP头部或者UDP头部的端口号。
WEB服务器的端口号是80,那么在刚才接收方IP和发送方IP地址是80的基础上再加上端口80作为条件就可以了。
这样:

  1. 接收方IP为服务器且端口号是80,允许通过
  2. 发送方IP为服务器且端口号是80,运行通过

通过控制位判断

如何组织服务器访问互联网呢?
Web使用的是双向收发网络包的,因此如果单纯组织从Web服务器发往互联网的包,则Web响应请求的时候也会有错误。
所以光判断包的流向是不够的,必须根据访问的方向进行判断,就需要用到TCP头部的控制位

TCP在执行连接的时候需要收发三个包,其中第一个包SYN=1,ACK=0,其他包中这些值都不同,可以按照这个规则过滤TCP中的第一个包

但是对应UDP应用来说,比如DNS,因为UDP没有使用连接,所以无法根据控制位来判断方向,所以无法设置这么一个规则来值允许公司内部访问互联网上的DNS而组织从互联网访问公司内部的DNS服务器
这时候,要么冒一定风险允许该应用程序的所有包通过,要么牺牲一定的便利性阻止该应用程序的所有包通过。

防火墙失效

防火墙只关心包的起点终点,因此即使包中包含可以引发宕机的数据,防火墙也无法发现,于是包被放行了。到达服务器时候,引发宕机,只有检查包的内容才能识别这个风险,因此防火墙无能为力。

应对:

  1. 修复服务器的BUG
  2. 在防火墙之外部署用来检查包的内容并阻止有害包
    1. 并不完美,因为包内容有没有风险是由Web服务器有没有Bug决定的,因此服务器有bug但没有被发现时候,无法判断包中的风险。

负载均衡

用户很多时候,一台服务器力所不及,需要有多台服务器。

  1. 采用多台服务器,减少每台服务器的访问量
    1. 必须有一个机制将客户端的请求平均分配到每台服务器上
      1. 使用DNS来分配,访问服务器时候,客户端需要先向DNS服务器查询服务器的IP地址,如果在DNS服务器中填写多个名称相同的记录,则每次查询时候DNS服务器按顺序返回不同的IP地址(轮询)
        1. 缺点1是如果有一台服务器故障了,普通的DNS服务器无法跳过故障的Web服务器
        2. 缺点2有些操作是跨页面的,如果这时候,服务器发生了切换,则操作可能无法完成
        3. image.png
  2. 使用负载均衡器分配访问
    1. image.png
    2. 使用负载均衡器的IP地址代替Web服务器的实际地址注册到DNS服务器上,客户请求得到域名IP的时候,返回的是负载均衡器的IP地址,客户访问的是负载均衡器,然后由负载均衡器来判断请求转发给哪台服务器
    3. 关键在于:如何判断将请求转发给哪台Web服务器
      1. 判断操作是否跨页面,跨页面则必须将请求发给同一台服务器
      2. 根据服务器的负载情况来进行判断
        1. 定期采集Web服务器的CPU、内存使用率,根据这些数值来判断服务器的负载情况
        2. 不查询服务器的负载,根据实现设定好的服务器性能指数,按比例分配请求

缓存服务器

将整个系统按功能分成不同的服务器,如Web服务器、数据库服务器
缓存服务器就是一种按功能来分担负载的方法

缓存服务器是通过代理机制来对数据进行缓存的服务器
代理介于服务器和客户端之间,具有对Web服务器访问进行中转的功能
进行中转时候,它将Web服务器返回的数据保存到磁盘中,并可以代替Web服务器将磁盘中的数据返回给客户端。
这种数据被成为缓存,缓存服务器指的也就是这样的功能

Web服务器需要执行检查网址和访问权限,以及在页面上填充数据等内部操作,因此将页面数据返回客户端所需时间较长;相对的,缓存服务器只要将保存在磁盘上的数据读取出来发送给客户端就可以了,因此可以比Web服务器更快的返回数据。
但是如果在缓存数据之后,Wev服务器有了更新,缓存的数据就不能使用了,因此缓存并不是永久有效。
如果页面数据每次都不同,这些缓存也无法使用。

但是无论如何,总有一部分访问是无需经过Web服务器,而由缓存服务器直接处理的。

工作流程

image.png

  1. 将缓存服务器的IP地址代替Web服务器的IP地址交给DNS服务器
  2. 客户发送HTTP的时候,缓存服务器会收到消息
  3. 从客户端角度来,缓存服务器就相当于Web服务器,接下来缓存服务器检查请求消息的内容,看看请求的数据是不是已经保存在缓存中。
    1. 如果不存在缓存:在HTTP头部加上一个Via字段,表示这个消息经过缓存服务器转发,然后将消息转发给Web服务器。
      1. 如果只有一台Web服务器,无条件转发
      2. 如果Web服务器有多台,根据请求的内容判断应该转发给哪台Web服务器,可以根据请求消息的内容来判断转发给哪台Web服务器,比如/dir1/….转发给服务器1,/dir2/…转发给服务器2
      3. 缓存服务器会以客户的身份向目标Web服务器发送请求消息(先创建套接字,然后连接到Web的套接字上,发送请求消息,从Web服务器来看,缓存服务器就相当于客户端),缓存服务器收到Web服务器的响应
      4. 然后缓存服务器在响应消息上加上Via头部字段,表示这个消息是通过缓存服务器中转的,然后缓存服务器以Web服务器的身份向客户端发送响应消息;同时缓存服务器将响应消息保存到缓存里,并记录保存时间
    2. 如果存在缓存:
      1. 缓存服务器会添加一个If-Modified-Since头部字段加上上次缓存的时间将请求转发给Web服务器,询问Web服务器用户请求的数据是否以发生变化。
      2. Web服务器根据字段值检查如果在指定时间内没有数据变化,就返回一个没有变化的响应消息(304 Not Modified),而后缓存服务器发送响应给客户
      3. 如果服务器有数据变化,参照不存在缓存的情况;Web服务器会返回最新版本的数据,缓存服务器加上Via字段给客户端,同时数据保存在缓存中。

正向代理

在客户端一侧部署缓存服务器,称为正向代理。

举个例子:   我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

作者:hbzyin 链接:https://juejin.cn/post/6844903502448164878 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

image.png
目的:

  1. 实现缓存服务器
  2. 实现防火墙
    1. 如图,代理先收到客户端的请求,然后转发到互联网中,可以实现只允许必要的包通过。
    2. 而且代理在转发的时候可以查看请求的内容,所以可以根据内容判断是否允许访问;可以禁止员工访问危险的网站或者与工作无关的网站。包过滤方式的防火墙只能根据IP地址和端口号进行判断,因此无法实现这一目标

使用:

  1. 使用正向代理,一般需要在浏览器的设置窗口中的“代理服务器”一栏填写正向代理的IP地址,浏览器发送请求消息的过程也会发生相应的变化
    1. 没有设置正向代理的时候,浏览器根据网址栏中输入的http://字符串判断Web服务器的域名,然后向其发送消息
      1. 提取出web服务器域名后面的文件名或者目录名,将其作为请求的URI发送
    2. 设置了正向代理,浏览器忽略网址栏的内容,直接将所有请求发送给正向代理
      1. 请求的URI字段填写完整的http://网址
      2. 正向代理转发消息时候也和服务器端的代理不同,使用正向代理,URI为完整的网址,因此根据这个网址来进行转发,不需要向服务端的缓存服务器那样事先设置好要转发目标Web服务器,而且可以发送任意Web服务器;而服务器端的缓存服务器只能向事先设置好的目标进行转发

image.png
防火墙 分布式 - 图7
image.png

反向代理

将请求消息中的URI的目录名与Web服务器进行关联,使得代理能够转发一般的不包含完整网址的请求消息。
前面说的部署在服务端的缓存服务器就是这种方式。

反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理的作用:
(1)保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击
大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
防火墙 分布式 - 图9

(2)负载均衡,通过反向代理服务器来优化网站的负载
防火墙 分布式 - 图10

作者:hbzyin
链接:https://juejin.cn/post/6844903502448164878
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

正向反向区别

防火墙 分布式 - 图11
防火墙 分布式 - 图12

透明代理

透明代理(transparent proxy),看名字就知道这个代理服务器是透明的,透明代理其实也叫做内网代理(inline proxy)、拦截代理(intercepting proxy)以及强制代理(force proxy)。透明代理和正向代理的行为很相似,但细节上有所不同。透明代理将拦截客户端发送的请求,拦截后自己代为访问服务端,获取响应结果后再由透明代理交给客户端。一般公司内的上网行为管理软件就是透明代理。

防火墙 分布式 - 图13

例如,客户端要访问www.baidu.com,如果是正向代理的方式,客户端会指明它要交给正向代理服务,就像路由中说要交给网关一样。如果是透明代理的方式,则是发送出去,然后被透明代理拦截,客户端以为请求的这个过程是自己完成的,并不知道是透明代理完成的。

内容分发

image.png
使用内容分发时候,互联网中有很多缓存服务器,如何找距离客户端最近的缓存服务器,并让客户端去访问哪台服务器呢?
需要一种机制,即使用户不进行任何设置,也能够将请求消息发送到最近的缓存服务器中。

如何找到距离自己最近的缓存服务器

image.png

用DNS来分配访问

可以在DNS服务器返回Web服务器Ip的时候,对返回的内容进行加工,使其能够返回距离客户端最近的缓存服务器的IP地址。

如果Web服务器域名只对应一个IP地址,直接返回
如果Web服务器域名对应多个IP地址,一般的DNS以轮询的方式返回,这可能导致返回距离客户端较远的缓存服务器IP地址。
如果想让客户访问最近的,应该判断客户端与缓存服务器的距离,返回距离客户端最近的缓存服务器IP:
image.png

  1. 从事先缓存服务器部署地点的路由器收集路由信息,如图中,一共4台缓存服务器,4太缓存服务器分别有4台路由器,需要分别获取这4台路由器的路由表,并将4张路由表集中到DNS服务器上
  2. DNS服务器根据路由表查询本机到客户端DNS服务器的路由信息:例如可以通过路由器A的路由表,得出路由器A到客户端DNS服务器的路由,通过这样的信息估算距离。
    1. 客户端DNS服务器应该和客户端在同一位置;提供路由表的路由器和缓存服务器应该位于同一位置
    2. 依次比较所有路由器的路由表之后,就可以找出拿一台路由器距离客户端DNS服务器最近。
    3. 实际上客户端DNS服务器不一定和客户端在同一位置,所以可能无法得到准确的距离,但依然可以达到相当的精度。

通过重定向服务器分配访问目标

Http中有一个叫做Location的字段,当Web服务器数据转移到其他服务器时候可以使用这个字段。它的意思是“您要访问的数据在另一台服务器上,请访问那台服务器吧”(重定向)。

  1. 使用重定向告知客户端最近的缓存服务器时候,首先需要将重定向服务器注册到WEB服务器端的DNS服务器上;在客户端将HTTP请求发送到重定向服务器上。
  2. 重定向服务器收集了各个路由器的路由信息,根据这些找到最近的缓存服务器,然后将缓存服务器的地址放到Location字段中返回响应,这样客户端就去访问指定的缓存服务器。
  3. 缺点是增加了HTTP信息交换的次数,开销大
  4. 优点是重定向DNS服务器根据客户端发送来的HTTP消息发送方的IP地址来估算距离,精度高。
    1. DNS服务器是估算客户端DNS服务器到缓存服务器的距离,精度差

缓存更新对性能的影响

缓存服务器第一次访问是无效的,后面每次访问都需要向原始服务器查询数据有没有被修改,在网络拥堵的时候,可能会使响应时间恶化。
方法:

  1. 让Web服务器在更新原始数据时候,立即通知缓存服务器,使得缓存服务器上的数据一直保持最新;
  2. 对于动态页面,将静态内容和动态内容分开,将静态内容保存到缓存中。