学习笔记
服务器端的局域网
# 5.1 Web服务器的部署地点 可把服务器部署在公司或者数据中心 由于数据中心与NOC或者IX相连,放在数据中心的服务器可以获得很高的访问速度。数据中心有门禁和自助发电设备,还提供监控等附加服务,因此可靠性更高。 ![服务器的所在地](https://upload-images.jianshu.io/upload_images/17108100-10b1a3b36b222293.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) # 5.2 防火墙的结构和原理 ## 5.2.1 主流的包过滤方式 防火墙的基本思路:只允许发往特定服务器的特定应用程序的包通过 最为普及的实现方式:包过滤 ## 5.2.2 如何设置包过滤原则 可用网络包的头部中的控制信息设置包过滤规则 ![地址转换和包过滤中用于设置规则的字段](https://upload-images.jianshu.io/upload_images/17108100-0667ec6fe7c0a209.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **注意发送方端口号说明:服务器程序对应端口号一般是固定的,客户端程序的端口号大多是随机分配的** ![续表](https://upload-images.jianshu.io/upload_images/17108100-344fb0711fa0eafc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 由于出现了一些寄存在服务器中并可以感染其它服务器的软件,我们需要阻止Web服务器访问互联网以防止病毒扩散。 对于互联网流向Web服务器的包,可以设置防火墙检查头部中的IP地址,对IP目标不是Web服务器的包加以限制 ## 5.2.3 通过端口号限定应用程序 如果只靠IP地址,就无法对应用程序进行限制,所以还需要端口号 ![包过滤的典型示例](https://upload-images.jianshu.io/upload_images/17108100-805687a970e54e65.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 5.2.4 通过控制位判断连接方向 如何实现阻止Web服务器访问互联网呢? 我们不能阻止全部从Web服务器流向互联网的包,这会导致TCP协议无法正常工作,但是我们可以限制从Web服务器发出且SYN号为1的包。SYN号为1可视为Web服务器主动发起连接,这种是需要屏蔽的。 但是有一种特殊情况,那就是用UDP进行通信的包,这种包没有连接操作,因此无法通过控制位判断连接方向,例如用UDP访问DNS服务器。 >在这种情况下,只能二者择其一——要么冒一定的风险允许该应用程序的所有包通过,要么牺牲一定的便利性阻止该应用程序的所有包通过。
如果使用包过滤之外的其它方式的防火墙,有时候是可以判断UDP应用程序的访问方向的。
复习,UDP头部:
5.2.5 从公司内网访问公开区域的规则
不仅要设置互联网和公开区域之间的包过滤规则,还需要设置公司内网和互联网之间的包过滤规则
5.2.6 从外部无法访问公司内网
由于地址转换机制,我们不需要再设置规则来阻止从互联网来访问公司内网
5.2.7 通过防火墙
感觉就是在说不要把防火墙看作一种特殊机制,不要看得太独立化。
其实路由器加上包过滤规则也可以起到防火墙的作用,只不过规则比较复杂时只靠路由器命令难以维护,空间过小难以记录拦截日志,才出现了专用的硬件和软件。
5.2.8 防火墙难以抵御的攻击
如果Web服务器应用程序本身就有漏洞,那完全可以利用漏洞进行攻击。
因此需要不断的检查和修复漏洞,如果更新版本需要花费一定时间,可以在防火墙之外部署检查包内容的设备或者软件(有时会作为防火墙的附件提供)。
5.3 通过将请求平均分配给多台服务器来平衡负载
5.3.1 性能不足时需要负载均衡
- 过多的网络包会加重服务器的负担,因此需要多台服务器来分摊负载,此架构称为分布式架构。
- 要采用负载均衡,必须把客户端的请求分配到不同的服务器上
- 其中一种方法依靠DNS服务器来分配,称之为轮询
轮询:
举例:对于同一个域名,假设分配了3个IP,每次查询这个域名时,返回的IP会在这三个IP中按顺序滚动。
轮询的缺点:
- 如果其中一台服务器出现故障,DNS服务器无法得知,因此无法跳过这台服务器。
- 如果有跨越多个页面的操作,就需要多次访问同一台服务器,这时采用轮询会出现错误
5.3.2 使用负载均衡器分配访问
为了避免上述问题,可采用负载均衡器,然后把域名对应的IP换成负载均衡器的IP即可
如何分配?
- 定期采集服务器的CPU、内存使用率判断状况,以此分配访问,但采集可能加重服务器的负担,由于服务器负载波动,采集的数据也可能不准确;
- 根据服务器的性能指数,按比例分配请求。
如何解决跨页面操作?
可以利用Cookie等控制信息判断
5.4 使用缓存服务器分担负载
5.4.1 如何使用缓存服务器
5.3节是使用了功能相同的服务器来分摊负载。还有一种办法是把整个系统按功能分成不同的服务器,然后按照功能进行负载,缓存服务器就是这个道理。
有一些数据在一段时间内保持不变,可将其保存在缓存服务器中,这样就减轻了Web服务器的负担
5.4.2 缓存服务器通过更新时间管理内容
- 缓存服务器同负载均衡器一样,要代替Web服务器注册在DNS服务器中;
- 对客服端来讲,缓存服务器相当于Web服务器;对Web服务器来讲,缓存服务器相当于客户端;
缓存服务器如何判断转发给哪台服务器?
一种简单的办法是通过消息URL,例如:
缓存服务器操作?
- 缓存服务器收到客户端的消息后,先看有没有缓存,如果没有,直接向Web服务器请求数据;
- 如果有缓存,询问Web服务器数据是否更新,如果没有,返回缓存,如果有,更新缓存并返回。
流程图:
详细的流程还是看书吧
注意一个消息头:If-Modified-Since
5.4.3 最原始的代理——正向代理
- 与缓存服务器不同,正向代理是放在客户端一侧的,也可以起到缓存的作用;
- 正向代理可以查看请求的内容,因此可以根据包的内容限制访问,如不让员工访问一些与工作内容无关的网站等。包过滤只能根据IP和端口号做判断,因此无法做到这一点;
- 使用正向代理时,需要在浏览器中设置代理服务器的IP。这时浏览器就会忽略网址栏,直接将请求发给代理服务器;
- 没有代理时,请求中的URL只有域名后面的目录名或者文件名,有正向代理时会发送完整URL
5.4.4 正向代理改良版——反向代理
放在服务器端的代理,缓存服务器就是此类型
5.4.5 透明代理
- 请求消息从浏览器直接发送到Web服务器,不会到达透明代理
- 透明代理是对经过的消息拦截
- 都要经过接入网,可以在接入网入口放置反向代理实现透明代理
5.5 内容分发服务
5.5.1 利用内容分发服务分担负载
主要看懂这张图:
注意上图中各种方式的特点
关于CDSP:
- 要采用上图中第三种方式,必须在所有运营商的POP都放置缓存服务器才行,但是数量太太,不现实;
- 可以只在主要运营商的POP放置缓存服务器,但是会导致一些用户在访问服务器时绕远路,但仍然比直接访问Web服务器要近得多;
- 作为Web服务器运营者,要和运营商签约部署缓存服务器太繁琐了,于是就诞生了一个帮助运营者完成这一工作的类似中介的机构——CDSP;
- CDSP的缓存服务器可以租给多个网站运营者
CDSP:Content Delivery Service Provider 内容分发服务提供商
5.5.2 如何找到最近的缓存服务器
缓存服务器这么多,找到最近的服务器是提升网络效率的好办法。
书中讲了两种方法实现,一种是利用DNS服务器,另一种是利用重定向服务器,先看第一种方法。
- 收集部署在缓存服务器地点的路由器的路由表信息,保存在DNS服务器上;
- 跟据信息判断远近,返回最近的缓存服务器的IP。
要注意:
服务器端DNS服务器估算的距离是客户端局域网DNS服务器到缓存服务器的距离,如果客户端DNS服务器不和客户端在同一位置,可能结果会有偏差。即使如此,依然可以达到相当的精度。
5.5.3 通过重定向服务器分配访问目标
也就是第二种方法。
- 把重定向服务器注册在DNS服务器上,这样客户端就会把HTTP请求发送到重定向服务器上;
- 重定向服务器估算距离的方式与第一种方法一样;
- 重定向服务器会把缓存服务器的地址放在Location字段中返回响应,这样客户端就可以去访问缓存服务器了;
- 重定向服务器也可以返回一个通过网络包估算到缓存服务器距离的脚本,由客户端运行来找到最近缓存服务器。
5.5.4 缓存的更新方法会影响性能
如果像上面5.4.2节讲述的方法去进行缓存,效率较低。
可以换种思路:当Web服务器上的数据更新时,就通知缓存服务器进行更新,这样就不需要每次都去确认缓存是否有变化了。