ftafta 2011-04-28
简介
普通代理
透明代理
反向代理
故障处理
一个范例
一个限制访问的范例
官方网站:http://www.squid-cache.org/
相关技术网站:http://www.visolve.com/
一.代理服务简介
返回
1.什么是代理服务器(ProxyServer)
代理服务可以代表其它计算机传递数据包或信息,这些数据包和信息包括网页、电子邮件、多媒体文件和其它网络应用程序等。通过它的文件缓存和访问控制等功能,可以实现快速浏览和对用户访问的有效管理。
Web代理服务器(通常所说的代理服务器)是介于浏览器和Web服务器之间的一台服务器,当你通过代理服务器上网浏览时,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。
更重要的是:代理服务器是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。主要的功能有:
1、连接Internet与Intranet充当firewall(防火墙):因为所有内部网的用户通过代理服务器访问外界时,只映射为一个IP地址,所以外界不能直接访问到内部网;同时可以设置IP地址过滤,限制内部网对外部的访问权限;另外,两个没有互联的内部网,也可以通过第三方的代理服务器进行互联来交换信息。
2、共享因特网连接,节省IP开销:如前面所讲,所有用户对外只占用一个IP,所以不必租用过多的IP地址,降低网络的维护成本。这样,局域局内没有与外网相连的众多机器就可以通过内网的一台代理服务器连接到外网,大大减少费用。当然也有它不利的一面,如许多网络黑客通过这种方法隐藏自己的真实IP地址,而逃过监视。
3、提高访问速度,节约通信带宽。而且通常代理服务器都设置一个较大的硬盘缓冲区(可能高达几个GB或更大),当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,从而达到提高访问速度的目的。
2.代理服务器的硬件需求
代理服务器对于硬件的要求相当的高!因为我们架设代理服务器的目的就是希望能够加快网络的传输速度因此,虽然代理服务器几乎在任何的Linux系统上面都能跑,但是代理服务器最好还是有较高的硬件配置:
CPU足够好;
RAM足够大,这也是很重要的一个硬件参数
HardDisk最好能用SCSI接口的,因为速度与稳定度都比较好!如果不能的话,那么IDE接口的硬盘由于目前速度也越来越快,所以使用IDE也没有问题,但是最好是『多块硬盘』的架构,例如我总共需要30GB的硬盘空间,那么最好是10GB的硬盘三块这样的架构较佳。最好在架设代理服务器时,将整体主机的规划做好,并且让代理服务器主机的服务单纯一点,最好只负责代理服务
每颗硬盘的容量不需要太大,此外,最好将硬盘分割一下,一个分区在2~4GB之间即可,因为分太大的话资料的搜寻耗费时间较长,但是分区太小又可能造成空间的浪费
cache是放置在某个目录下的,而最好一个目录底下就是独立的一个partition。此外,由于cache所在的硬盘常常会有资料的存取,因此可能此一硬盘的损耗率会比较大,所以这个cache所在的硬盘最好不要跟重要数据文件,例如/,/etc,/usr,/home等等重要的系统文件放在一起!
也由于cache所在的硬盘资料存取太密集了,所以,硬盘的选择上面需要(1)转速不能太低;(2)磁头的机械臂需要可以忍受频繁的动作;(3)发热量不可太大,或者可以考虑加装硬盘用风扇。
网络卡与网络周边最好使用GBytes的网络卡
3.使用squid的好处
squid是开源软件,性能优秀。并仍在世界各地的squid开发者的共同努力下,不断发展。
快速响应,减少网络阻塞,Squid将远程Internet对象保存为本地拷贝。当本地用户再次访问这些对象时,Squid可以直接快速地提供对这些对象的访问,而不必再次占用带宽访问远程服务器上的对象。
增强访问控制,提高安全性。可以针对特定的的网站、用户、网络、数据类型实施访问控制
squid可以工作在普通代理模式、透明代理模式各反向代理模式
4.squid的结构
多个squid代理服务器可以通过icp协议相互沟通,形成树形层次关系(父代理、兄弟代理、子代理),构建代理服务器群。
二.squid.conf的典型配置(普通代理)
返回
1.配置
#vi/etc/squid/squid.conf
#http_port指令告诉squid在哪个端口侦听HTTP请求。默认端口是3128,除下面的形式外,也可以是http_port192.168.63.50:3128
http_port3128
icp_port3130
#缓存目录的设置,可以设置多个缓存目录,语法为:<cache_dir><aufs|ufs><目录所在><MBytes大小><dir1><dir2>
cache_dirufs/var/spool/squid1000641024
#下面是关于日志文件的放置目录与文件名!
cache_access_log/var/log/squid/access.log
cache_log/var/log/squid/cache.log
cache_store_log/var/log/squid/store.log
pid_filename/var/run/squid.pid
#关闭认证机制,有些版本的 squid会自动的加入代理认证机制,而普通情况下是不需要的,故找到包括auth_param的行,给它们加上注释
#auth_parambasicchildren5
#auth_parambasicrealmSquidproxy-cachingwebserver
#auth_parambasiccredentialsttl2hours
#设置squid用户及用户组、管理员账号
cache_effective_usersquid
cache_effective_groupsquid
#与内存有关的配置:因为我的系统内存很小,所以只给8MB!如果您的物理内存很大的情况下,例如512MB,可以考虑加大到64或128MB。
cache_mem128MB
#与磁盘容量有关的配置(注:下列的90与95是百分比),如果您的cache_dir所在磁盘很大时,可以考虑将4096改成32768KB
cache_swap_low90
cache_swap_high95
maximum_object_size4096KB
#与内存保存资料有关的配置
maximum_object_size_in_memory8KB
#定义acl(访问控制列表),语法为:acl<acl><acl名称><acl类型><配置的内容>
#黑体为用户自定义部分
aclAllsrc0/0
aclManagerprotocache_object
aclLocalhostsrc127.0.0.1/32
aclSafe_portsport8021443563702102804885917771025-65535
aclSSL_ports443563
aclCONNECTmethodCONNECT
aclMyNetworksrc192.168.0.0/16
#利用前面定义的acl,定义访问控制规则
http_accessallowManagerLocalhost
http_accessdenyManager
http_accessdeny!Safe_ports
http_accessdenyCONNECT!SSL_ports
http_accessallowMyNetwork
http_accessdenyAll
#定义与其它代理服务器的关系,语法:<cache_peer><主机名称><类别><http_port><icp_port><其它参数>
cache_peer192.168.60.6parent44807no-querydefault
#设置与其它代理服务器的关系:
#<cache_peer_access><上层Proxy><allow|deny><acl名称>
#cache_peer_access192.168.60.6allowaclxxx
#cache_peer_access192.168.60.6deny!aclxxx
coredump_dir/var/spool/squid
2.激活squid
1).在开启squid之前,你应该验证其配置文件是否正确。运行如下命令即可:
#squid-kparse
假如你看不到输出,配置文件有效,你能继续后面的步骤。然而,如果配置文件包含错误,squid会告诉你:
2).初始化cache目录.即建立缓存目录的存储格式
只需在第一次启动squid服务之前执行(在初次运行squid之前,或者无论何时你增加了新的cache_dir,你必须初始化cache目录。)
#squid-z
cache目录初始化可能花费一些时间,依赖于cache目录的大小和数量,以及磁盘驱动器的速度。假如你想观察这个过程,请使用-X选项:
#squid-zX
3).启动squid服务
#servicesquidstart
假定squid安装在/usr/local/squid目录下,也可以
#/usr/local/squid/sbin/squid-sD
4).停止squid
最安全的停止squid的方法是使用squid-kshutdown命令:
#squid-kshutdown
5).重配置运行中的squid进程
在你了解了更多关于squid的知识后,你会发现对squid.conf文件做了许多改动。为了让新设置生效,你可以关闭和重启squid,或者在squid运行时,重配置它。
重配置运行中的squid最好的方法是使用squid-kreconfigure命令:
#squid-kreconfigure
6).滚动日志文件
除非你在squid.conf里禁止,squid会写大量的日志文件。你必须周期性的滚动日志文件,以阻止它们变得太大。squid将大量的重要信息写入日志,假如写不进去了,squid会发生错误并退出。为了合理控制磁盘空间消耗,在cron里使用如下命令:
%squid-krotate
例如,如下任务接口在每天的早上4点滚动日志:
04***/usr/local/squid/sbin/squid-krotate
该命令做两件事。首先,它关闭当前打开的日志文件。然后,通过在文件名后加数字扩展名,它重命名cache.log,store.log,和access.log。例如,cache.log变成cache.log.0,cache.log.0变成cache.log.1,如此继续,滚动到logfile_rotate选项指定的值。
squid仅仅保存每个日志文件的最后logfile_rotate版本。更老的版本在重命名过程中被删除。假如你想保存更多的拷贝,你需要增加logfile_rotate限制,或者编写脚本用于将日志文件移动到其他位置。请见13.7章关于滚动日志的其他信息。
3.访问控制示例
1)禁止访问某个网站
在squid配置文件中添加以下acl名称及访问规则,并重新加载配置文件
aclsinadstdomain.sina.com.cn.sina.com
http_accessdenysina
或
aclsinadst58.63.236.2658.63.236.2758.63.236.2858.63.236.2958.63.236.3058.63.236.3158.63.236.3258.63.236.3358.63.236.3458.63.236.3558.63.236.3658.63.236.3758.63.236.3858.63.236.3958.63.236.4958.63.236.50
http_accessdenysina
或
aclsinadstwww.sina.com.cn
http_accessdenysina
2)禁止来自某些IP地址的访问
在squid配置文件中添加以下acl名称及访问规则,并重新加载配置文件
aclzhangsrc192.168.63.6/32
http_accessdenyzhang
3)禁止在某些时段访问
aclWorking_hoursMTWHF08:00-17:00
http_accessallowWorking_hours
http_accessdeny!Working_hours
4)禁止某个代理客户建立过多连接
aclOverConnLimitmaxconn4
http_accessdenyOverConnLimit
三.透明代理
返回
让我们现在来想象一个联机状态,就是你有一整组内部网络,而这个内部网络都是透过NAT主机联机出去的。那么我们谈过,就是在一个内部网很大的情况下,使用Proxy是一个很不错的选择,因为至少他可以减轻带宽负荷!不过,遗憾的是,架设Proxy的时候,也要使用者在浏览器上面设置代理!那么有没有办法在『使用者不需要在浏览器上面进行任何配置,就可以实现以Proxy帮助使用者联接Internet?当然有啦!那就是TransparentProxy啦!也有人翻译成『透明代理服务器』,其原理是:
当使用者经过NAT服务器来联机进入Internet时,假如使用的Internet协议为80(也就是WWW),那么就将这个要求交给Proxy来工作,以达到代理服务器的功能。
呵呵!也就是说,当使用者是经过NAT主机联机出去时,只要让NAT主机发现『咦!你是要去读取www的资料对吧!好!那么这个动作由Proxy主机帮你搞定!』如此一来,使用者根本就不需要在浏览器上面配置Proxy的相关资料,因为这个动作是『由NAT主机自己决定的』,所以只要在NAT主机上面配置妥当即可,使用者不必配置任何资料呢!那么要怎么进行呢?只要两个步骤即可:
1.配置Proxy主机:
1)如果是squid2.5,需要更改squid配置文件中的下列指令:
[root@testroot]#vi/etc/squid/squid.conf
!
httpd_accel_hostvirtual#告诉web加速器,针对所有的URL
httpd_accel_port80#告诉web加速器,要监听的端口是80!
httpd_accel_with_proxyon#这个很重要!因为配置httpd_accel_host之后,cache的配置会自动被终止,必须要加上这个配置为on之后,才能提供cache的功能!
httpd_accel_uses_host_headeron
2)如果是squid2.6,则只需要更改squid配置文件中的一个指令:
http_port192.168.63.50:3128transparent#192.168.63.50就是squid服务器的地址
[root@testroot]#squid-kreconfigure
2.配置NAT主机的portmap:
再来让我们到NAT主机上面看看先,因为需要将80这个port交给Proxy的3128来帮忙协助,所以你的防火墙script必须要加入这一段才行:
#iptables-tnat-APREROUTING-ieth0-ptcp-s192.168.62.0/24--dport80-jREDIRECT--to-ports3128
注意一下,那个eth0是『你的NAT对内的网卡』,至于192.168.62.0/24则是你的内部网域,请依照你的主机实际状态来配置!这样一来,您的client端完全不需要进行任何的配置,立刻就可以使用Proxy的好处啰
3.配置转发
#echo1>/proc/sys/net/ipv4/ip_forward
或:
#vi/etc/sysctl.conf
net_ipv4_forword=1
#vi/etc/sysconfig/network
FORWARD_IPV4=yes
#servicenetworkrestart
4.配置客户端
将另外一台计算机作为客户机进行测试,需要将网关、首选DNS服务器指向设置透明代理的服务器,清除客户端的浏览器代理设置。
四.反向代理
返回
代理服务器是使用非常普遍的一种将局域网主机联入互联网的一种方式,使用代理上网可以节约紧缺的IP地址资源,而且可以阻断外部主机对内部主机的访问,使内部网主机免受外部网主机的攻击。但是,如果想让互联网上的主机访问内部网的主机资源(例如:Web站点),又想使内部网主机免受外部网主机攻击,一般的代理服务是不能实现的,需要使用反向代理来实现。
什么是反向代理呢?其实,反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载。典型的结构如下图所示:
Web服务器加速(反向代理)是针对Web服务器提供加速功能的。它作为代理Cache,但并不针对浏览器用户,而针对一台或多台特定Web服务器(这也是反向代理名称的由来)。实施反向代理(如上图所示),只要将ReverseProxyCache设备放置在一台或多台Web服务器前端即可。当互联网用户访问某个WEB服务器时,通过DNS服务器解析后的IP地址是ReverseProxyServer的IP地址,而非原始Web服务器的IP地址,这时ReverseProxyServer设备充当Web服务器,浏览器可以与它连接,无需再直接与Web服务器相连。因此,大量Web服务工作量被卸载到反向代理服务上。不但能够防止外部网主机直接和web服务器直接通信带来的安全隐患,而且能够很大程度上减轻web服务器的负担,提高访问速度。
1.Squid反向代理单个后台WEB服务器
1)如果WEB服务器和反向代理服务器是两台单独的机器(一般的反向代理应该有两块网卡分别连接了内外部网络)。那么,应该修改下面的内容来设置反向代理服务。
http_port80#squid监听的端口
httpd_accel_host172.16.250.250#内部WEB服务器的IP地址
httpd_accel_port80#WEB服务的端口号
httpd_accel_single_hoston#转发没有缓冲的请求到一台单独的机器,squid被设置成仅对单一的web服务器作反向代理
httpd_accel_with_proxyon#如果希望squid既作反向代理服务器又作本地机器的上网代理,需要将此设为on,默认是off
httpd_accel_uses_host_headeroff #在HTTP协议1.1中,HTTP请求包括一个主机头信息,指定URL的主机名或者主机的IP地址。这个选项可以用来完成多个后台WEB服务器的反向代理功能。
2)如果WEB服务器和反向代理服务器是同一台机器。那么,应该设置WEB服务器的监听端口为非80端口(比如:81端口)。要修改的内容如下:
http_port80#squid监听的端口
httpd_accel_hostlocalhost#内部WEB服务器的IP地址
httpd_accel_port81#WEB服务器的端口号
httpd_accel_single_hoston
httpd_accel_with_proxyon
httpd_accel_uses_host_headeroff
2.Squid反向代理多个后台WEB服务器
我们可以用Squid反向代理多个后台WEB服务器。例如:我们可以配置squid同时反向代理www.abc.com,www.xyz.com,www.lmn.com三个后台WEB服务器,示意图如下:
Squid的配置如下:
httpd_accel_hostvirtual
httpd_accel_port80
httpd_accel_single_hostoff
httpd_accel_uses_host_headeron
(注意:编译Squid时需激活InternalDNS选项)
然后设置设置反响代理需要的域名解析(Internet用户通过这里解析三个网站的域名)如下:
www.abc.com202.102.240.74
www.xyz.com202.102.240.74
www.lmn.com202.102.240.74
使三个域名都指向反向代理服务器的IP地址202.102.240.74。
下面设置反向代理所需要的DNS入口信息(即设置内部DNS,仅仅是squid在内部使用,Internet用户不可见)。有两种方法可以设置内部DNS,使用内部DNS服务器来解析或者使用/etc/hosts文件来实现。
使用内部DNS服务器的资源记录如下:
www.abc.comINA192.168.62.2
www.xyz.comINA192.168.62.3
www.lmn.comINA192.168.62.4
如果使用/etc/hosts文件来实现内部DNS(编译时应使用disableinternaldns选项),编辑/etc/hosts文件添加如下条目:
192.168.62.2www.abc.com
192.168.62.3www.xyz.com
192.168.62.4www.lmn.com
结论:通过本文中的论述和相关实例,可以看出,反向代理方式不单是一种WEB服务器加速器,而且使也一种对外提供Web发布时使用的有效的防火墙技术,使用它不但能节约紧缺的IP地址资源,加速WEB服务器的访问速度,而且能够保护WEB主机,因此能够适应多种应用场合。
五.故障处理
返回
1.如果在启动squid时出现下述信息:
%squid-Nd1
FATAL:Couldnotdeterminefullyqualifiedhostname.Pleaseset'visible_hostname'
则需要在squid的配置文件中设置visible_hostname,如:
visible_hostnamesquid.packet-pushers.net
2.如果在配置squid代理后,客户访问出现以下提示:
ERROR
TherequestedURLcouldnotberetrieved
WhiletryingtoretrievetheURL:http://.../
可能需要在squid配置文件中加入以下指令:
always_directallowall
六.一个范例
返回
http_port3128
icp_port0
cache_mem64MB
cache_swap_low80
cache_swap_high85
maximum_object_size32000KB
cache_dirufs/var/spool/squid500641024
cache_access_log/var/log/squid/access.log
cache_log/var/log/squid/cache.log
cache_store_log/var/log/squid/store.log
pid_filename/var/run/squid.pid
aclallsrc0.0.0.0/0.0.0.0
aclalldstdst0.0.0.0/0.0.0.0
aclmanagerprotocache_object
acllocalhostsrc127.0.0.1/255.255.255.255
aclto_localhostdst127.0.0.0/8
acl163url_regex163.com
aclsinaurl_regexsina.com.cn
aclmyclientsrc192.168.6.0/24
http_accessallow163
http_accessallowsina
http_accessdeny!sina
http_accessdeny!163
cache_peer192.168.1.8parent80807no-querydefault
cache_effective_usersquid
cache_effective_groupsquid
coredump_dir/var/spool/squid
七.一个限制访问的范例
返回
http_port3128
icp_port0
cache_mem64MB
cache_swap_low80
cache_swap_high85
maximum_object_size32000KB
cache_dirufs/var/spool/squid500641024
cache_access_log/var/log/squid/access.log
cache_log/var/log/squid/cache.log
cache_store_log/var/log/squid/store.log
pid_filename/var/run/squid.pid
aclallsrc0.0.0.0/0.0.0.0
aclmanagerprotocache_object
acllocalhostsrc127.0.0.1/255.255.255.255
aclto_localhostdst127.0.0.0/8
aclSSL_portsport443563
aclSafe_portsport80#http
aclSafe_portsport21#ftp
aclSafe_portsport443563#https,snews
aclSafe_portsport70#gopher
aclSafe_portsport210#wais
aclSafe_portsport1025-65535#unregisteredports
aclSafe_portsport280#http-mgmt
aclSafe_portsport488#gss-http
aclSafe_portsport591#filemaker
aclSafe_portsport777#multilinghttp
aclCONNECTmethodCONNECT
aclmyclientsrc192.168.6.0/24
acl163url_regex163.com
aclsinaurl_regexsina.com.cn
#Onlyallowcachemgraccessfromlocalhost
http_accessallowmanagerlocalhost
http_accessdenymanager
#Denyrequeststounknownports
http_accessdeny!Safe_ports
#DenyCONNECTtootherthanSSLports
http_accessdenyCONNECT!SSL_ports
cache_peer192.168.1.8parent80807no-querydefault
aclip_aclsrc192.168.6.0/24
acltime_acltimeMTWHFAS9:00-19:00
http_accessallowip_acltime_acl
cache_peer_access192.168.1.8allow163
cache_peer_access192.168.1.8deny!163
cache_peer_access192.168.1.8allowsina
cache_peer_access192.168.1.8deny!sina
cache_effective_usersquid
cache_effective_groupsquid
coredump_dir/var/spool/squid
#aclpl800_arparp00:08:c7:9f:34:41
#http_accessallowpl800_arp