序言:众所周知,现代互联网上大多数的的门户网站使用较多的Web服务器架构是基于CDN(内容分发网络)开发的。那什么是CDN呢?我们通过下面这张图来简单了解一下:

CND架构下,各个地区的IDC机房里最重要的设施就是代理服务器和智能DNS解析,而最常用的代理服务器就是Squid,其最重要的功能就是缓存功能。在Windows上使用较多的代理服务器如:WinGate、SyGate、WinRoute、Proxy(现已发展成为ISA防火墙);Linux上的使用较多的代理服务器就是Squid.

【Squid & NAT】

    网络中大部分应用都是支持NAT的,NAT转换是工作在网络层的,可以基于网络层的来源地址和目的地址进行转换;也可以基于传输层的协议(tcp/udp)和端口(来源端口、目的端口)进行NAT。Squid代理服务器,因其功能也称作代理服务器防火墙。quid只支持少量的应用,支持web上的http、ftp代理,邮件上的smtp、pop3、imap的代理。但其安全性确实非常高的,不仅可以基于网络成的来源地址和目的地址进行代理,还可以基于传输层的协议(tcp/udp)和端口(来源端口、目的端口)进行代理服务,最重要就是Squid可以基于应用层的账号、内容、域名等进行代理,这是NAT所做不到的,这也是Squid的最大优势所在。

我们来通过几张图来简单看一下NAT和Squid的工作机制:

【NAT的工作机制】

当内网用户访问Internet时,在网络出口路由器上进行SNAT,在进行SNAT时,因为内网的私有IP在Internet上是不能传输的,所以在发往Internet时,数据包的源地址已经被SNAT成了路由器的外口公网IP发往了ISP;当进行内部服务器发布时,要进行DNAT,为了内部服务器的安全,隐藏IP,要进行DNAT,在DNAT过程中,内网服务器相对于外部网络就是Destination了,所以当外部访问内部服务器时,内网IP是私有地址,在经过内网出口路由器时,要进行DNAT,将来源数据包的目的地址(出口路由器的外口公网地址)转成内网服务器私有地址,然后进行服务。

【Squid的工作机制】

当内部的用户访问Internet时,将数据包发往代理服务器Squid,代理服务查询自身的缓存信息,如果缓存命中(Hit),就将数据直接送往用户,如果缓存未命中(Missing),就向兄弟代理服务器发送请求,如果兄弟代理服务器有请求页面,就将数据返回,如果兄弟也没有,那么代理服务器就以自己的地址作为源地址,父级服务器地址作为目的地址,将数据包发往父亲服务器,进行请求。可能我们会奇怪的发现Squid和NAT不是一样的吗?其实不然,Squid在进行代理时,是不会对原始的数据包进行任何的修改的,整个过程中,数据包的源地址和目的地址都没有发生改变。如果缓存命中,直接返回,未命中,以自己地址去查询了,这样就显得非常的高效。

通过上面的简单了解,是不觉得Squid真的很强大呢?

下面我们结合案例来谈一下Squild的具体应用。

【实验拓扑】

基本环境搭建:

【实验设备】

 Linux虚拟机( Red Hat) WinXP虚拟机(测试P C) 宽带路由器(访问Internet)

【参数设定】

 Step1:搭建Squid缓存服务器(Linux虚拟机)

安装需要的软件包,启动服务.

如果启动过程出错时

Step2:WinXP虚拟机(测试PC)

Step3:宽带路由器(提供Internet访问)

到现在,我们基本的环境就已经搭建好了,下面我们来做一些案例:

一:代理的基本应用.

测试代理可用性:此时在WinXP虚拟机上访问www.baidu.com会出现下面问题:

这是由于Squild的配置中默认是deny all的,所以为了测试,稍作修改。

service squid  restart后,再刷新页面试试看。。。(同时观察我们的日志信息)

tail -f /var/log/squid/access.log观察日志信息.

Squid:代理服务器,又称为代理服务器防火墙.因此它是可以做很多访问控制的,下面我们在Squid的配置中加入一些访问控制,来测试一下。。。。。

①基于来源地址的控制.

service  squid  restart再次刷新页面测试结果.

将WinXP虚拟机的ip地址改一下(192.168.2.101)再刷新测试一下.

Squid还可以对一段来源地址范围进行控制

