[隐藏]

一、简介

Squid是一个流行的代理服务器和Web缓存服务器软件。Squid有广泛的用途,从作为网页服务器的前置缓存服务器缓存相关请求来提高Web服务器的速度,到为一组人共享网络资源而缓存万维网、域名系统和其他网络搜索,到通过过滤流量帮助网络安全,到局域网通过代理上网。

Squid服务器的功能:

  • 提供对HTTP和FTP协议的代理服务
  • 缓存代理的内容,提高客户端访问网站的速度,并能够结果出口网络流量
  • 对客户端地址进行访问控制,限制允许访问Squid服务器的客户机
  • 对目标地址进行访问控制,限制客户端允许访问的网站
  • 根据时间进行访问控制,限制客户端可以使用代理服务的时间

Squid的缓存代理

Squid缓存代理

Squid缓存代理

当一个用户通过Squid服务器访问外部网站时(图中过程1),Squid服务器首先会检查它的缓存池里是否有这个外部网站的静态数据(图片、js文件等)。

如果有,就直接从缓存池中取出这些数据返回给用户(过程3和4)。

如果没有,就从目标服务器取回数据(过程5和6)返回给用户,并且在cache缓存池中保存一份(过程2),这样当第二个人访问相同的数据时,Squid服务器就可以直接从缓存池中取数据,从而达到加速的目的。

二、普通代理

普通代理是标准的、传统的代理服务,需要用户在客户端软件中指定代理服务器的地址、端口。

典型的普通代理应用场景:

Squid普通代理

Squid普通代理

局域网的一个用户要访问一个服务器ip地址为10.10.10.105的网站,显然,正常情况下是不能连通的。(当然,10.*的这个ip只是来测试的,实际情况下这里应该是公网ip)。

我们要借助于中间的Squid服务器来访问外网。Squid的eth0网卡连接着内网,eth1网卡连接着外网。

Squid的安装和命令(ubuntu 12.04):

安装:

sudo apt-get install squid3

启动:

sudo service squid3 start/restart

停止:

sudo service squid3 stop

配置文件:

/etc/squid3/squid.conf

重新加载配置文件:

sudo squid3 -k reconfig

Squid的常用设置

  • http_port 192.168.0.1:3128—-默认端口是3128,可以是任何其它端口。在前面加上IP地址,Squid就不会监听外部的网络接口 。如果使用HTTPD加速模式 则为80。可以指定多个端口,但是所有指定的端口都必须在一条命令行上。
  • visible_hostname—-当访问错误时,该选项会显示在错误业中。
  • cache_mem 32MB—-用于指定squid可以使用的内存的理想值。这部分内存被用来存储以下对象:-In-Transit objects (传入的对象)-Hot Objects (热对象,即用户常访问的对象)-Negative-Cached objects (消极存储的对象)需要注意的是,这并没有指明squid所使用的内存一定不能超过该值,其实,该选项只定义了squid所使用的内存的一个方面,squid还在其他方面使用内存。所以squid实际使用的内存可能超过该值。缺省值为8MB。
  • cache_dir ufs /var/squid 100 16 256—-指定squid用来存储对象的交换空间的大小及其目录结构。可以用多个cache_dir命令来定义多个这样的交换空间,并且这些交换空间可以分布不同的磁盘分区。格式:cache_dir Directory-Name Mbytes Level-1 Level2– “Directory-Name”指明了该交换空间的顶级目录。缺省值为/var/spool/squid。– “Mbytes”定义了可用的空间总量。需要注意的是,squid进程必须拥有对该目录的读写权力。大小不能小于cache_mem的值,否则会出警告“WARNING cache_mem is larger than total disk cache space!”。– “Level-1”是可以在该顶级目录下建立的第一级子目录的数目,缺省值为16。– 同理,“Level-2”是可以建立的第二级子目录的数目,缺省值为256。
  • maximum_object_size—-大于该值得对象将不被存储。缺省值为: 4096 KB
  • cache_access_log—-指定客户请求记录日志的完整路径。缺省值为:/var/log/squid/access.log如果不需要该日志,可以取消:cache_access_log none
  • cache_log—-指定squid一般信息日志的完整路径缺省为: /var/log/squid/cache.log

