Squid中文权威指南(第9章)译者序:本人在工作中维护着数台Squid服务器,多次参阅DuaneWessels(他也是Squid的创始人)的这本书,原书名是Squid:TheDefinitiveGuide,由O'Reilly出版。我在业余时间把它翻译成中文,希望对中文Squid用户有所帮助。对普通的单位上网用户,Squid可充当代理服务器;而对Sina,NetEase这样的大型站点,Squid又充当WEB加速器。这两个角色它都扮演得异常优秀。窗外繁星点点,开源的世界亦如这星空般美丽,而Squid是其中耀眼的一颗星。对本译版有任何问题,请跟我联系,我的Email是:yonghua_peng@yahoo.com.cn彭勇华目录第9章Cache拦截...........................................................................................................................29.1它如何工作?.....................................................................................................................29.2为何要(或不要)拦截?.................................................................................................59.3网络设备............................................................................................................................79.3.1内置Squid...............................................................................................................79.3.2四层交换.................................................................................................................79.3.3Cisco策略路由.......................................................................................................149.3.4WebCacheCoordination协议................................................................................169.4操作系统配置..................................................................................................................189.4.1Linux......................................................................................................................189.4.2FreeBSD.................................................................................................................219.4.3OpenBSD...............................................................................................................229.4.4在NetBSD和其他系统上的IPFilter.....................................................................239.5配置Squid........................................................................................................................249.5.1配置WCCPv1.......................................................................................................249.6调试问题..........................................................................................................................25Squid中文权威指南1第9章Cache拦截Cache拦截是让传输流向Squid的流行技术,它不用配置任何客户端。你可以配置路由器或交换机将HTTP连接转发到squid运行的主机。squid运行的操作系统被配置成接受外部数据包,并将其递交给squid进程。为了让HTTP拦截生效,你必须配置3个独立的因素:网络设备,squid运行的操作系统,和squid自身。(译者注:Cache拦截实际上指的是Squid的透明代理)9.1它如何工作?Cache拦截包含了某些网络欺骗,它对理解在客户端和Squid之间的会话有用。我使用图9-1和如下的tcpdump示例输出,来解释当数据包通过网络时,如何被拦截。1.用户代理(user-agent)想请求某个资源,它对原始服务器发起index.html请求,例如:。它需要原始服务器的IP地址,所以先发起一个DNS请求:Packet1TIME:19:54:41.317310UDP:206.168.0.3.2459-206.168.0.2.53DATA:.d...........:54:41.317707(0.000397)Squid中文权威指南2UDP:206.168.0.2.53-206.168.0.3.2459DATA:.d...........!.z.......b......2.现在有了IP地址,用户代理初始化到原始服务器80端口的TCP连接:Packet3TIME:19:54:41.320652(0.002945)TCP:206.168.0.3.3897-208.201.239.37.80SynDATA:Nodata3.路由器或交换机注意到目的地址是80端口的TCPSYN包。下一步会发生什么依赖于特定的拦截技术。在4层交换和路由策略上,网络设备简单的将TCP包转发到Squid的数据链路地址。当squid直接挂在网络设备上时,就这样工作。对WCCP来说,路由器封装TCP包为GRE包。因为GRE包有它自己的IP地址,它可能被通过多个子网进行路由。换句话说,WCCP不要求squid直接挂在路由器上。4.Squid主机的操作系统接受到拦截包。对4层交换来说,TCP/IP包并没有改变。假如包使用了GRE封装,主机会剥离外部的IP和GRE头部,并将原始的TCP/IP包放在输入队列里。注意squid主机接受到的包是针对外部地址的(原始服务器的)。正常情况下,这个包不匹配任何本地地址,它会被丢弃。为了让主机接受外部数据包,你必须在大多数操作系统上激活IP转发。5.客户端的TCP/IP包被包过滤代码处理。数据包必须匹配某个规则,该规则指示内核转交这个包给squid。如果没有这样的规则,内核简单的将包按照它自己的方式转发给原始服务器,这不是你想要的。注意SYN包的目的端口是80,但squid可能侦听在不同的端口,例如3128。包过滤规则允许你改变端口号。你不必让squid侦听在80端口。通过tcpdump,你能见到这步,因为转发的包不会再次通过网络接口代码。即使squid侦听在80端口,包过滤器的重定向规则仍是必要的。可以让squid不在这些端口上接受拦截包。重定向规则有点神奇,它转交外部数据包给squid。6.Squid接受到新连接的通知,它接受这个连接。内核发送SYN/ACK包返回给客户端:Packet4TIME:19:54:41.320735(0.000083)TCP:208.201.239.37.80-206.168.0.3.3897SynAckDATA:Nodata就象你见到的一样,源地址是原始服务器,尽管这个包不会抵达原始服务器。操作系统只是简单的将源地址和目的地址交换一下,并将它放进响应数据包里。Squid中文权威指南37.用户代理接受到SYN/ACK包,建立起完整的TCP连接。用户代理现在相信它是连接到原始服务器,所以它发送HTTP请求:Packet5TIME:19:54:41.323080(0.002345)TCP:206.168.0.3.3897-208.201.239.37.80AckDATA:Nodata---------------------------------------------------------------------------Packet6TIME:19:54:41.323482(0.000402)TCP:206.168.0.3.3897-208.201.239.37.80AckPshDATA:GET/HTTP/1.0User-Agent:Wget/1.8.2Host:*/*Connection:Keep-Alive8.Squid接受HTTP请求。它使用HTTPHost头部来转换局部URL为完整的URL。在这种情形下,可在access.log文件里见到。9.从这点开始,squid正常的处理请求。一般cache命中会立刻返回。cache丢失会转发到原始服务器。10.昀后,是squid从原始服务器接受到的响应:Packet8TIME:19:54:41.448391(0.030030)TCP:208.201.239.37.80-206.168.0.3.3897AckPshDATA:HTTP/1.0200OKDate:Mon,29Sep200301:54:41GMTServer:Apache/1.3.26(Unix)PHP/4.2.1mod_gzip/1.3.19.1amod_perl/1.27P3P:policyref==CAODSPCORCURaADMaDEVaTAIaPSAaPSDaIVAaIVDaCONoOURDELaPUBiOTRaINDPHYONL