例如:

acl  badip  src 192.168.2.100-192.168.2.110/255.255.255.255

http_access  deny  badip 

重启服务,刷新就会再次被拒绝.

Squid还可以基于目的地址进行控制

(不过用处不是很大,因为Internet上的ip地址一般都是动态或则不止一个)

例如:

①acl  internetip  dst 192.168.101.254/255.255.255.255

②acl  managerip  src 192.168.2.100/255.255.255.255

③http_access  allow  managerip internetip

④http_access  deny  all  internetip

//第③④行也可以换成下面的这种写法

//http_access  deny  !managerip  internetip

说明:192.168.101.254是宽带路由器的管理ip(模拟Internet des主机).

      192.168.2.100主机ip

重启服务,就可以登陆宽带路由器管理界面,更换主机地址,会再次被拒绝.

Squid还可以基于mac地址进行控制,但是这里我们做不了这样的实验,因为Red Hat的Squid安装包没有这项功能,如果想基于mac进行控制,可以下载Squid的源码安装包,进行源码安装,编译的时候加入 --enable-arp-acl.

使用方法:

acl  aclname  arp  mac-address....(XX:XX:XX:XX:XX:XX  notation)

Squid还可以基于来源和目标域名地址进行控制,这是NAT所做不到.

acl  baddomain  dstdomain  .sina.com.cn

http_access  deny  all  baddomain 

把访问的域名换成非新浪的就可以正常访问了.

Squid的基于域名的控制可以有效地杜绝一些钓鱼网站用非法域名进行诈骗.

Squid还可以基于内容、端口、端口、时间等进行代理控制,有兴趣的话可以参考一下Squid的配置文档.

前面所讲的都是一些代理的基本应用,可以实现基本的代理服务,但是有没有发现有一个很现实的问题?用户还要手动修改代理地址和添加代理端口(默认3128)。这样以来,会产生两方面的问题:

①给用户带来了很多不便②服务器的安全性就会降低.(端口暴露)

这样就要求我们使用更加安全和方便的代理方式----透明代理

二:透明代理

【实现步骤】

1、WinXP客户端:需要配置网关和DNS参数,取消浏览器上的代理配置.

(说明:因为局域网访问Internet时,DNS服务器如果在局域网外部的时候,内部主机需要进行DNS解析,才能访问Internet,所以需要网关和DNS参数)

2、Squid代理服务器:需要进行SNAT配置.

(说明:因为Squid代理所支持的服务很少http、ftp、smtp、pop3、imap等,它是不支持DNS代理的,所以为了局域网用户的数据包能够出去,进行DNS解析,所以要在代理服务器上进行基于来源的SNAT转换)

3、Squid代理服务器;开启ip转发,而且需要进行端口重定向(80—>3128)

(说明:为了实现ip数据包能够出去,必须开启ip转发功能;为了实现Squid进行透明代理,当用户访问正常的80端口时,在经过代理服务器时,要将端口重定向为Squid的3128端口,这些操作对于用户是完全透明的)

进行端口重定向配置(80—>3128)

4、Squid代理服务器;开启Squid的透明代理功能.

【透明代理测试】

这样就完成了全部的配置过程,实现了代理对于用户的完全透明。。。。

三:Squid还有一种比较实际的应用就是反向代理,当外网的用户需要访问内网的服务器(www等)时,需要在代理服务上做反向代理.

【实验拓扑】(在内网添加一台Web服务器:WinServer2003)

【配置详情】

 Step1:搭建内部的Web环境(WinServer2003虚拟机IIS)(过程略)

 Step2:在Squid代理服务器上开启反向代理.(Linux)

 Step3:将代理服务器的外卡Eth1监听端口由原来的3128改为80.

service squid restart

【验证分析】用虚拟机桥接的宿主机Win7(ip:192.168.102.111)做为Internet主机,访问服务器外口地址(192.168.102.102)模拟反向代理,进行测试.

【扩展分析】如果希望同时实现正向和反向代理,简单修改就OK了

server  squid  restart就完全OK了!!!

下面是测试最终截图:

注意:测试的时候,测试主机的DNS是要指定的。。。。。。。

【总结】

到此,Squid的基本应用就算讲完了,有兴趣的话可以自己试一试!

有什么问题欢迎留言讨论!!!!!!!