普通代理测试

根据图中的例子配置ip:

Squid服务器:

sudo ifconfig eth0 192.168.56.101
sudo ifconfig eth1 10.10.10.114 netmask 255.255.255.0

Web Server:

sudo ifconfig eth1 10.10.10.105 netmask 255.255.255.0

客户机(XP系统):

配置Squid(我已经把原来的配置文件删了):

vim /etc/squid3/squid.conf

重启Squid服务:

sudo service squid3 restart

配置客户机代理服务器:

完毕,客户机可以访问web服务器。在此之前,我们先打开Squid服务器的访问记录文件,监视访问记录:

sudo tail -f /var/log/squid3/access.log

客户机访问:

查看 http header:

注意,虽然request host 是10.10.10.105,但是respense是通过我们的Squid服务器!

Squid服务器监视到的记录:

我们再次刷新页面(强制刷新shift+F5,避免浏览器缓存影响):

这时的X-cache是MISS,X-cache-Lookup是HIT的,说明Squid服务器先去web服务器验证,但是发现文件没有更新,所以继续使用cache缓存池的文件交给用户。

为什么要先去web服务器验证呢?既然在缓存池里就能拿到数据不是就不用去访问web服务器了吗?这是因为缓存池里的数据有可能过期。

我们把Squid服务器的网卡down掉看一下是不是这样子的:

sudo ifconfig eth1 down

刷新页面:

OK,再把网卡开启继续进行实验:

sudo ifconfig eth1 up

修改web服务器的html文件后客户机再刷新:

依然可以拿到最新数据。

X-Cache、X-Cache-Lookup和refresh_pattern

我们可能注意到了,当第二次刷新页面的时候,X-Cache为什么是MISS?这是什么意思呢?
如果文件在squid中超过了 refresh_pattern参数设置的时间,访问的时候会去web服务器验证,这个时候返回的X-Cache就是MISS。但发现web服务器的文件并没有更新,所以squid继续使用cache文件,返回的X-Cache-Lookup就是HIT。
可以把refresh_pattern的时间设置的长一些,它们两个就可以都返回HIT,即使强制刷新:

这个时候,即使把eth1网卡down掉,客户机在一定时间依然可以访问到页面。

三、透明代理

所谓透明代理,就是客户端不知道有代理服务器的存在,不需要指定代理服务器的地址、端口等信息。只需要将客户机的网关指定为Squid服务器的地址。

但是,Squid代理服务器不是路由器,它可能把客户机的数据转发出去。即使转发出去,数据也回不来,因为客户机的ip是内网ip。

Squid透明代理的原理是这样的,Squid服务器收到一个请求包后,防火墙将该数据包重定向到它的3128端口。接着代理服务器去web服务器取回数据并交给客户机用户。

Squid透明代理测试

为了看出效果,修改web服务器的html文件

squid.html

<h1>Squid Works!Transparent Proxying!</h1>

<img src=”1.jpg” width=”100″ height=”100″ />

<img src=”2.jpg” width=”100″ height=”100″ />

<img src=”3.jpg” widht=”100″ height=”100″ />

编辑配置文件

sudo vim /etc/squid3/squid.conf

注意http_port 后面加上 transparent ,表明是透明代理。

重新加载配置文件

sudo squid3 -k reconfig

将192.168.56.0/24网段的所有对80端口的访问重定向到3128端口

sudo iptables -t nat -A PREROUTING -i eth0 -s 192.168.56.0/24 -p tcp –dport 80 -j REDIRECT –to 3128

客户机设置网关

客户机关闭代理

OK,打开浏览器测试

四、反向代理

反向代理是一种和普通代理、透明代理完全不同的代理服务。它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器(即反向代理服务器)来降低实际的WEB服务器的负载的WEB服务器加速技术。典型的结构如下图:

Squid反向代理

Squid反向代理

代理服务器位于本地WEB服务器和Internet之间,处理所有对WEB服务器的请求。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。这种方式通过降低了向WEB服务器的请求数从而降低了WEB服务器的负载。

Squid反向代理实现的基本步骤

首先,修改Squid的配置文件,监听80端口。

为什么不是3128端口而是80端口?考虑一个事情,当外部的web用户1访问我们的服务器的时候,他请求的应该是Squid服务器的ip,端口是80,如果服务器根本就没开启80端口,它将直接将这个请求包丢掉。

所以,需要Squid监听80端口,它并不同普通情况下web服务器的apache的80端口。这样,当请求包到达Squid服务器的时候,Squid就能接收到数据。

注意,修改前要先把其他占用80端口的进程停掉,通常是apache。

修改后的配置:

注意,现在要对外代理,代理的ip是外网ip。对所有的请求也要全部allow。

cache_peer 参数:

cache_peer hostname type http_port icp_port [options]

共有5个选项可以配置:

1. hostname:指被请求的同级子代理服务器或父代理服务器。可以用主机名或ip地址表示;

2. type:指明hostname的类型,是同级子代理服务器还是父代理服务器,也即parent(父) 还是 sibling(子);

3. http_port:hostname的监听端口;

4. icp_port:hostname上的ICP监听端口,对于不支持ICP协议的可指定7;

5. options:可以包含一个或多个关键字。

Options可能的关键字有:

1. proxy-only:指明从peer得到的数据在本地不进行缓存,缺省地,squid是要缓存这部分数据的;

2. weight=n:用于你有多个peer的情况,这时如果多于一个以上的peer拥有你请求的数据时,squid通过计算每个peer的ICP响应时间来 决定其weight的值,然后squid向其中拥有最大weight的peer发出ICP请求。也即weight值越大,其优先级越高。当然你也可以手工 指定其weight值;

3. no-query:不向该peer发送ICP请求。如果该peer不可用时,可以使用该选项;

4. Default:有点象路由表中的缺省路由,该peer将被用作最后的尝试手段。当你只有一个父代理服务器并且其不支持ICP协议时,可以使用default和no-query选项让所有请求都发送到该父代理服务器;

5.login=user:password:当你的父代理服务器要求用户认证时可以使用该选项来进行认证。

重新加载配置文件:

sudo squid3 -k reconfig

修改ip:

sudo ifconfig eth0 10.10.10.114 netmask 255.255.255.0
sudo ifconfig eth1 192.168.56.101

分别配置另两台在内网中的服务器的ip并开启apache:

服务器1:

sudo ifconfig eth0 192.168.56.102
sudo service apache2 start

修改html :

vim /var/www/index.html

加入:

<h1>Im Web Server 192.168.56.102</h1>

服务器2类似:

sudo ifconfig eth0 192.168.56.103
sudo service apache2 start

修改html :

vim /var/www/index.html

加入:

<h1>Im Web Server 192.168.56.103</h1>

 

现在的客户是外网用户,所以修改客户机ip:

OK,打开浏览器访问Squid服务器:

刷新发现,页面并没有改变,说明访问的还是服务器1。

现在把服务器1 人为的down掉:

sudo service apache2 stop

再刷新页面:

访问到服务器2了。

所以我们的这些服务器相当于一个被动等待的集群,而不是轮询的负载均衡。默认情况下,Squid会去访问第一台服务器(cache_peer的第一项),只有当这台服务器down掉或者响应速度慢的时候才会访问后面的服务器。

虚拟主机映射

当一台web服务器上开启了虚拟主机,也就是在一台服务器上放置了多个网站,Squid反向代理如何来做?

这里我们只使用服务器1来模拟。

首先配置这台web服务器。

修改apache的配置文件:

sudo vim /etc/apache2/sites-enabled/000-default

分别建立目录和文件:

mkdir /var/www/a /var/www/b

echo “<h1>www.a.com</h1>” > /var/www/a/index.html

echo “<h1>www.b.com</h1>” > /var/www/b/index.html

重启apache :

sudo service apache2 restart

修改Squid配置文件:

重新加载:

sudo squid3 -k reconfig

客户机

模仿DNS,修改hosts文件,加入:

10.10.10.114    www.a.com
10.10.10.114    www.b.com

完毕,打开浏览器测试: